Implicit og eksplicit ventetid Selenium med syntaks

โšก Smart opsummering

Selenium Ventekommandoer synkroniserer automatiseringsscripts med dynamisk sideadfรฆrd og forhindrer testfejl forรฅrsaget af elementer, der indlรฆses asynkront. Denne reference forklarer implicitte, eksplicitte og flydende ventestrategier med WebDriver-syntaks, der fungerer. Java kodeeksempler og praktisk vejledning i valg af passende ventetid for stabil og pรฅlidelig testudfรธrelse.

  • ๐Ÿ‡ง๐Ÿ‡ท FoundationPrincip: Anvend implicit ventetid globalt, sรฅ webdriveren holder pause i en defineret varighed, fรธr NoSuchElementException genereres.
  • ๐ŸŽฏ Implementeringsfokus: Brug Explicit Wait med ExpectedConditions til at mรฅlrette elementer, der afhรฆnger af Ajax eller dynamiske synlighedstilstande.
  • ๐Ÿ” Avanceret teknik: Konfigurer Fluent Wait med pollingintervaller for at hรฅndtere elementer, der indlรฆses pรฅ uforudsigelige tidspunkter.
  • โšก Optimeringsstrategi: Erstat Thread.sleep med betingede ventetider for at reducere udfรธrelsestiden og eliminere skrรธbelige forsinkelser.
  • โœ… Kvalitetspรฅvirkning: Valg af den korrekte ventetid reducerer direkte ustabile fejl og forbedrer scriptstabilitet pรฅ tvรฆrs af miljรธer.

Selenium Vent โ€“ โ€‹โ€‹implicit og eksplicit med syntaks

In Selenium"Ventetider" spiller en vigtig rolle i udfรธrelsen af โ€‹โ€‹pรฅlidelige tests. I denne vejledning lรฆrer du de vigtigste aspekter og forskelle mellem implicitte og eksplicitte ventekommandoer i Selenium, sammen med praktisk brug af Fluent Wait.

Hvorfor har vi brug for ventetider Selenium?

De fleste moderne webapplikationer er udviklet vha. Ajax og JavaScriptNรฅr en side indlรฆses af browseren, kan de elementer, vi รธnsker at interagere med, indlรฆses med forskellige tidsintervaller.

Dette gรธr ikke blot identifikation af grundstoffer vanskelig, men hvis grundstoffet ikke lokaliseres i tide, Selenium vil kaste en ElementNotVisibleException. Selenium Ventetider lรธser dette synkroniseringsproblem ved at give WebDriver et defineret vindue, hvor et element kan findes, fรธr det fejler.

Overvej et scenarie, hvor bรฅde implicitte og eksplicitte ventetider bruges i den samme test. Antag, at den implicitte ventetid er indstillet til 20 sekunder, og den eksplicitte ventetid er indstillet til 10 sekunder.

Hvis vi leder efter et element, der er styret af bestemte Forventede betingelser (Eksplicit ventetid), og elementet ikke er placeret inden for det eksplicitte vindue pรฅ 10 sekunder, falder WebDriveren tilbage til det implicitte vindue pรฅ 20 sekunder, fรธr den udlรธser en ElementNotVisibleException.

Selenium WebDriver venter

  1. Implicit Vent
  2. Eksplicit Vent
  3. Flydende Vent

Implicit Vent ind Selenium

Implicit Vent ind Selenium instruerer WebDriver til at vente i en defineret varighed, fรธr der udlรธses en NoSuchElementException. Standardvรฆrdien er 0. Nรฅr den er konfigureret, forespรธrger WebDriver DOM'en i lรธbet af denne varighed, fรธr den fejler. Selenium WebDriver arvede konceptet med implicitte ventetider fra Watir.

I eksemplet nedenfor erklรฆrer vi en implicit ventetid med en varighed pรฅ 10 sekunder. Hvis elementet ikke er placeret inden for dette vindue, genereres en undtagelse.

Implicit ventesyntaks (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();
    }
}

Forklaring af Code

I ovenstรฅende eksempel skal du overveje fรธlgende sรฆtning:

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

Selenium Version 4 erstattede den รฆldre signatur med to argumenter (heltal plus TimeUnit) med et enkelt Duration-argument. Duration-klassen understรธtter sekunder, minutter, millisekunder og andre tidsenheder via statiske hjรฆlpere som Duration.ofSeconds, Duration.ofMillis og Duration.ofMinutes.

Eksplicit Vent ind Selenium

Eksplicit Vent ind Selenium instruerer WebDriver til at vente pรฅ specifikke betingelser (forventede betingelser) eller en maksimal varighed, fรธr en ElementNotVisibleException udlรธses. Det er en smartere ventefunktion, fordi den kun gรฆlder for det angivne element. Explicit Wait foretrรฆkkes frem for Implicit Wait, nรฅr testen skal hรฅndtere dynamisk indlรฆst Ajax-indhold.

Nรฅr en eksplicit ventetid er angivet, skal du bruge Forventede betingelser, eller du kan konfigurere pollingfrekvens ved hjรฆlp af Flydende Vent. Undgรฅ at bruge Thread.sleep(), da det sรฆtter udfรธrelsen pรฅ pause ubetinget og generelt betragtes som dรฅrlig praksis.

