Glossar · UI-Automatisierung
Explicit Wait
Englisch: Explicit wait
Auch genannt: Explicit Waits, explizites Warten, expliziter Wait, WebDriverWait
Definition
Ein Wait, der bis zu einem Timeout auf eine bestimmte Bedingung pollt, etwa bis ein Element klickbar ist. In Selenium wird er mit WebDriverWait geschrieben.
Ein Explicit Wait (explizites Warten) hält einen Test an, bis eine bestimmte Bedingung erfüllt ist. Er prüft wiederholt und schlägt mit einem Timeout fehl, wenn die Bedingung nie eintritt. „Explizit“ heißt er, weil Sie ihn genau an der Stelle schreiben, an der der Test warten muss, und angeben, worauf gewartet wird. In Selenium 4 bedeutet das WebDriverWait in Kombination mit einer Bedingung aus ExpectedConditions oder einem Lambda.
Beispiel (Selenium 4, Java)
import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement save = wait.until(
ExpectedConditions.elementToBeClickable(By.id("save")));
save.click();
wait.until(ExpectedConditions.textToBePresentInElementLocated(
By.cssSelector("[role='status']"), "Saved"));
// Any condition can be a lambda that returns a non-null or true value
wait.until(d -> d.findElements(By.cssSelector(".result-row")).size() == 20);
WebDriverWait pollt standardmäßig alle 500 ms und ignoriert dabei NotFoundException. Für ein anderes Intervall oder zusätzliche ignorierte Exceptions verwenden Sie FluentWait (withTimeout, pollingEvery, ignoring).
Unterschied zum Implicit Wait
Ein Implicit Wait ist eine einzelne globale Einstellung, die jeden findElement-Aufruf so lange pollen lässt, bis das Element existiert. Über Sichtbarkeit, Klickbarkeit oder Text weiß er nichts. Ein Explicit Wait zielt auf eine Bedingung an einer Stelle im Test und kann daher genau auf den Zustand warten, den Sie brauchen, etwa bis ein Spinner verschwindet oder ein Button aktiviert ist.
Die Selenium-Dokumentation rät davon ab, beide zu mischen, weil kombinierte Timeouts zu unvorhersehbaren Wartezeiten führen können. Die meisten Teams setzen den Implicit Wait auf null und verwenden überall Explicit Waits.
Häufige Fehler
Thread.sleepstatt eines Waits. Ein fester Sleep ist je nach Maschine entweder zu kurz (flaky) oder zu lang (langsam) – meist beides.- Auf Präsenz warten, wenn Sichtbarkeit gebraucht wird.
presenceOfElementLocatedist erfüllt, sobald der Knoten im DOM ist, auch wenn er verborgen ist. - Ein
WebElementüber ein Re-Rendering hinweg festhalten. Warten Sie auf einenBy-Locator, damit das Element nach der DOM-Änderung neu gefunden wird. - In jedem Helper einen neuen Wait mit riesigem Timeout erzeugen. Zentralisieren Sie einen sinnvollen Standardwert in Ihrem Framework.