Glossário · Automação de UI
Espera explícita (explicit wait)
Em inglês: Explicit wait
Também chamado de: esperas explícitas, WebDriverWait, FluentWait
Definição
Uma espera que verifica repetidamente uma condição específica, como um elemento ficar clicável, até um timeout. No Selenium ela é escrita com WebDriverWait.
Uma espera explícita pausa o teste até que uma condição específica seja verdadeira, verificando repetidamente e falhando com timeout se a condição nunca for atendida. Ela é “explícita” porque você a escreve exatamente no ponto em que o teste precisa esperar e diz pelo que esperar. No Selenium 4, isso significa WebDriverWait combinado com uma condição de ExpectedConditions ou uma lambda.
Exemplo (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 padrão, o WebDriverWait faz polling a cada 500 ms e ignora NotFoundException enquanto isso. Para outro intervalo ou para ignorar exceções adicionais, use FluentWait (withTimeout, pollingEvery, ignoring).
Diferença em relação à espera implícita
A espera implícita é uma única configuração global que faz toda chamada de findElement consultar até o elemento existir. Ela não sabe nada sobre visibilidade, se o elemento é clicável ou sobre texto. A espera explícita mira uma condição em um ponto do teste, então consegue esperar exatamente pelo estado de que você precisa, como um spinner desaparecer ou um botão ficar habilitado.
A documentação do Selenium alerta contra misturar as duas, porque timeouts combinados podem gerar tempos de espera imprevisíveis. A maioria dos times mantém a espera implícita em zero e usa esperas explícitas em todo lugar.
Erros comuns
Thread.sleepem vez de uma espera. Um sleep fixo é curto demais (flaky) ou longo demais (lento), e normalmente as duas coisas, dependendo da máquina.- Esperar presença quando você precisa de visibilidade.
presenceOfElementLocatedpassa assim que o nó está no DOM, mesmo que esteja oculto. - Guardar um
WebElementatravés de uma nova renderização. Espere usando um locatorBy, para que o elemento seja encontrado de novo depois que o DOM mudar. - Criar uma nova espera com timeout enorme em cada helper. Centralize um padrão razoável no seu framework.