Glossaire · Automatisation de l’UI
Attente implicite (implicit wait)
En anglais : Implicit wait
Également appelé : attente implicite, attentes implicites, implicitlyWait
Définition
Un réglage global de Selenium qui fait que chaque appel à findElement continue de chercher l’élément pendant une durée donnée avant de lever NoSuchElementException.
Une attente implicite indique à WebDriver de continuer à chercher un élément pendant une durée fixe avant d’abandonner. Vous la définissez une fois par session de driver, et elle s’applique ensuite à chaque appel à findElement et findElements. Elle est « implicite » parce que l’attente se produit silencieusement à l’intérieur de la recherche d’élément, et non à un endroit que vous choisissez. La valeur par défaut est zéro.
Exemple (Selenium 4, Java)
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
// Polls for up to 5 seconds for the element to exist in the DOM
WebElement email = driver.findElement(By.id("email"));
// findElements also waits up to 5 seconds, then returns an empty list
List<WebElement> errors = driver.findElements(By.cssSelector(".error"));
Avec Selenium 4, c’est la surcharge avec Duration qu’il faut utiliser. L’ancienne implicitlyWait(long, TimeUnit) est dépréciée.
Différence avec une attente explicite
| Attente implicite | Attente explicite | |
|---|---|---|
| Portée | Toutes les recherches d’éléments de la session | Une condition à un endroit précis du test |
| Ce qu’elle attend | Que l’élément existe dans le DOM | N’importe quelle condition : visible, cliquable, texte présent, disparu |
| Où elle est définie | Une seule fois, sur le driver | Dans le code du test, avec WebDriverWait |
Une attente implicite n’attend pas qu’un élément soit visible ou activé. Si le bouton existe mais est encore désactivé, findElement rend la main immédiatement et le clic peut échouer ou ne rien faire.
Pourquoi beaucoup d’équipes l’évitent
- La combiner avec des attentes explicites est imprévisible. La documentation de Selenium déconseille de les mélanger, car les recherches effectuées à l’intérieur d’une attente explicite appliquent aussi le timeout implicite.
- Vérifier qu’un élément est absent devient lent.
findElements(...).isEmpty()attend le timeout implicite complet chaque fois que l’élément est, à juste titre, absent. - Elle masque l’intention. Un lecteur ne peut pas savoir quelles étapes ont réellement besoin d’attendre.
La recommandation courante est de laisser l’attente implicite à zéro et d’utiliser des attentes explicites là où elles sont nécessaires. Si une suite existante en dépend, gardez-la courte et n’ajoutez pas d’attentes explicites par-dessus sans la supprimer.