Implizites und explizites Warten in Selenium mit Syntax

โšก Intelligente Zusammenfassung

Selenium Wartebefehle synchronisieren Automatisierungsskripte mit dem dynamischen Seitenverhalten und verhindern so Testfehler aufgrund asynchron geladener Elemente. Diese Referenz erlรคutert die Strategien โ€žImplizites Wartenโ€œ, โ€žExplizites Wartenโ€œ und โ€žFluent Waitโ€œ anhand der WebDriver-Syntax. Java Codebeispiele und praktische Hinweise zur Auswahl der geeigneten Wartezeit fรผr eine stabile und zuverlรคssige Testausfรผhrung.

  • โš™๏ธ Foundational Prinzip: Implizites Warten sollte global angewendet werden, damit der WebDriver fรผr eine definierte Dauer pausiert, bevor eine NoSuchElementException ausgelรถst wird.
  • ๐ŸŽฏ Schwerpunkt der Umsetzung: Verwenden Sie Explicit Wait mit ExpectedConditions, um Elemente anzusprechen, die von Ajax oder dynamischen Sichtbarkeitszustรคnden abhรคngen.
  • ๐Ÿ” Fortgeschrittene Technik: Konfigurieren Sie Fluent Wait mit Abfrageintervallen, um Elemente zu verarbeiten, die zu unvorhersehbaren Zeitpunkten geladen werden.
  • โšก Optimierungsstrategie: Ersetzen Sie Thread.sleep durch bedingte Wartezeiten, um die Ausfรผhrungszeit zu verkรผrzen und fehleranfรคllige Verzรถgerungen zu vermeiden.
  • โœ… Auswirkungen auf die Qualitรคt: Durch die direkte Auswahl der richtigen Wartezeit werden unvorhersehbare Fehler reduziert und die Stabilitรคt von Skripten in verschiedenen Umgebungen verbessert.

Selenium Warten โ€“ implizit und explizit mit Syntax

In Seleniumโ€žWartebefehleโ€œ spielen eine wichtige Rolle bei der Durchfรผhrung zuverlรคssiger Tests. In diesem Tutorial lernen Sie die wichtigsten Aspekte und Unterschiede zwischen impliziten und expliziten Wartebefehlen kennen. Selenium, zusammen mit praktischen Hinweisen zur Verwendung von Fluent Wait.

Warum brauchen wir Wartezeiten? Selenium?

Die meisten modernen Webanwendungen werden entwickelt mit Ajax und JavaSkriptWenn eine Seite vom Browser geladen wird, kรถnnen die Elemente, mit denen wir interagieren mรถchten, in unterschiedlichen Zeitabstรคnden geladen werden.

Dies erschwert nicht nur die Identifizierung des Elements, sondern fรผhrt auch dazu, dass, wenn das Element nicht rechtzeitig lokalisiert wird, Selenium wird ein werfen ElementNotVisibleException. Selenium Durch Wartezeiten wird dieses Synchronisierungsproblem gelรถst, indem dem WebDriver ein definiertes Zeitfenster zur Verfรผgung gestellt wird, in dem er ein Element finden kann, bevor ein Fehler auftritt.

Betrachten wir ein Szenario, in dem implizite und explizite Wartezeiten im selben Test verwendet werden. Angenommen, die implizite Wartezeit ist auf 20 Sekunden und die explizite Wartezeit auf 10 Sekunden festgelegt.

Wenn wir nach einem Element suchen, das bestimmten Gesetzen unterliegt Erwartete Bedingungen (Explizites Warten) und sich das Element nicht innerhalb des expliziten Zeitfensters von 10 Sekunden befindet, greift der WebDriver auf das implizite Zeitfenster von 20 Sekunden zurรผck, bevor er eine Ausnahme auslรถst. ElementNotVisibleException.

Selenium WebDriver wartet

  1. Implizites Warten
  2. Explizites Warten
  3. FlieรŸend warten

Implizites Warten Selenium

Das Implizites Warten Selenium Weist den WebDriver an, eine definierte Zeitspanne abzuwarten, bevor eine NoSuchElementException ausgelรถst wird. Der Standardwert ist 0. Nach der Konfiguration prรผft der WebDriver das DOM wรคhrend dieser Zeitspanne, bevor er einen Fehler ausgibt. Selenium WebDriver hat das Konzept der impliziten Wartezeiten von Watir.

