Glossario · Automazione della UI
Explicit wait (attesa esplicita)
In inglese: Explicit wait
Detto anche: attesa esplicita, attese esplicite, WebDriverWait, FluentWait
Definizione
Un'attesa che verifica ripetutamente una condizione specifica, per esempio che un elemento diventi cliccabile, fino a un timeout. In Selenium si scrive con WebDriverWait.
Un explicit wait (attesa esplicita) mette in pausa un test finché una determinata condizione non diventa vera, controllandola ripetutamente e fallendo con un timeout se la condizione non si verifica mai. È “esplicita” perché la scrivi esattamente nel punto in cui il test deve attendere e dichiari cosa attendere. In Selenium 4 significa WebDriverWait combinato con una condizione di ExpectedConditions o con una lambda.
Esempio (Selenium 4, Java)
import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement save = wait.until(
ExpectedConditions.elementToBeClickable(By.id("save")));
save.click();
wait.until(ExpectedConditions.textToBePresentInElementLocated(
By.cssSelector("[role='status']"), "Saved"));
// Any condition can be a lambda that returns a non-null or true value
wait.until(d -> d.findElements(By.cssSelector(".result-row")).size() == 20);
WebDriverWait effettua il polling ogni 500 ms per default e ignora NotFoundException durante il polling. Per un intervallo diverso o per ignorare altre eccezioni, usa FluentWait (withTimeout, pollingEvery, ignoring).
Differenza rispetto all’implicit wait
Un implicit wait è un’unica impostazione globale che fa sì che ogni chiamata a findElement ripeta la ricerca finché l’elemento non esiste. Non sa nulla di visibilità, cliccabilità o testo. Un explicit wait punta a una condizione in un preciso punto del test, quindi può attendere esattamente lo stato che ti serve, come la scomparsa di uno spinner o l’abilitazione di un pulsante.
La documentazione di Selenium sconsiglia di mescolare i due, perché la combinazione dei timeout può produrre tempi di attesa imprevedibili. La maggior parte dei team tiene l’implicit wait a zero e usa ovunque gli explicit wait.
Errori comuni
Thread.sleepinvece di un’attesa. Una pausa fissa è o troppo breve (test instabile) o troppo lunga (test lento), e di solito entrambe le cose, a seconda della macchina.- Attendere la presenza quando serve la visibilità.
presenceOfElementLocatedpassa non appena il nodo è nel DOM, anche se è nascosto. - Conservare un
WebElementattraverso un nuovo rendering. Attendi su un locatorBy, così che l’elemento venga ritrovato dopo che il DOM è cambiato. - Creare in ogni helper una nuova attesa con un timeout enorme. Centralizza nel tuo framework un unico default ragionevole.