Attente implicite et explicite dans Selenium avec syntaxe
โก Rรฉsumรฉ intelligent
Selenium Les commandes d'attente synchronisent les scripts d'automatisation avec le comportement dynamique des pages, รฉvitant ainsi les รฉchecs de tests dus ร des รฉlรฉments chargรฉs de maniรจre asynchrone. Cette documentation explique les stratรฉgies d'attente implicite, explicite et fluide avec la syntaxe WebDriver et leur fonctionnement. Java Des exemples de code et des conseils pratiques sur le choix du dรฉlai d'attente appropriรฉ pour une exรฉcution de test stable et fiable.

In SeleniumLes ยซ attentes ยป jouent un rรดle important dans l'exรฉcution de tests fiables. Dans ce tutoriel, vous dรฉcouvrirez les aspects clรฉs et les diffรฉrences entre les commandes d'attente implicites et explicites. Selenium, ainsi que l'utilisation pratique de Fluent Wait.
Pourquoi avons-nous besoin d'attendre Selenium?
La plupart des applications web modernes sont dรฉveloppรฉes ร l'aide de Ajax et JavascรฉnarioLorsqu'une page est chargรฉe par le navigateur, les รฉlรฉments avec lesquels nous souhaitons interagir peuvent se charger ร des intervalles de temps diffรฉrents.
Non seulement cela rend l'identification de l'รฉlรฉment difficile, mais si l'รฉlรฉment n'est pas localisรฉ ร temps, Selenium lancera un ElementNotVisibleException. Selenium Les fonctions d'attente rรฉsolvent ce problรจme de synchronisation en donnant au WebDriver une fenรชtre dรฉfinie dans laquelle il peut rechercher un รฉlรฉment avant d'รฉchouer.
Prenons l'exemple d'un test utilisant ร la fois des dรฉlais d'attente implicites et explicites. Supposons que le dรฉlai d'attente implicite soit de 20 secondes et le dรฉlai d'attente explicite de 10 secondes.
Si nous recherchons un รฉlรฉment rรฉgi par certaines Conditions attendues (Attente explicite) et si l'รฉlรฉment n'est pas trouvรฉ dans la fenรชtre explicite de 10 secondes, WebDriver utilise la fenรชtre implicite de 20 secondes avant de lever une exception. ElementNotVisibleException.
Selenium WebDriver attend
- Attente implicite
- Attente explicite
- Attente fluide
Attendre implicitement Selenium
Le Attendre implicitement Selenium Cette configuration indique au WebDriver d'attendre une durรฉe dรฉfinie avant de lever une exception NoSuchElementException. La valeur par dรฉfaut est 0. Une fois configurรฉ, le WebDriver interroge le DOM pendant cette durรฉe avant de gรฉnรฉrer une erreur. Selenium WebDriver a hรฉritรฉ du concept d'attentes implicites de Watir.
Dans l'exemple ci-dessous, nous dรฉclarons une attente implicite d'une durรฉe de 10 secondes. Si l'รฉlรฉment n'est pas trouvรฉ dans cet intervalle, une exception est levรฉe.
Syntaxe d'attente implicite (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();
}
}
Explication de Code
Dans l'exemple ci-dessus, considรฉrez l'รฉnoncรฉ suivant :
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
Selenium La version 4 remplace l'ancienne signature ร deux arguments (entier et unitรฉ de temps) par un unique argument de type durรฉe. La classe Duration prend en charge les secondes, les minutes, les millisecondes et d'autres unitรฉs de temps grรขce ร des fonctions d'assistance statiques telles que Duration.ofSeconds, Duration.ofMillis et Duration.ofMinutes.
Attendre explicitement Selenium
Le Attendre explicitement Selenium Cette instruction demande au WebDriver d'attendre des conditions spรฉcifiques (conditions attendues) ou une durรฉe maximale avant de lever une exception ElementNotVisibleException. Il s'agit d'une attente plus intelligente, car elle ne s'applique qu'ร l'รฉlรฉment spรฉcifiรฉ. L'attente explicite est prรฉfรฉrable ร l'attente implicite lorsque le test doit gรฉrer du contenu Ajax chargรฉ dynamiquement.
Une fois qu'une attente explicite est dรฉclarรฉe, vous devez utiliser Conditions attendues, ou vous pouvez configurer la frรฉquence d'interrogation ร l'aide de Attente fluide. รvitez d'utiliser Thread.sommeil(), car elle interrompt l'exรฉcution sans condition et est gรฉnรฉralement considรฉrรฉe comme une mauvaise pratique.
Dans l'exemple ci-dessous, nous crรฉons une rรฉfรฉrence de WebDriverAttendez classe, instanciez-la avec la pilote web Rรฉfรฉrencez et configurez une fenรชtre maximale de 20 secondes.
Syntaxe d'attente explicite (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();
}
}
Explication de Code
Considรฉrez le code suivant :
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();
Dans cet exemple WebDriverWait, le script attend jusqu'ร 20 secondes, comme dรฉfini par WebDriverAttendez classe, jusqu'ร la Conditions attendues sont satisfaits โ selon la premiรจre รฉventualitรฉ.
Le dessus Java Le code attend jusqu'ร 20 secondes que la condition soit remplie. visibilitรฉDeL'รlรฉmentLocalisรฉ pour รชtre vrai.
Les conditions attendues suivantes peuvent รชtre utilisรฉes dans Selenium Attente explicite :
- alertIsPresent()
- elementSelectionStateToBe()
- elementToBeClickable()
- elementToBeSelected()
- frameToBeAvailableAndSwitchToIt()
- invisibilitรฉOfTheElementLocated()
- invisibilitรฉOfElementWithText()
- prรฉsenceOfAllElementsLocatedBy()
- prรฉsenceOfElementLocated()
- textToBePresentInElement()
- textToBePresentInElementLocated()
- textToBePresentInElementValue()
- titreEst()
- titreContient()
- visibilitรฉDe()
- visibilitรฉOfAllElements()
- visibilitรฉOfAllElementsLocatedBy()
- visibilitรฉOfElementLocated()
Courant Attendre Selenium
Le Courant Attendre Selenium Dรฉfinit la durรฉe maximale d'attente du WebDriver pour une condition, ainsi que la frรฉquence d'interrogation pour vรฉrifier cette condition avant de lever une exception ElementNotVisibleException. Fluent Wait vรฉrifie la prรฉsence de l'รฉlรฉment ร intervalles rรฉguliers jusqu'ร ce que l'objet soit trouvรฉ ou que le dรฉlai d'attente expire.
Frรฉquence : Le cycle de rรฉpรฉtition pour รฉvaluer l'รฉtat ร intervalles rรฉguliers.
Imaginons un scรฉnario oรน un รฉlรฉment se charge ร intervalles imprรฉvisibles : 10 secondes, 20 secondes, voire plus. Si lโon spรฉcifie un dรฉlai dโattente de 20 secondes, le script attendra la durรฉe totale avant de sโarrรชter. Dans ce cas, Fluent Wait est la solution idรฉale, car il interroge lโรฉlรฉment ร la frรฉquence indiquรฉe jusquโร ce quโil soit trouvรฉ ou que le dรฉlai soit รฉcoulรฉ.
Syntaxe d'attente fluide (Selenium 4):
Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(30))
.pollingEvery(Duration.ofSeconds(5))
.ignoring(NoSuchElementException.class);
L'ancienne signature qui acceptait des valeurs entiรจres plus TimeUnit a รฉtรฉ dรฉprรฉciรฉe dans Selenium 3.11 et supprimรฉ dans Selenium 4. L'API basรฉe sur la durรฉe prรฉsentรฉe ci-dessus est l'approche actuellement recommandรฉe.
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();
}
}
Explication de Code
Considรฉrez le code suivant :
Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(30))
.pollingEvery(Duration.ofSeconds(5))
.ignoring(NoSuchElementException.class);
Dans l'exemple ci-dessus, nous dรฉclarons une attente Fluent avec un dรฉlai d'expiration de 30 secondes, une frรฉquence d'interrogation de 5 secondes et ignorons NoSuchElementException.
Considรฉrez le code suivant :
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"));
}
Cette fonction identifie l'รฉlรฉment Web sur la page (ici, le Selenium (lien sur la page d'accueil). Avec un intervalle d'interrogation de 5 secondes et un dรฉlai d'expiration de 30 secondes, l'attente vรฉrifie la prรฉsence de l'รฉlรฉment toutes les 5 secondes pendant un maximum de 30 secondes. Si l'รฉlรฉment est prรฉsent dans cet intervalle, le script s'exรฉcute. Sinon, une erreur se produit. ElementNotVisibleException Est lancรฉ.
Vรฉrifiez รฉgalement: Selenium Tutoriel IDE pour les dรฉbutants
Diffรฉrence entre l'attente implicite et l'attente explicite
Le tableau ci-dessous met en รฉvidence les principales diffรฉrences entre l'attente implicite et l'attente explicite. Selenium.
| Attente implicite | Attente explicite |
|---|---|
| Un temps d'attente implicite est appliquรฉ ร tous les รฉlรฉments du script. | Le temps d'attente explicite s'applique uniquement aux รฉlรฉments spรฉcifiquement ciblรฉs. |
| Dans l'attente implicite, les conditions attendues ne sont pas spรฉcifiรฉes pour l'รฉlรฉment. | Dans Explicit Wait, ExpectedConditions doit รชtre dรฉfini pour l'รฉlรฉment. |
| Recommandรฉ lorsque les รฉlรฉments se chargent dans la fenรชtre d'attente implicite configurรฉe. | Recommandรฉ lorsque les รฉlรฉments mettent plus de temps ร se charger et lors de la validation des รฉtats des รฉlรฉments tels que visibilityOfElementLocated, elementToBeClickable ou elementToBeSelected. |
| Dรฉfini une seule fois et appliquรฉ pour le cycle de vie de l'instance WebDriver. | Paramรฉtrable par รฉlรฉment ou par contrรดle, pour un contrรดle plus prรฉcis. |
Comment choisir la bonne stratรฉgie d'attente
Le choix de la commande d'attente appropriรฉe influe directement sur la stabilitรฉ du script et son temps d'exรฉcution. Utilisez ce cadre de dรฉcision pour sรฉlectionner l'option adรฉquate ร chaque situation.
- Identifier le modรจle de charge : Vรฉrifiez si l'รฉlรฉment apparaรฎt ร un moment fixe, aprรจs une rรฉponse Ajax, ou ร intervalles imprรฉvisibles. Les chargements fixes conviennent ร l'attente implicite, tandis que les chargements imprรฉvisibles nรฉcessitent une attente fluide.
- รvitez de mรฉlanger les attentes implicites et explicites : La combinaison des deux peut entraรฎner des retards imprรฉvus car l'attente la plus longue risque de prรฉvaloir. Selenium La documentation recommande d'utiliser une seule stratรฉgie par session WebDriver.
- Par dรฉfaut, attendre explicitement le contenu dynamique : Lorsque les pages dรฉpendent d'Ajax, du rendu conditionnel ou d'animations, l'option Explicit Wait avec ExpectedConditions cible prรฉcisรฉment l'รฉlรฉment concernรฉ.
- Utilisez Fluent Wait pour une temporisation variable : Lorsque le temps de chargement des รฉlรฉments varie d'une exรฉcution ร l'autre, configurez Fluent Wait avec un intervalle d'interrogation. L'interrogation rรฉduit le temps d'attente total par rapport ร un dรฉlai d'attente unique et long.
- Remplacer Thread.sleep : Les pauses codรฉes en dur ralentissent les suites de tests et masquent les problรจmes de synchronisation rรฉels. Remplacez-les par des attentes conditionnelles pour garantir une exรฉcution rapide et dรฉterministe.
- Ajuster les valeurs de dรฉlai d'attente : Commencez par des dรฉlais d'attente courts (5 ร 10 secondes) et augmentez-les uniquement lorsque les รฉchecs rรฉvรจlent une rรฉelle baisse de charge. Des dรฉlais d'attente par dรฉfaut trop longs masquent les baisses de performances.
- Conserver les temps d'attente dans les utilitaires auxiliaires : Centralisez la logique d'attente dans une classe d'assistance afin que les modifications de la politique de dรฉlai d'attente s'appliquent ร l'ensemble de la suite de tests.
En suivant ce cadre, les ingรฉnieurs en automatisation peuvent crรฉer des scripts robustes qui s'adaptent au rythme rรฉel des applications sans devenir lents ou fragiles.
Erreurs courantes ร รฉviter Selenium Attend
Mรชme les testeurs expรฉrimentรฉs tombent dans un petit nombre de piรจges rรฉcurrents lorsqu'ils travaillent avec Selenium Les temps d'attente sont un facteur important. En รฉvitant ces problรจmes, les scripts restent rapides, dรฉterministes et faciles ร maintenir pour toutes les รฉquipes et tous les environnements.
La premiรจre erreur frรฉquente consiste ร abuser de `Thread.sleep`. Une pause codรฉe en dur force le script ร attendre toute la durรฉe, quelle que soit la disponibilitรฉ rรฉelle de l'รฉlรฉment, ce qui augmente considรฉrablement le temps d'exรฉcution total. Remplacez ces pauses par `Explicit` ou `Fluent Wait` afin que le script reprenne son exรฉcution dรจs que la condition est remplie.
La seconde erreur consiste ร mรฉlanger les attentes implicites et explicites dans un mรชme test. Ces deux mรฉcanismes peuvent s'accumuler et engendrer des dรฉlais d'attente imprรฉvisibles et difficiles ร dรฉboguer. Choisissez une stratรฉgie par session WebDriver et appliquez-la systรฉmatiquement.
Une troisiรจme erreur consiste ร dรฉfinir des dรฉlais d'attente trop longs ยซ au cas oรน ยป. Des dรฉlais par dรฉfaut trop longs masquent de vรฉritables problรจmes de performance et ralentissent le retour d'information dans les pipelines d'intรฉgration continue. Commencez par des dรฉlais d'attente courts et n'augmentez-les que lorsque les journaux d'erreurs prouvent l'existence d'un rรฉel problรจme de synchronisation.
Vรฉrifiez รฉgalement: Selenium Tutoriel pour dรฉbutants : Apprenez WebDriver en 7 jours
