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.

  • โš™๏ธ FoundationPrincipe al : Appliquez l'attente implicite globalement afin que le WebDriver fasse une pause pendant une durรฉe dรฉfinie avant de lever une exception NoSuchElementException.
  • (I.e. Objectif de mise en ล“uvre : Utilisez Explicit Wait avec ExpectedConditions pour cibler les รฉlรฉments qui dรฉpendent d'Ajax ou d'รฉtats de visibilitรฉ dynamiques.
  • (I.e. Technique avancรฉe : Configurez Fluent Wait avec des intervalles d'interrogation pour gรฉrer les รฉlรฉments qui se chargent ร  des moments imprรฉvisibles.
  • | Stratรฉgie d'optimisation : Remplacez Thread.sleep par des attentes conditionnelles pour rรฉduire le temps d'exรฉcution et รฉliminer les dรฉlais instables.
  • โœ… Impact sur la qualitรฉ : Choisir le bon dรฉlai d'attente rรฉduit directement les dรฉfaillances intempestives et amรฉliore la stabilitรฉ des scripts dans diffรฉrents environnements.

Selenium Attendre โ€“ Implicite et explicite avec syntaxe

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

  1. Attente implicite
  2. Attente explicite
  3. 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 :

  1. alertIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. frameToBeAvailableAndSwitchToIt()
  6. invisibilitรฉOfTheElementLocated()
  7. invisibilitรฉOfElementWithText()
  8. prรฉsenceOfAllElementsLocatedBy()
  9. prรฉsenceOfElementLocated()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. titreEst()
  14. titreContient()
  15. visibilitรฉDe()
  16. visibilitรฉOfAllElements()
  17. visibilitรฉOfAllElementsLocatedBy()
  18. 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.

  1. 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.
  2. ร‰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.
  3. 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รฉ.
  4. 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.
  5. 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.
  6. 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.
  7. 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

FAQ

Le temps d'attente implicite par dรฉfaut dans Selenium WebDriver affiche 0 seconde. Le pilote ne s'arrรชte pas en cas d'รฉlรฉments manquants tant que la mรฉthode implicitlyWait n'est pas appelรฉe avec une valeur de durรฉe personnalisรฉe.

La mรฉthode `Thread.sleep` suspend l'exรฉcution inconditionnellement pendant une durรฉe fixe, indรฉpendamment de l'รฉtat de disponibilitรฉ des รฉlรฉments. Elle augmente le temps d'exรฉcution global, masque les problรจmes de performance et rend les tests fragiles. Les mรฉthodes `Explicit` et `Fluent Wait` reprennent l'exรฉcution dรจs qu'une condition est remplie.

Ce n'est pas recommandรฉ. Selenium La documentation indique que la combinaison des deux peut entraรฎner des temps d'attente imprรฉvisibles. Choisissez une stratรฉgie par session WebDriver, gรฉnรฉralement Explicit ou Fluent Wait, pour un comportement plus clair et un dรฉbogage facilitรฉ.

Oui. Les plateformes de test pilotรฉes par l'IA telles que TestimMabl et Functionize analysent les temps de rรฉponse des applications et recommandent des valeurs d'attente explicites ou fluides. Ils rรฉduisent les tรขtonnements et adaptent dynamiquement les dรฉlais d'attente en fonction du comportement observรฉ des pages.

Les moteurs d'IA analysent l'historique des charges et ajustent automatiquement les intervalles d'interrogation ou les dรฉlais d'expiration. Lorsqu'un test รฉchoue de maniรจre rรฉpรฉtรฉe ร  proximitรฉ d'une limite temporelle, le modรจle prolonge le dรฉlai d'attente ou adopte une solution plus adaptรฉe, rรฉduisant ainsi les รฉchecs intempestifs lors des exรฉcutions.

Rรฉsumez cet article avec :