⚡ 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:

  1. Lentidão: Se o Ajax levar 100ms, você desperdiçou 1900ms.
  2. 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 WebDriverWait nã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. 🚀

⬅️ Capítulo Anterior | Próximo Capítulo ➡️