Ich versuche, Selenium auf ein Element warten zu lassen, das nach dem Laden der Seite dynamisch zum DOM hinzugefügt wird. Versuchte das:
fluentWait.until(ExpectedConditions.presenceOfElement(By.id("elementId"));
Falls es hilft, hier ist fluentWait
:
FluentWait fluentWait = new FluentWait<>(webDriver) {
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(200, TimeUnit.MILLISECONDS);
}
Aber es wirft ein NoSuchElementException
- Sieht so aus, als würde presenceOfElement
erwarten, dass das Element da ist, also ist dieses fehlerhaft. Dies muss Brot und Butter für Selen sein und möchte das Rad nicht neu erfinden ... könnte jemand eine Alternative vorschlagen, im Idealfall ohne mein eigenes Predicate
zu rollen?
Sie müssen ignoring
mit einer Ausnahme aufrufen, um sie zu ignorieren, während die WebDriver
wartet.
FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(200, TimeUnit.MILLISECONDS)
.ignoring(NoSuchElementException.class);
Weitere Informationen finden Sie in der Dokumentation zu FluentWait . Beachten Sie jedoch, dass diese Bedingung bereits in ExpectedConditions implementiert ist. Sie sollten sie also verwenden
WebElement element = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
Grundlegendes Tutorial zum Warten finden Sie hier .
WebDriverWait wait = new WebDriverWait(driver,5)
wait.until(ExpectedConditions.visibilityOf(element));
sie können dies verwenden, bevor der gesamte Seitencode geladen wird und Würfe und Fehler ausgegeben werden. Zeit ist in Sekunden
Lassen Sie mich Ihnen die Verwendung von Selenide library empfehlen. Ermöglicht das Schreiben viel genauer und lesbarer Tests. Es kann auf das Vorhandensein von Elementen mit viel kürzerer Syntax warten:
$("#elementId").shouldBe(visible);
Hier ein Beispielprojekt zum Testen der Google-Suche: https://github.com/selenide-examples/google
FluentWait wirft eine NoSuchElementException im Falle der Verwirrung
org.openqa.Selenium.NoSuchElementException;
mit
Java.util.NoSuchElementException
im
.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;
}