I eksemplet nedenfor opretter vi en reference til WebDriverWait klasse, instantiรฉr den med webdriver reference, og konfigurer et maksimalt vindue pรฅ 20 sekunder.

Eksplicit ventesyntaks (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();
    }
}

Forklaring af Code

Overvej fรธlgende kode:

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();

I dette WebDriverWait-eksempel venter scriptet op til 20 sekunder, som defineret af WebDriverWait klasse, indtil Forventede betingelser er opfyldt โ€“ alt efter hvad der indtrรฆffer fรธrst.

Ovenstรฅende Java Koden venter op til 20 sekunder pรฅ betingelsen synlighedAfElementPlaceret for at vรฆre sand.

Fรธlgende forventede betingelser kan anvendes i Selenium Eksplicit ventetid:

  1. alertIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. frameToBeAvailableAndSwitchToIt()
  6. invisibilityOfTheElementLocated()
  7. invisibilityOfElementWithText()
  8. presenceOfAllElementsLocatedBy()
  9. presenceOfElementLocated()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. titleIs()
  14. titelIndeholder()
  15. visibilityOf()
  16. visibilityOfAllElements()
  17. visibilityOfAllElementsLocatedBy()
  18. visibilityOfElementLocated()

Flydende Vent ind Selenium

Flydende Vent ind Selenium definerer den maksimale varighed, som WebDriver skal vente pรฅ en betingelse, sammen med pollingfrekvensen for at verificere betingelsen, fรธr en ElementNotVisibleException udlรธses. Fluent Wait kontrollerer for elementet med jรฆvne mellemrum, indtil objektet findes, eller timeout udlรธber.

Frekvens: Gentagelsescyklussen til evaluering af tilstanden med jรฆvne mellemrum.

Forestil dig et scenarie, hvor et element indlรฆses med uforudsigelige intervaller. Elementet kan indlรฆses pรฅ 10 sekunder, 20 sekunder eller lรฆngere. Hvis vi erklรฆrer en eksplicit ventetid pรฅ 20 sekunder, vil scriptet vente i hele varigheden, fรธr det fejler. I sรฅdanne tilfรฆlde er Fluent Wait det ideelle valg, fordi det poller med den angivne frekvens, indtil elementet er fundet, eller den endelige timer udlรธber.

Flydende ventesyntaks (Selenium 4):

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

Den รฆldre signatur, der accepterede heltalsvรฆrdier plus TimeUnit, blev udfaset i Selenium 3.11 og fjernet i Selenium 4. Den ovenfor viste varighedsbaserede API er den nuvรฆrende anbefalede fremgangsmรฅde.

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();
    }
}

Forklaring af Code

Overvej fรธlgende kode:

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

I ovenstรฅende eksempel erklรฆrer vi en Fluent Wait med en timeout pรฅ 30 sekunder, en pollingfrekvens pรฅ 5 sekunder og ignorerer NoSuchElementException.

Overvej fรธlgende kode:

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"));
}

Denne funktion identificerer WebElementet pรฅ siden (her, Selenium link pรฅ hjemmesiden). Med et pollinginterval pรฅ 5 sekunder og en timeout pรฅ 30 sekunder tjekker ventefunktionen for elementet hvert 5. sekund i maksimalt 30 sekunder. Hvis elementet er placeret inden for dette vindue, fortsรฆtter scriptet. Ellers vil en ElementNotVisibleException bliver kastet.

Kontroller ogsรฅ: Selenium IDE Tutorial for begyndere

Forskellen mellem implicit ventetid og eksplicit ventetid

Tabellen nedenfor fremhรฆver de vigtigste forskelle mellem implicit ventetid og eksplicit ventetid. Selenium.

Implicit Vent Eksplicit Vent
Implicit ventetid anvendes pรฅ alle elementer i scriptet. Eksplicit ventetid anvendes kun pรฅ de elementer, der er specifikt mรฅlrettet.
I Implicit Wait er ExpectedConditions ikke angivet for elementet. I Explicit Wait skal ExpectedConditions defineres for elementet.
Anbefales, nรฅr elementer indlรฆses inden for det konfigurerede implicitte ventevindue. Anbefales, nรฅr elementer tager lรฆngere tid at indlรฆse, og ved validering af elementtilstande som f.eks. visibilityOfElementLocated, elementToBeClickable eller elementToBeSelected.
Angivet รฉn gang og anvendt i WebDriver-instansens livscyklus. Indstil pr. element eller pr. kontrol, hvilket giver finere kontrol.

Sรฅdan vรฆlger du den rigtige ventestrategi