Im folgenden Beispiel deklarieren wir eine implizite Wartezeit von 10 Sekunden. Befindet sich das Element nicht innerhalb dieses Zeitfensters, wird eine Ausnahme ausgelรถst.

Implizite Wartesyntax (Selenium 4):

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
package guru.test99;
import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;

public class AppTest {

    protected WebDriver driver;

    @Test
    public void guru99tutorials() throws InterruptedException {
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        String eTitle = "Demo Guru99 Page";
        String aTitle = "";
        // launch Chrome and redirect it to the Base URL
        driver.get("https://demo.guru99.com/test/guru99home/");
        // Maximize the browser window
        driver.manage().window().maximize();
        // get the actual value of the title
        aTitle = driver.getTitle();
        // compare the actual title with the expected title
        if (aTitle.equals(eTitle)) {
            System.out.println("Test Passed");
        } else {
            System.out.println("Test Failed");
        }
        // close browser
        driver.close();
    }
}

Erklรคrung von Code

Betrachten Sie im obigen Beispiel die folgende Aussage:

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

Selenium Version 4 ersetzte die รคltere Signatur mit zwei Argumenten (Ganzzahl plus Zeiteinheit) durch ein einzelnes Duration-Argument. Die Duration-Klasse unterstรผtzt Sekunden, Minuten, Millisekunden und andere Zeiteinheiten durch statische Hilfsmethoden wie Duration.ofSeconds, Duration.ofMillis und Duration.ofMinutes.

Explizites Warten Selenium

Das Explizites Warten Selenium Weist den WebDriver an, auf bestimmte Bedingungen (Erwartete Bedingungen) oder eine maximale Dauer zu warten, bevor eine ElementNotVisibleException ausgelรถst wird. Diese Wartezeit ist effizienter, da sie sich nur auf das angegebene Element bezieht. Explizites Warten ist implizitem Warten vorzuziehen, wenn der Test dynamisch geladene Ajax-Inhalte verarbeiten muss.

Sobald eine explizite Wartezeit deklariert wurde, mรผssen Sie verwenden Erwartete BedingungenAlternativ kรถnnen Sie die Abfragehรคufigkeit konfigurieren mit FlieรŸend warten. Vermeide das Benutzen Thread.sleep()Da dies die Ausfรผhrung bedingungslos unterbricht und allgemein als schlechte Praxis gilt.

Im folgenden Beispiel erstellen wir eine Referenz auf die WebDriverWarten Klasse, instanziieren Sie sie mit der WebTreiber Referenz und konfigurieren Sie ein maximales Fenster von 20 Sekunden.

Explizite Wartesyntax (Selenium 4):

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));
package guru.test99;

import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;

public class AppTest2 {
    protected WebDriver driver;

    @Test
    public void guru99tutorials() throws InterruptedException {
        driver = new ChromeDriver();
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));
        String eTitle = "Demo Guru99 Page";
        String aTitle = "";
        // launch Chrome and redirect it to the Base URL
        driver.get("https://demo.guru99.com/test/guru99home/");
        // Maximize the browser window
        driver.manage().window().maximize();
        // get the actual value of the title
        aTitle = driver.getTitle();
        // compare the actual title with the expected title
        if (aTitle.contentEquals(eTitle)) {
            System.out.println("Test Passed");
        } else {
            System.out.println("Test Failed");
        }
        WebElement guru99seleniumlink;
        guru99seleniumlink = wait.until(ExpectedConditions.visibilityOfElementLocated(
            By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));
        guru99seleniumlink.click();
    }
}

Erklรคrung von Code

Betrachten Sie den folgenden Code:

WebElement guru99seleniumlink;
guru99seleniumlink = wait.until(ExpectedConditions.visibilityOfElementLocated(
    By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));
guru99seleniumlink.click();

In diesem WebDriverWait-Beispiel wartet das Skript bis zu 20 Sekunden, wie durch die WebDriverWarten Klasse, bis die Erwartete Bedingungen sind erfรผllt โ€“ je nachdem, welches Ereignis zuerst eintritt.

