⚡ 5.8 Ajax e Sincronismo com Selenium 4
Interfaces modernas usam Ajax para carregar dados sem recarregar a página. Isso gera uma “corrida” (Race Condition) entre o seu teste e o servidor. Se o teste tentar validar um dado antes do Ajax terminar, você terá um False Negative.
🏗️ O Erro Comum: Thread.sleep()
Muitos desenvolvedores usam Thread.sleep(2000) para esperar. Isso é péssimo:
- Lentidão: Se o Ajax levar 100ms, você desperdiçou 1900ms.
- Instabilidade: Se o servidor demorar 2100ms por causa de rede, o teste quebra.
🧪 A Solução Profissional: WebDriverWait
No Selenium 4, utilizamos o WebDriverWait com a classe Duration para esperar apenas o tempo necessário.
📄 src/test/java/…/pages/DetalhesLeilaoPage.java
public boolean existeLance(String usuario, double valor) {
// ⏱️ Espera Explícita (Recomendado)
var wait = new WebDriverWait(driver, Duration.ofSeconds(10));
// Aguarda até que o texto do novo lance apareça no DOM
wait.until(ExpectedConditions.textToBePresentInElementLocated(
By.id("lista-lances"), usuario
));
return driver.getPageSource().contains(String.valueOf(valor));
}📊 Ciclo de Espera Inteligente
sequenceDiagram participant T as Teste Selenium participant B as Browser (DOM) participant S as Servidor T->>B: Clique no Botão "Lance" B->>S: Requisição Assíncrona (Ajax) T->>T: Inicia WebDriverWait (Polling) Note over T: Pergunta a cada 500ms... S-->>B: Retorna Dados B->>B: Insere Novo Lance no HTML T->>B: Detectou Elemento! ✨ T->>T: Segue para a Validação
Polling System 🛡️
O
WebDriverWaitnão fica “parado”. Ele consulta o navegador repetidamente até que a condição seja verdadeira. Assim que o Ajax termina, o teste continua imediatamente, otimizando o tempo total da bateria. 🏁
Dica de Ouro ⚡
Condições úteis para
ExpectedConditions:
visibilityOfElementLocated: Espera o elemento ser visível.elementToBeClickable: Espera o botão estar habilitado para clique.invisibilityOfElementLocated: Espera um “Loading…” sumir da tela. 🚀