Valg af den korrekte wait-kommando pรฅvirker direkte scriptstabilitet og udfรธrelsestid. Brug denne beslutningsramme til at vรฆlge den passende mulighed for hvert scenarie.

  1. Identificรฉr belastningsmรธnsteret: Tjek om elementet vises pรฅ et fast tidspunkt, efter Ajax-svaret eller med uforudsigelige intervaller. Faste indlรฆsninger passer til Implicit Wait, hvorimod uforudsigelige indlรฆsninger krรฆver Fluent Wait.
  2. Undgรฅ at blande implicitte og eksplicitte ventetider: Kombinationen af โ€‹โ€‹de to kan forรฅrsage uventede forsinkelser, fordi den lรฆngere ventetid kan vรฆre dominerende. Selenium Dokumentationen anbefaler kun at bruge รฉn strategi pr. WebDriver-session.
  3. Standardindstilling er eksplicit. Vent pรฅ dynamisk indhold: Nรฅr sider er afhรฆngige af Ajax, betinget gengivelse eller animationer, mรฅlretter Explicit Wait med ExpectedConditions prรฆcis det element, der er vigtigt.
  4. Brug Fluent Wait til variabel timing: Nรฅr elementindlรฆsningstimingen varierer mellem kรธrsler, skal Fluent Wait konfigureres med et pollinginterval. Polling reducerer den samlede ventetid sammenlignet med en enkelt lang timeout.
  5. Erstat Thread.sleep: Hardkodede dvaler forsinker testpakker og skjuler reelle timingproblemer. Erstat dem med betingede ventetider for at holde udfรธrelsen hurtig og deterministisk.
  6. Timeout-vรฆrdier for finjustering: Start med korte timeouts (5-10 sekunder), og รธg dem kun, nรฅr fejl viser reel langsom belastning. Lange standard timeouts maskerer ydeevneregressioner.
  7. Behold ventetider i hjรฆlpevรฆrktรธjer: Centraliser ventelogik i en hjรฆlperklasse, sรฅ รฆndringer i timeout-politikken gรฆlder pรฅ tvรฆrs af hele testsuiten.

Ved at fรธlge denne ramme kan automatiseringsingeniรธrer bygge robuste scripts, der tilpasser sig den faktiske applikationstiming uden at blive langsomme eller skrรธbelige.

Almindelige fejl at undgรฅ med Selenium Venter

Selv erfarne testere falder i en rรฆkke tilbagevendende fรฆlder, nรฅr de arbejder med Selenium venter. Ved at undgรฅ disse problemer forbliver scripts hurtige, deterministiske og nemme at vedligeholde pรฅ tvรฆrs af teams og miljรธer.

Den fรธrste almindelige fejl er overforbrug af Thread.sleep. En hardcoded pause tvinger scriptet til at vente i hele varigheden uanset den faktiske elementtilgรฆngelighed, hvilket oppuster den samlede kรธrselstid. Erstat sรฅdanne pauser med Explicit eller Fluent Wait, sรฅ scriptet fortsรฆtter i det รธjeblik, betingelsen er opfyldt.

Den anden fejl er at blande implicitte og eksplicitte ventetider i den samme test. De to mekanismer kan blandes sammen og skabe uforudsigelige timeouts, der er svรฆre at fejlfinde. Vรฆlg รฉn strategi pr. WebDriver-session, og anvend den konsekvent.

En tredje fejl er at sรฆtte timeouts for hรธjt "bare i tilfรฆlde af". Lange standardvinduer skjuler reelle ydeevneproblemer og forsinker feedback i kontinuerlige integrationspipeliner. Start med korte timeouts, og forlรฆng dem kun, nรฅr fejllogge beviser, at der er et reelt timingproblem.

Kontroller ogsรฅ: Selenium Tutorial for begyndere: Lรฆr WebDriver pรฅ 7 dage

Ofte Stillede Spรธrgsmรฅl

Standard implicit ventetid i Selenium WebDriver er 0 sekunder. Driveren holder ikke pause for manglende elementer, fรธr implicitlyWait-metoden kaldes med en brugerdefineret Duration-vรฆrdi.

Thread.sleep sรฆtter udfรธrelsen pรฅ pause ubetinget i en fast periode, uanset om elementet er parat. Det รธger den samlede kรธrselstid, maskerer ydeevneproblemer og producerer skrรธbelige tests. Eksplicit og flydende ventetider genoptages i det รธjeblik, en betingelse er opfyldt.

Det anbefales ikke. Selenium Dokumentationen advarer om, at kombinationen af โ€‹โ€‹begge kan forรฅrsage uforudsigelige ventetider. Vรฆlg รฉn strategi pr. WebDriver-session, typisk Explicit eller Fluent Wait, for at opnรฅ en tydeligere opfรธrsel og nemmere fejlfinding.

Ja. AI-drevne testplatforme som f.eks. Testim, Mabl og Functionize analyserer applikationers svartider og anbefaler Explicit eller Fluent Wait-vรฆrdier. De reducerer trial-and-error-justering og tilpasser timeouts dynamisk baseret pรฅ observeret sideadfรฆrd.

AI-motorer lรฆrer historiske belastningsmรธnstre og justerer automatisk pollingintervaller eller timeout-vinduer. Nรฅr en test gentagne gange fejler nรฆr en tidsgrรฆnse, forlรฆnger modellen ventetiden eller skifter til en smartere tilstand, hvilket reducerer ustabile fejl pรฅ tvรฆrs af kรธrsler.

Opsummer dette indlรฆg med: