timeouts - WebDriver: espera el elemento con Java
wait until selenium java (4)
Estoy buscando algo similar a waitForElementPresent
para comprobar si el elemento se muestra antes de hacer clic en él. Pensé que esto se podía hacer con implicitWait
, así que usé lo siguiente:
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
y luego haga clic
driver.findElement(By.id(prop.getProperty(vName))).click();
Desafortunadamente, a veces espera el elemento y a veces no. Miré por un rato y encontré esta solución:
for (int second = 0;; second++) {
Thread.sleep(sleepTime);
if (second >= 10)
fail("timeout : " + vName);
try {
if (driver.findElement(By.id(prop.getProperty(vName)))
.isDisplayed())
break;
} catch (Exception e) {
writeToExcel("data.xls", e.toString(),
parameters.currentTestRow, 46);
}
}
driver.findElement(By.id(prop.getProperty(vName))).click();
Y esperó bien, pero antes de que se agotara el tiempo, tuvo que esperar 10 veces 5, 50 segundos. Demasiado. Así que configuré implícitamente wait to 1sec y todo parecía estar bien hasta ahora. Porque ahora algunas cosas esperan 10 segundos antes del tiempo de espera, pero algunas otras cosas se agotan después de 1s.
¿Cómo cubren la espera del elemento presente / visible en su código? Cualquier pista es apreciable.
Así es como lo hago en mi código.
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));
o
wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));
para ser preciso.
Ver también:
- org.openqa.selenium.support.ui.ExpectedConditions para atajos similares para varios escenarios de espera.
- org.openqa.selenium.support.ui.WebDriverWait para sus diversos constructores.
Estamos teniendo muchas condiciones de carrera con elementToBeClickable
. Ver https://github.com/angular/protractor/issues/2313 . Algo a lo largo de estas líneas funcionó razonablemente bien, incluso si un poco de fuerza bruta
Awaitility.await()
.atMost(timeout)
.ignoreException(NoSuchElementException.class)
.ignoreExceptionsMatching(
Matchers.allOf(
Matchers.instanceOf(WebDriverException.class),
Matchers.hasProperty(
"message",
Matchers.containsString("is not clickable at point")
)
)
).until(
() -> {
this.driver.findElement(locator).click();
return true;
},
Matchers.is(true)
);
La instrucción de espera anterior es un buen ejemplo de espera explícita.
Como espera explícita son esperas inteligentes que están confinadas a un elemento web particular (como se menciona en la ruta x anterior).
Mediante el uso de esperas explícitas, básicamente le está diciendo a WebDriver al máximo que debe esperar X unidades (lo que haya dado como timeoutInSeconds) de tiempo antes de que se rinda.
Puede usar Espera explícita o Esperar con fluidez
Ejemplo de espera explícita -
WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20);
WebElement aboutMe;
aboutMe= wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("about_me")));
Ejemplo de espera fluida
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(20, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
WebElement aboutMe= wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("about_me"));
}
});
Consulte este TUTORIAL para más detalles.