Espera com Thread.sleep()
A primeira abordagem é o uso do método estático Thread.sleep(), que pausa a execução da thread atual por um tempo determinado em milissegundos. Essa espera é rígida e não depende de nenhum estado do navegador ou elemento.
// Pausa a execução por 3 segundos
Thread.sleep(3000);
// Fecha completamente o driver e a sessão
driver.quit();
Embora simples, essa estratégia não é recomendada para automação robusta, pois impõe uma espera fixa mesmo quando o elemento já estiver disponível, aumentando desnecessariamente o tempo de execução dos testes. É mais útil em fases de depuração.
Espera Implícita (Implicit Wait)
A espera implícita define um tempo máximo global para o WebDriver procurar um elemento no DOM caso ele não seja encontrado imediatamente. Durante esse período, o driver verifica periodicamente a presença do elemanto.
System.setProperty("webdriver.chrome.driver", "E:\\chromedriver.exe");
driver = new ChromeDriver();
// Define uma espera implícita de até 10 segundos para todos os elementos
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Essa configuração se aplica a todas as chamadas subsequentes de findElement(). Se o elemento for encontrado antes do tempo limite, a execução prossegue imediatamenet. Caso contrário, após exceder o tempo, será lançada uma NoSuchElementException.
Vantagens: fácil de configurar e aplicável globalmente. Desvantagem: pode mascarar problemas de sincronização e não é eficaz para situações onde se espera por condições específicas, como visibilidade ou clicabilidade.
Espera Explícita (Explicit Wait)
A espera explícita permite definir condições personalizadas e tempos de espera específicos para determinados elementos. Usa a classe WebDriverWait combinada com predicados do ExpectedConditions para aguardar estados desejados.
driver.get("http://www.baidu.com");
// Cria uma ação de mouse para interagir com elementos
Actions actions = new Actions(driver);
WebElement moreProducts = driver.findElement(By.xpath("//a[text()='Mais Produtos']"));
actions.moveToElement(moreProducts).perform();
// Aguarda até que o link 'Todos os Produtos >>' esteja presente no DOM
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath("//a[text()='Todos os Produtos >>']")));
// Após o elemento estar presente, clica no item 'Música'
WebElement musicLink = driver.findElement(By.xpath("//a[text()='Música']"));
musicLink.click();
// Valida o título da página carregada
assertEquals("Música MilMil - Ouça o Mundo", driver.getTitle());
Outro exemplo comum:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
// Aguarda até que o elemento especificado esteja presente no DOM
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("elemento-id")));
A espera explícita é a técnica mais flexível e confiável. Por padrão, ela verifica a condição a cada 500 ms. É especialmente útil para esperar por elementos dinâmicos, animações ou requisições assíncronas (como AJAX).
Recomenda-se priorizar a espera explícita em testes automatizados, pois oferece maior precisão, reduz falhas esporádicas e melhora a manutenção dos scripts.