J'essaie de faire en sorte que Selenium attend un élément ajouté dynamiquement au DOM après le chargement de la page. J'ai essayé ceci:
fluentWait.until(ExpectedConditions.presenceOfElement(By.id("elementId"));
Si cela peut aider, voici fluentWait
:
FluentWait fluentWait = new FluentWait<>(webDriver) {
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(200, TimeUnit.MILLISECONDS);
}
Mais cela jette une NoSuchElementException
- on dirait que presenceOfElement
s'attend à ce que l'élément soit là, donc c'est défectueux. Cela doit être du pain au beurre pour Selenium et vous ne voulez pas réinventer la roue ... quelqu'un pourrait-il suggérer une alternative, idéalement sans lancer ma propre Predicate
?
Vous devez appeler ignoring
avec exception à ignorer pendant que WebDriver
attendra.
FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(200, TimeUnit.MILLISECONDS)
.ignoring(NoSuchElementException.class);
Voir la documentation de FluentWait pour plus d’informations. Mais sachez que cette condition est déjà implémentée dans ExpectedConditions vous devez donc utiliser
WebElement element = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
Vous trouverez le didacticiel d’attente de base ici .
WebDriverWait wait = new WebDriverWait(driver,5)
wait.until(ExpectedConditions.visibilityOf(element));
vous pouvez l'utiliser comme un certain temps avant que le chargement du code de la page entière soit exécuté, ainsi que des erreurs. le temps est en seconde
Laissez-moi vous recommander d’utiliser Selenide library. Il permet d’écrire des tests beaucoup plus concis et lisibles. Il peut attendre la présence d'éléments avec une syntaxe beaucoup plus courte:
$("#elementId").shouldBe(visible);
Voici un exemple de projet pour tester la recherche Google: https://github.com/selenide-examples/google
FluentWait lève une exception NoSuchElementException en cas de confusion
org.openqa.Selenium.NoSuchElementException;
avec
Java.util.NoSuchElementException
dans
.ignoring(NoSuchElementException.class)
public WebElement fluientWaitforElement(WebElement element, int timoutSec, int pollingSec) {
FluentWait<WebDriver> fWait = new FluentWait<WebDriver>(driver).withTimeout(timoutSec, TimeUnit.SECONDS)
.pollingEvery(pollingSec, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class, TimeoutException.class).ignoring(StaleElementReferenceException.class);
for (int i = 0; i < 2; i++) {
try {
//fWait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id='reportmanager-wrapper']/div[1]/div[2]/ul/li/span[3]/i[@data-original--title='We are processing through trillions of data events, this insight may take more than 15 minutes to complete.']")));
fWait.until(ExpectedConditions.visibilityOf(element));
fWait.until(ExpectedConditions.elementToBeClickable(element));
} catch (Exception e) {
System.out.println("Element Not found trying again - " + element.toString().substring(70));
e.printStackTrace();
}
}
return element;
}