Pruebe si un elemento está presente usando Selenium WebDriver

8 minutos de lectura

avatar de usuario del probador
ensayador

¿Hay alguna forma de comprobar si un elemento está presente? Ningún encontrarElemento El método terminaría en una excepción, pero eso no es lo que quiero, porque puede ser que un elemento no esté presente y eso está bien. Eso no es un fracaso de la prueba, por lo que una excepción no puede ser la solución.

He encontrado esta publicación: Selenium C# WebDriver: espere hasta que el elemento esté presente.

Pero esto es para C#, y no soy muy bueno en eso. ¿Cuál sería el código en Java? lo probé en Eclipsepero no lo entendí bien en código Java.

Este es el código:

public static class WebDriverExtensions{
    public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds){

        if (timeoutInSeconds > 0){
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
            return wait.Until(drv => drv.FindElement(by));
        }

        return driver.FindElement(by);
    }
}

  • Tengo un par de métodos que funcionan de manera muy efectiva para buscar un objeto, pero depende de lo que quieras hacer con él. por ejemplo, ¿quieres buscar el elemento hasta que exista, quieres buscarlo hasta que ya no exista o simplemente quieres intentar encontrarlo?

    – CBR Racer

    3 de noviembre de 2011 a las 17:10


  • Java es muy similar a C#. Creo que uno de los principales problemas con los que te encuentras aquí es en Java, es WebElement en lugar de IWebElement.

    – CBR Racer

    3 de noviembre de 2011 a las 17:12

  • ¿Conoces el método de espera implícito? Al configurar esto al comienzo de la prueba, nunca tendrá que verificar la existencia de un elemento, ya que utiliza el valor de espera implícito para sondear; sin embargo, si excede ese valor, generará una excepción.

    –Bob Evans

    3 de noviembre de 2011 a las 18:56

  • Aquí está mi publicación sobre WebDriverWait en Java: WebDriverWait

    usuario1047795

    15 de noviembre de 2011 a las 14:36

  • Si cualquiera de los casos está bien, esto puede ser problemático para el rendimiento de la prueba, ya que el tiempo de espera asociado a la espera de un elemento que no espera que exista realmente se suma. He usado algunos trucos para sortear el tiempo de espera, pero todavía tengo que encontrar una solución verdaderamente limpia para esto.

    – señor libre

    3 de noviembre de 2014 a las 22:26

avatar de usuario de el roso
el rosa

Usar findElements en vez de findElement.

findElements devolverá una lista vacía si no se encuentran elementos coincidentes en lugar de una excepción.

Para verificar que un elemento está presente, puede probar esto

Boolean isPresent = driver.findElements(By.yourLocator).size() > 0

Esto devolverá verdadero si se encuentra al menos un elemento y falso si no existe.

la documentación oficial recomienda este método:

findElement no debe usarse para buscar elementos no presentes, use findElements (By) y afirme una respuesta de longitud cero en su lugar.

  • Esto agregará mucho tiempo para ejecutar sus pruebas. No puedes usar esta técnica en todas partes.

    – yurisich

    25 de octubre de 2012 a las 15:13

  • @Droogans: no agregaré tiempo a sus pruebas. La razón por la que no lo hará es porque la espera implícita predeterminada sigue siendo 0. Si aumentó la espera implícita predeterminada, entonces estoy de acuerdo en que lo haría, pero no parece ser el caso aquí.

    – djangofan

    14/01/2015 a las 18:56

  • Buena llamada djangofan! Utilicé con éxito esta estrategia al cambiar la espera implícita de los tiempos de espera del controlador a cero y luego volver a cambiarla a su valor anterior.

    – esmeril

    27 mayo 2015 a las 17:18


  • Esto dio una excepción NoSuchElementFound, lo cual es una pena, ya que esperaba usar esto para evitar detectar esa excepción en una instancia determinada.

    usuario3864935

    4 de agosto de 2015 a las 8:54

  • Una forma mucho más fácil es usar: if(driver.getPageSource().contains(“Un texto en la página”)){} Si la página contiene este texto, entonces la condición será verdadera, o de lo contrario será falsa y puede codificar respectivamente.

    – pradyot

    20 de noviembre de 2018 a las 10:01

Avatar de usuario de Dennis
dennis

Use un método privado que simplemente busque el elemento y determine si está presente de esta manera:

private boolean existsElement(String id) {
    try {
        driver.findElement(By.id(id));
    } catch (NoSuchElementException e) {
        return false;
    }
    return true;
}

Esto sería bastante fácil y hace el trabajo.

