Wie lässt man Selen warten, bis ein Element vorhanden ist?
Lesezeit: 3 Minuten
Steve Kammern
Ich versuche, Selen dazu zu bringen, auf ein Element zu warten, das nach dem Laden der Seite dynamisch zum DOM hinzugefügt wird. Ich habe das versucht:
Aber es wirft ein NoSuchElementException. Es sieht aus wie presenceOfElement erwartet, dass das Element vorhanden ist, also ist dies fehlerhaft. Dies muss Brot und Butter für Selen sein, und ich möchte das Rad nicht neu erfinden … Gibt es eine Alternative, idealerweise ohne mein eigenes zu rollen? Predicate?
Peter Mensik
Sie müssen anrufen ignoring mit einer Ausnahme zu ignorieren, während die WebDriver Ich werde warten.
FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(200, TimeUnit.MILLISECONDS)
.ignoring(NoSuchElementException.class);
Siehe die Dokumentation von FließendWarte für mehr Informationen. Beachten Sie jedoch, dass diese Bedingung bereits implementiert ist Erwartete Bedingungenalso solltest du verwenden:
WebElement element = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
withTimeout(long, TimeUnit) has become withTimeout(Duration)
pollingEvery(long, TimeUnit) has become pollingEvery(Duration)
Der Code sieht also so aus:
FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(30)
.pollingEvery(Duration.ofMillis(200)
.ignoring(NoSuchElementException.class);
Eine grundlegende Anleitung zum Warten finden Sie hier hier.
entweder sollte es sein oder es sollte <> sein, wenn Sie Java 8 verwenden würde Ihnen einen Kompilierungsfehler geben.
– Schek
5. Mai 2017 um 3:44 Uhr
Es ist NICHT in ExpectedCondition implementiert … es ist in WebDriverWait. public WebDriverWait (WebDriver-Treiber, Uhr, Schläfer, langes timeOutInSeconds, langes sleepTimeOut) { super (Treiber, Uhr, Schläfer); this.withTimeout (timeOutInSeconds, TimeUnit.SECONDS); this.pollingEvery(sleepTimeOut, TimeUnit.MILLISECONDS); this.ignoring (NotFoundException.class); this.driver = Fahrer; }
– Sugat Mankar
17. Juni 2017 um 3:57 Uhr
bhupendra
Verwenden:
WebDriverWait wait = new WebDriverWait(driver, 5)
wait.until(ExpectedConditions.visibilityOf(element));
Sie können dies verwenden, da einige Zeit vor dem Laden der gesamten Seite der Code ausgeführt wird und einen Fehler auslöst. Die Zeit wird in Sekunden angegeben.
Lassen Sie mich Ihnen die Verwendung empfehlen Selenid Bibliothek. Es ermöglicht das Schreiben von viel prägnanteren und lesbareren Tests. Es kann auf das Vorhandensein von Elementen mit viel kürzerer Syntax warten:
Es ist nach Python portiert. Siehe „Selene“-Python-Bibliothek.
– Andrei Solntsev
21. Februar 2017 um 21:42 Uhr
FluentWait löst im Falle der Verwirrung eine NoSuchElementException aus
org.openqa.selenium.NoSuchElementException;
mit
java.util.NoSuchElementException
in
.ignoring(NoSuchElementException.class)
Ashwini
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;
}
14363700cookie-checkWie lässt man Selen warten, bis ein Element vorhanden ist?yes