Implizites und explizites Warten in Selenium

Inhaltsübersicht
Warum sind in Selenium Wartezeiten erforderlich?
Bei der UI-Automatisierung sind Wartezeiten erforderlich, weil einige Elemente asynchron auf die Seite geladen werden, so dass nach dem Auslösen eines Ereignisses die Seite zwar erfolgreich geladen wird, aber einige Elemente noch nicht geladen sind.
Dies führt zu einer elementNotFound-Ausnahme bei der Suche nach einem Element. In solchen Fällen bleibt uns nur die Verwendung von Thread.sleep(), t. j. Statisches Warten, das die Ausführung des Tests für eine bestimmte Zeit anhält und dann den nächsten Schritt ausführt.
Da Thread.sleep() die angegebene Zeit abwartet, unabhängig davon, ob die Elemente vor dieser Zeit angezeigt werden. Daher wird die Verwendung von Thread.sleep() bei der Automatisierung der Benutzeroberfläche nicht empfohlen.
Um dies zu vermeiden, bietet Selenium verschiedene Arten von Waits, von denen Implicit und Explicit Waits am häufigsten verwendet werden.
Implizites Warten
Die Standard-Wartezeit wird auf die WebDriver-Instanz gesetzt, wenn sie verwendet wird, und wird auf alle Web-Elemente angewendet. Beim impliziten Warten fragt der Webdriver das DOM ab, um zu prüfen, ob das Webelement verfügbar ist, und wartet bis zur maximal angegebenen Zeit, bevor er eine NoSuchElementException-Ausnahme auslöst.
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
Im obigen Codeschnipsel ist der in der impliziten wait-Methode angegebene Wert 20 die maximale Zeit in Sekunden, die der WebDriver wartet, bevor er bei der Suche nach einem WebElement eine NoSuchElementException-Ausnahme auslöst.
Explizites Warten
Im Gegensatz zum impliziten Warten wird das explizite Warten auf jedes Webelement angewendet. Explizites Warten definiert bestimmte Bedingungen, unter denen eine WebDriver-Instanz wartet, bevor sie Web-Elemente abruft oder Aktionen auf ihnen ausführt. Einige der häufigsten Bedingungen, die bei explizitem Warten angegeben werden, sind: elementToBeClickable, presenceOfElementLocated, etc.
WebDriverWait wait = new WebDriverWait(driver, 15);
wait.until(ExpectedConditions.presenceOfElementLocated(ElementLocator));
Hier wartet die WebDriver-Instanz, bis die angegebene Bedingung erfüllt ist, d.h. j. das Vorhandensein eines von ElementLocator lokalisierten Elements mit einer maximalen Wartezeit von 15 Sekunden, nach der, wenn die Bedingung immer noch nicht erfüllt ist, eine Ausnahme geworfen wird.