Incluso podrías ir más allá y tomar un By elementLocator como parámetro, eliminando problemas si desea encontrar el elemento por algo que no sea una identificación.

  • Sí, este es el camino a seguir. No entiendo por qué las personas ignoran de esta manera y cuentan los elementos coincidentes para ver si el resultado es 0.

    –Ralph Lavelle

    14 de agosto de 2014 a las 5:54

  • Bueno, debo decir que usar Excepciones para regular el flujo del programa no es la mejor manera de hacerlo.

    -Dennis

    14 de agosto de 2014 a las 11:13


  • ¿Eh? ¡Fue tu sugerencia! Es un buen camino a seguir si su prueba espera no encontrar el elemento. Como muestra, simplemente devuelva nulo y asevere. es nulo o no es nulo, que es una forma significativa de probar si algo existe.

    –Ralph Lavelle

    14/08/2014 a las 22:56

  • En caso de que malinterprete la pregunta “¿hay alguna forma de probar si un elemento está presente?” incorrecto, me complacerá saber por qué su opinión difiere sobre si esta es o no una respuesta legítima.

    -Dennis

    12/01/2015 a las 20:32

  • podría querer reducir el tiempo de espera. En este momento, si el elemento no existe, debe esperar “30 segundos” antes de que la función devuelva falso

    – Jason Smiley

    5 oct 2015 a las 19:06

Avatar de usuario de Tango Ben
ben tango

Descubrí que esto funciona para Java:

WebDriverWait waiter = new WebDriverWait(driver, 5000);
waiter.until( ExpectedConditions.presenceOfElementLocated(by) );
driver.FindElement(by);

  • presenceOfElementLocated lanzará una excepción si el elemento no se encuentra en ningún intento en particular. Para evitar esto, agregue un wait.ignoring(NoSuchElementException.class); declaración entre la primera y la segunda línea.

    – Steve Cámaras

    22 de enero de 2014 a las 14:03

public static WebElement FindElement(WebDriver driver, By by, int timeoutInSeconds)
{
    WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds);
    wait.until( ExpectedConditions.presenceOfElementLocated(by) ); //throws a timeout exception if element not present after waiting <timeoutInSeconds> seconds
    return driver.findElement(by);
}

Avatar de usuario de Tasha
Tasha

Tuve el mismo problema. Para mí, según el nivel de permiso del usuario, algunos enlaces, botones y otros elementos no se mostrarán en la página. Parte de mi suite fue probar que los elementos que debería faltar, faltan. Pasé horas tratando de resolver esto. Finalmente encontré la solución perfecta.

Le dice al navegador que busque todos y cada uno de los elementos especificados. si da como resultado 0, eso significa que no se encontraron elementos basados ​​en la especificación. Luego hago que el código ejecute una declaración *if para avisarme que no se encontró.

Esto es en C#por lo que sería necesario realizar traducciones para Java. Pero no debería ser demasiado difícil.

public void verifyPermission(string link)
{
    IList<IWebElement> adminPermissions = driver.FindElements(By.CssSelector(link));
    if (adminPermissions.Count == 0)
    {
        Console.WriteLine("User's permission properly hidden");
    }
}

También hay otro camino que puede tomar dependiendo de lo que necesite para su prueba.

El siguiente fragmento está comprobando si existe un elemento muy específico en la página. Dependiendo de la existencia del elemento, hago que la prueba ejecute un if else.

Si el elemento existe y se muestra en la página, tengo console.write házmelo saber y sigue adelante. Si el elemento en cuestión existe, no puedo ejecutar la prueba que necesitaba, que es el motivo principal detrás de la necesidad de configurar esto.

Si el elemento no es existe y no se muestra en la página, tengo el else en el if else ejecuta la prueba.

IList<IWebElement> deviceNotFound = driver.FindElements(By.CssSelector("CSS LINK GOES HERE"));
// If the element specified above results in more than 0 elements and is displayed on page execute the following, otherwise execute what’s in the else statement
if (deviceNotFound.Count > 0 && deviceNotFound[0].Displayed){
    // Script to execute if element is found
} else {
    // Test script goes here.
}

Sé que llego un poco tarde a la respuesta al OP. ¡Ojalá esto ayude a alguien!

Avatar de usuario de Peter Mortensen
Pedro Mortensen

Prueba esto:

Llame a este método y pase tres argumentos:

  1. Variable WebDriver. Asumiendo controlador_variable como el conductor
  2. El elemento que vas a comprobar. Debería proporcionar un de Por método. Ejemplo: Por.id(“id”)
  3. Límite de tiempo en segundos.

Ejemplo: waitForElementPresent(driver, By.id(“id”), 10);

public static WebElement waitForElementPresent(WebDriver driver, final By by, int timeOutInSeconds) {

    WebElement element;

    try{
        driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); // Nullify implicitlyWait()

        WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
        element = wait.until(ExpectedConditions.presenceOfElementLocated(by));

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); // Reset implicitlyWait
        return element; // Return the element

    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

Avatar de usuario de Peter Mortensen
Pedro Mortensen

Esto funciona para mí:

if(!driver.findElements(By.xpath("//*[@id='submit']")).isEmpty()){
    // Then click on the submit button
}
else{
    // Do something else as submit button is not there
}

  • el mismo problema existe aquí: ¿qué pasa si el elemento “//*[@id=’submit’]” no existe? Entonces se lanzará una excepción, por lo que el condicional if nunca se evalúa

    – Bryan_C

    14 de agosto de 2017 a las 18:54

¿Ha sido útil esta solución?