Equivalente de waitForVisible / waitForElementPresent en las pruebas Selenium WebDriver usando Java?

Con las pruebas de Selenio “HTML” (creadas con Selenium IDE o manualmente), puede usar algunos comandos muy útiles como WaitForElementPresent o WaitForVisible .

  waitForElementPresent id=saveButton   

Al codificar las pruebas de Selenium en Java (Webdriver / Selenium RC -no estoy seguro de la terminología aquí), ¿hay algo similar incorporado ?

Por ejemplo, para verificar que un diálogo (que lleva un tiempo abrir) es visible …

 WebElement dialog = driver.findElement(By.id("reportDialog")); assertTrue(dialog.isDisplayed()); // often fails as it isn't visible *yet* 

¿Cuál es la forma más limpia y robusta de codificar tal verificación?

Agregar llamadas Thread.sleep() todos lados sería feo y frágil, y enrollar el suyo propio mientras que los bucles también parecen bastante torpes …

Esperas implícitas y explícitas

Espera implícita

Una espera implícita es decirle a WebDriver que sondee el DOM durante un cierto período de tiempo cuando intente encontrar un elemento o elementos si no están disponibles de inmediato. La configuración predeterminada es 0. Una vez configurado, la espera implícita se establece para la vida de la instancia del objeto WebDriver.

 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 

Espera explícita + condiciones esperadas

Una espera explícita es un código que define para esperar a que se produzca una determinada condición antes de seguir adelante en el código. El peor caso de esto es Thread.sleep (), que establece la condición en un período de tiempo exacto para esperar. Se proporcionan algunos métodos de conveniencia que lo ayudan a escribir código que esperará solo el tiempo que sea necesario. WebDriverWait en combinación con ExpectedCondition es una forma de lograrlo.

 WebDriverWait wait = new WebDriverWait(driver, 10); WebElement element = wait.until( ExpectedConditions.visibilityOfElementLocated(By.id("someid"))); 
 WebElement myDynamicElement = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement"))); 

Esto espera hasta 10 segundos antes de lanzar una TimeoutException o si encuentra que el elemento la devolverá en 0 – 10 segundos. WebDriverWait llama por defecto a ExpectedCondition cada 500 milisegundos hasta que vuelva a funcionar correctamente. Un retorno exitoso es para el tipo ExpectedCondition es booleano return true o no es un valor de retorno nulo para todos los demás tipos de ExpectedCondition.


 WebDriverWait wait = new WebDriverWait(driver, 10); WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid"))); 

El elemento puede hacer clic: se muestra y habilitado.

De los documentos de WebDriver: Esperas explícitas e implícitas

Bueno, la cuestión es que probablemente no quieras que la prueba se ejecute indefinidamente. Solo quiere esperar un tiempo más largo antes de que la biblioteca decida que el elemento no existe. En ese caso, la solución más elegante es usar espera implícita, que está diseñada para eso:

 driver.manage().timeouts().implicitlyWait( ... ) 

Para el elemento individual, se puede usar el siguiente código:

 private boolean isElementPresent(By by) { try { driver.findElement(by); return true; } catch (NoSuchElementException e) { return false; } } for (int second = 0;; second++) { if (second >= 60){ fail("timeout"); } try { if (isElementPresent(By.id("someid"))){ break; } } catch (Exception e) { } Thread.sleep(1000); }