Glossario · Automazione della UI
Implicit wait (attesa implicita)
In inglese: Implicit wait
Detto anche: attesa implicita, attese implicite, implicitlyWait
Definizione
Un'impostazione globale di Selenium per cui ogni chiamata a findElement continua a cercare l'elemento fino a un tempo massimo prima di lanciare NoSuchElementException.
Un implicit wait (attesa implicita) dice a WebDriver di continuare a cercare un elemento per un tempo fisso prima di arrendersi. Lo imposti una volta per sessione del driver e da quel momento si applica a ogni chiamata a findElement e findElements. È “implicita” perché l’attesa avviene in modo silenzioso dentro la ricerca dell’elemento, invece che in un punto scelto da te. Il valore predefinito è zero.
Esempio (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"));
In Selenium 4 l’overload da usare è quello con Duration. Il vecchio implicitlyWait(long, TimeUnit) è deprecato.
Differenza rispetto all’explicit wait
| Implicit wait | Explicit wait | |
|---|---|---|
| Ambito | Ogni ricerca di elementi della sessione | Una condizione in un punto preciso del test |
| Cosa attende | Che l’elemento esista nel DOM | Qualsiasi condizione: visibile, cliccabile, testo presente, scomparso |
| Dove si imposta | Una volta, sul driver | Inline, con WebDriverWait |
Un implicit wait non attende che un elemento sia visibile o abilitato. Se il pulsante esiste ma è ancora disabilitato, findElement ritorna subito e il clic può fallire o non fare nulla.
Perché molti team lo evitano
- Mescolarlo con gli explicit wait è imprevedibile. La documentazione di Selenium sconsiglia di combinarli, perché anche le ricerche dentro un explicit wait applicano il timeout implicito.
- Verificare che qualcosa sia assente diventa lento.
findElements(...).isEmpty()attende l’intero timeout implicito ogni volta che l’elemento è, giustamente, assente. - Nasconde l’intento. Chi legge non può capire quali step abbiano davvero bisogno di attendere.
La raccomandazione comune è lasciare l’implicit wait a zero e usare gli explicit wait dove servono. Se una suite legacy ne dipende, tienilo breve e non aggiungere explicit wait sopra senza prima rimuoverlo.