Je cherche quelque chose de similaire à waitForElementPresent
pour vérifier si l'élément est affiché avant de cliquer dessus. Je pensais que cela pouvait être fait avec implicitWait
, alors j'ai utilisé:
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
puis cliquez sur
driver.findElement(By.id(prop.getProperty(vName))).click();
Malheureusement, parfois, il attend l'élément et parfois pas. J'ai cherché pendant un moment et trouvé cette solution:
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();
Et il a bien attendu, mais avant de s’exécuter, il a dû attendre 10 fois 5, 50 secondes. Un peu trop. Donc, je mis l'attente implicite à 1sec et tout semblait bien aller jusqu'à maintenant. Parce que maintenant, certaines choses attendent 10 secondes avant l'expiration du délai, mais d'autres choses expirent après 1s.
Comment couvrez-vous l'attente d'un élément présent/visible dans votre code? Tout indice est appréciable.
Voici comment je le fais dans mon code.
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));
ou
wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));
pour être précis.
Voir également:
Vous pouvez utiliser l'attente explicite ou l'attente courante
Exemple d'attente explicite -
WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20);
WebElement aboutMe;
aboutMe= wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("about_me")));
Exemple d'attente courante -
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"));
}
});
Cochez cette TUTORIAL pour plus de détails.
Nous avons beaucoup de conditions de course avec elementToBeClickable
. Voir https://github.com/angular/protractor/issues/231 . Quelque chose dans ce sens a fonctionné raisonnablement bien même si un peu de force brute
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)
);