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.

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
- Implicit Vent
- Eksplicit Vent
- 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:
- alertIsPresent()
- elementSelectionStateToBe()
- elementToBeClickable()
- elementToBeSelected()
- frameToBeAvailableAndSwitchToIt()
- invisibilityOfTheElementLocated()
- invisibilityOfElementWithText()
- presenceOfAllElementsLocatedBy()
- presenceOfElementLocated()
- textToBePresentInElement()
- textToBePresentInElementLocated()
- textToBePresentInElementValue()
- titleIs()
- titelIndeholder()
- visibilityOf()
- visibilityOfAllElements()
- visibilityOfAllElementsLocatedBy()
- 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.
- 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.
- 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.
- 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.
- 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.
- Erstat Thread.sleep: Hardkodede dvaler forsinker testpakker og skjuler reelle timingproblemer. Erstat dem med betingede ventetider for at holde udfรธrelsen hurtig og deterministisk.
- 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.
- 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