Die obige Java Der Code wartet bis zu 20 Sekunden auf die Bedingung. Sichtbarkeit des gefundenen Elements um wahr zu sein.

Folgende erwartete Bedingungen kรถnnen verwendet werden in Selenium Explizites Warten:

  1. alarmIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. frameToBeAvailableAndSwitchToIt()
  6. invisibilityOfTheElementLocated()
  7. invisibilityOfElementWithText()
  8. presentOfAllElementsLocatedBy()
  9. presentOfElementLocated()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. titleIs()
  14. titleContains()
  15. SichtbarkeitOf()
  16. VisibilityOfAllElements()
  17. VisibilityOfAllElementsLocationBy()
  18. sichtbarkeitOfElementLocated()

FlieรŸend warten Selenium

Das FlieรŸend warten Selenium Definiert die maximale Wartezeit des WebDrivers auf eine Bedingung sowie die Abfragehรคufigkeit zur รœberprรผfung dieser Bedingung, bevor eine ElementNotVisibleException ausgelรถst wird. Fluent Wait prรผft in regelmรครŸigen Abstรคnden, ob das Element gefunden wurde oder das Timeout abgelaufen ist.

Frequenz: Der Wiederholungszyklus zur Beurteilung des Zustands in regelmรครŸigen Abstรคnden.

Stellen Sie sich ein Szenario vor, in dem ein Element in unvorhersehbaren Abstรคnden geladen wird. Das Laden kann beispielsweise 10 Sekunden, 20 Sekunden oder lรคnger dauern. Wenn wir eine explizite Wartezeit von 20 Sekunden festlegen, wartet das Skript die gesamte Dauer ab, bevor es einen Fehler ausgibt. In solchen Fรคllen ist Fluent Wait die ideale Wahl, da es in der angegebenen Frequenz abfragt, bis das Element gefunden wurde oder der Timer abgelaufen ist.

Fluent Wait Syntax (Selenium 4):

Wait<WebDriver> wait = new FluentWait<>(driver)
    .withTimeout(Duration.ofSeconds(30))
    .pollingEvery(Duration.ofSeconds(5))
    .ignoring(NoSuchElementException.class);

Die รคltere Signatur, die ganzzahlige Werte plus TimeUnit akzeptierte, wurde in Selenium 3.11 und entfernt in Selenium 4. Die oben dargestellte, auf der Dauer basierende API ist der aktuell empfohlene Ansatz.

package guru.test99;

import java.time.Duration;
import java.util.NoSuchElementException;
import java.util.function.Function;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.testng.annotations.Test;

public class AppTest3 {
    protected WebDriver driver;

    @Test
    public void guru99tutorials() throws InterruptedException {
        String eTitle = "Demo Guru99 Page";
        String aTitle = "";
        driver = new ChromeDriver();
        // launch Chrome and redirect it to the Base URL
        driver.get("https://demo.guru99.com/test/guru99home/");
        // Maximize the browser window
        driver.manage().window().maximize();
        // get the actual value of the title
        aTitle = driver.getTitle();
        // compare the actual title with the expected title
        if (aTitle.contentEquals(eTitle)) {
            System.out.println("Test Passed");
        } else {
            System.out.println("Test Failed");
        }

        Wait<WebDriver> wait = new FluentWait<>(driver)
            .withTimeout(Duration.ofSeconds(30))
            .pollingEvery(Duration.ofSeconds(5))
            .ignoring(NoSuchElementException.class);

        WebElement clickseleniumlink = wait.until(new Function<WebDriver, WebElement>() {
            public WebElement apply(WebDriver driver) {
                return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));
            }
        });
        // click on the selenium link
        clickseleniumlink.click();
        // close browser
        driver.close();
    }
}

Erklรคrung von Code

Betrachten Sie den folgenden Code:

Wait<WebDriver> wait = new FluentWait<>(driver)
    .withTimeout(Duration.ofSeconds(30))
    .pollingEvery(Duration.ofSeconds(5))
    .ignoring(NoSuchElementException.class);

Im obigen Beispiel deklarieren wir eine Fluent Wait-Anweisung mit einem Timeout von 30 Sekunden, einer Abfragefrequenz von 5 Sekunden und ignorieren NoSuchElementException.

Betrachten Sie den folgenden Code:

public WebElement apply(WebDriver driver) {
    return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));
}

Diese Funktion identifiziert das WebElement auf der Seite (hier das Selenium (Link auf der Startseite). Mit einem Abfrageintervall von 5 Sekunden und einem Timeout von 30 Sekunden prรผft das Skript alle 5 Sekunden, ob das Element vorhanden ist, maximal jedoch 30 Sekunden lang. Befindet sich das Element innerhalb dieses Zeitraums, wird das Skript fortgesetzt. Andernfalls wird ein Fehler behoben. ElementNotVisibleException ist geworfen.

รœberprรผfen Sie auch: Selenium IDE-Tutorial fรผr Anfรคnger

Unterschied zwischen implizitem und explizitem Warten

Die folgende Tabelle hebt die wichtigsten Unterschiede zwischen implizitem und explizitem Warten hervor. Selenium.

Implizites Warten Explizites Warten
Die implizite Wartezeit wird auf alle Elemente im Skript angewendet. Die explizite Wartezeit wird nur auf die explizit ausgewรคhlten Elemente angewendet.
Bei implizitem Warten werden keine Erwarteten Bedingungen fรผr das Element angegeben. Bei explizitem Warten mรผssen ExpectedConditions fรผr das Element definiert werden.
Empfohlen, wenn Elemente innerhalb des konfigurierten impliziten Wartefensters geladen werden. Empfohlen, wenn Elemente lรคnger zum Laden benรถtigen und wenn Elementzustรคnde wie visibilityOfElementLocated, elementToBeClickable oder elementToBeSelected รผberprรผft werden.
Einmal festgelegt und fรผr den gesamten Lebenszyklus der WebDriver-Instanz angewendet. Einstellen pro Element oder pro Prรผfung fรผr eine feinere Steuerung.

Wie man die richtige Wartezeitstrategie auswรคhlt

Die Wahl des richtigen Wartebefehls hat direkten Einfluss auf die Stabilitรคt und Ausfรผhrungszeit des Skripts. Nutzen Sie dieses Entscheidungsmodell, um fรผr jedes Szenario die passende Option auszuwรคhlen.

  1. Lastmuster ermitteln: Prรผfen Sie, ob das Element zu einem festen Zeitpunkt, nach einer Ajax-Antwort oder in unvorhersehbaren Abstรคnden erscheint. Feste Lasten eignen sich fรผr Implicit Wait, wรคhrend unvorhersehbare Lasten Fluent Wait erfordern.
  2. Vermeiden Sie die Vermischung von impliziten und expliziten Wartezeiten: Die Kombination beider Faktoren kann zu unerwarteten Verzรถgerungen fรผhren, da die lรคngere Wartezeit รผberwiegen kann. Selenium Die Dokumentation empfiehlt, pro WebDriver-Sitzung nur eine Strategie zu verwenden.
  3. StandardmรครŸig auf โ€žExplizit wartenโ€œ eingestellt: Wenn Seiten von Ajax, bedingtem Rendering oder Animationen abhรคngen, zielt Explicit Wait mit ExpectedConditions genau auf das relevante Element ab.
  4. Verwenden Sie Fluent Wait fรผr variable Zeitsteuerung: Wenn die Ladezeiten von Elementen zwischen den Durchlรคufen variieren, konfigurieren Sie Fluent Wait mit einem Abfrageintervall. Die Abfrage reduziert die gesamte Wartezeit im Vergleich zu einem einzelnen langen Timeout.
  5. Ersetze Thread.sleep: Fest codierte Wartezeiten verlangsamen Testreihen und verschleiern tatsรคchliche Timing-Probleme. Ersetzen Sie diese durch bedingte Wartezeiten, um eine schnelle und deterministische Ausfรผhrung zu gewรคhrleisten.
  6. Timeout-Werte anpassen: Beginnen Sie mit kurzen Timeouts (5โ€“10 Sekunden) und erhรถhen Sie diese erst, wenn Fehler auf eine tatsรคchliche geringe Last hinweisen. Lange Standard-Timeouts verschleiern LeistungseinbuรŸen.
  7. Wartezeiten in Hilfsfunktionen beibehalten: Die Wartelogik sollte in einer Hilfsklasse zentralisiert werden, damit ร„nderungen der Timeout-Richtlinie fรผr die gesamte Testsuite gelten.

Durch die Anwendung dieses Frameworks kรถnnen Automatisierungsingenieure robuste Skripte erstellen, die sich an das tatsรคchliche Timing von Anwendungen anpassen, ohne langsam oder fehleranfรคllig zu werden.

Hรคufige Fehler, die Sie vermeiden sollten Selenium Wartet

Selbst erfahrene Tester tappen bei der Arbeit mit einigen wiederkehrenden Fehlern. Selenium Wartezeiten. Durch die Vermeidung dieser Probleme bleiben Skripte schnell, deterministisch und einfach zu warten โ€“ team- und umgebungsรผbergreifend.

Der erste hรคufige Fehler ist die รผbermรครŸige Verwendung von `Thread.sleep`. Eine fest codierte Pause zwingt das Skript, unabhรคngig von der tatsรคchlichen Verfรผgbarkeit der Elemente die volle Dauer abzuwarten, was die Gesamtlaufzeit unnรถtig verlรคngert. Ersetzen Sie solche Pausen durch `Explicit Wait` oder `Fluent Wait`, damit das Skript fortfรคhrt, sobald die Bedingung erfรผllt ist.

Der zweite Fehler besteht darin, implizite und explizite Wartezeiten im selben Test zu vermischen. Die beiden Mechanismen kรถnnen sich gegenseitig verstรคrken und zu unvorhersehbaren Timeouts fรผhren, die schwer zu debuggen sind. Wรคhlen Sie pro WebDriver-Sitzung eine Strategie und wenden Sie diese konsequent an.

Ein dritter Fehler besteht darin, Timeouts โ€žvorsichtshalberโ€œ zu hoch anzusetzen. Lange Standard-Timeouts verschleiern tatsรคchliche Leistungsprobleme und verlangsamen das Feedback in Continuous-Integration-Pipelines. Beginnen Sie mit kurzen Timeouts und verlรคngern Sie diese erst, wenn Fehlerprotokolle ein tatsรคchliches Timing-Problem belegen.

รœberprรผfen Sie auch: Selenium Tutorial fรผr Anfรคnger: Erlernen Sie WebDriver in 7 Tagen

Hรคufig gestellte Fragen

Die standardmรครŸige implizite Wartezeit in Selenium WebDriver ist auf 0 Sekunden eingestellt. Der Treiber pausiert nicht bei fehlenden Elementen, bis die Methode implicitlyWait mit einem benutzerdefinierten Dauerwert aufgerufen wird.

`Thread.sleep` unterbricht die Ausfรผhrung bedingungslos fรผr eine feste Dauer, unabhรคngig von der Bereitschaft der Elemente. Dies verlรคngert die Gesamtlaufzeit, verschleiert Leistungsprobleme und fรผhrt zu fehleranfรคlligen Tests. Explizite und flieรŸende Wartezeiten setzen die Ausfรผhrung fort, sobald eine Bedingung erfรผllt ist.

Es wird nicht empfohlen. Selenium Die Dokumentation warnt davor, dass die Kombination beider Strategien zu unvorhersehbaren Wartezeiten fรผhren kann. Wรคhlen Sie pro WebDriver-Sitzung eine Strategie, typischerweise โ€žExplizites Wartenโ€œ oder โ€žFluent Waitโ€œ, um ein klareres Verhalten und eine einfachere Fehlersuche zu gewรคhrleisten.

Ja. KI-gestรผtzte Testplattformen wie z. B. TestimMabl und Functionize analysieren die Antwortzeiten von Anwendungen und empfehlen explizite oder flieรŸende Wartezeiten. Sie reduzieren das Ausprobieren verschiedener Einstellungen und passen Timeouts dynamisch an das beobachtete Seitenverhalten an.

KI-Systeme lernen historische Lastmuster und passen Abfrageintervalle oder Timeout-Fenster automatisch an. Schlรคgt ein Test wiederholt nahe einer Zeitgrenze fehl, verlรคngert das Modell die Wartezeit oder wechselt zu einer optimierten Bedingung, wodurch sporadische Fehler รผber mehrere Testlรคufe hinweg reduziert werden.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: