Glosario · Automatización de UI
Espera explícita (explicit wait)
En inglés: Explicit wait
También llamado: esperas explícitas, WebDriverWait, FluentWait, espera explícita Selenium
Definición
Una espera que comprueba repetidamente una condición concreta, como que un elemento sea clicable, hasta un timeout. En Selenium se escribe con WebDriverWait.
Una espera explícita detiene una prueba hasta que se cumple una condición concreta, comprobándola una y otra vez y fallando con un timeout si nunca llega a cumplirse. Es “explícita” porque la escribes en el punto exacto donde la prueba necesita esperar y dices qué hay que esperar. En Selenium 4 eso significa WebDriverWait combinado con una condición de ExpectedConditions o con una lambda.
Ejemplo (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);
Por defecto, WebDriverWait comprueba cada 500 ms e ignora NotFoundException mientras lo hace. Para usar otro intervalo o ignorar más excepciones, usa FluentWait (withTimeout, pollingEvery, ignoring).
En qué se diferencia de una espera implícita
Una espera implícita es un único ajuste global que hace que cada llamada a findElement siga buscando hasta que el elemento exista. No sabe nada de visibilidad, de si se puede hacer clic ni de textos. Una espera explícita apunta a una condición en un punto concreto de la prueba, así que puede esperar exactamente el estado que necesitas, como que desaparezca un spinner o que un botón se habilite.
La documentación de Selenium desaconseja mezclar ambas, porque los timeouts combinados pueden producir tiempos de espera impredecibles. La mayoría de los equipos dejan la espera implícita en cero y usan esperas explícitas en todas partes.
Errores comunes
Thread.sleepen lugar de una espera. Una pausa fija es o demasiado corta (flaky) o demasiado larga (lenta), y normalmente ambas cosas, según la máquina.- Esperar la presencia cuando necesitas visibilidad.
presenceOfElementLocatedse cumple en cuanto el nodo está en el DOM, aunque esté oculto. - Conservar un
WebElementa través de un re-render. Espera sobre un locatorBypara que el elemento se vuelva a buscar después de que cambie el DOM. - Crear una espera nueva con un timeout enorme en cada helper. Centraliza un valor por defecto sensato en tu framework.