Estratégias de Espera no Selenium WebDriver com Python

Em aplicações web modernas, a utilização de tecnologias como AJAX e frameworks JavaScript assíncronos torna o carregamento de elementos dinâmico. Isso significa que nem todos os componentes de uma página estarão disponíveis imediatamente após o carregamento do HTML básico, o que frequentemente causa a exceção ElementNotVisibleException ou NoSuchElementException em scripts de automação. Para mitigar esses problemas, o Selenium oferece dois mecanismos principais de sincronização: Espera Explícita e Espera Implícita.

Espera Implícita (Implicit Wait)

A espera implícita define um tempo global para o WebDriver aguardar por qualquer elemento que não esteja imediatamente presente no DOM. Uma vez configurada, ela permanece ativa durante toda a vida útil da instância do navegador. Se o elemento for encontrado antes do tempo limite, a execução prossegue; caso contrário, uma exceção é lançada após o término do prazo.

from selenium import webdriver

# Inicializa o navegador
navegador = webdriver.Chrome()

# Define uma espera implícita de 20 segundos
navegador.implicitly_wait(20)

navegador.get("https://www.exemplo.com.br")
elemento = navegador.find_element_by_id("botao-dinamico")

Espera Explícita (Expilcit Wait)

A espera explícita é mais flexível e robusta, pois permite definir uma condição específica para um determinado elemento antes de prosseguir com o código. Ela utiliza a classe WebDriverWait em conjunto com o módulo expected_conditions.

Os principais parâmetros da classe WebDriverWait incluem:

  • driver: A instância do WebDriver.
  • timeout: O tempo máximo de espera.
  • poll_frequency: O intervalo entre as verificações (padrão de 0.5 segundos).
  • ignored_exceptions: Exceções ignoradas durante o período de espera.

O método principal é o until, que recebe um método de condição e aguarda até que o retorno não seja falso.

Exemplo Prático: Automação de Fluxo de Login

Abaixo, demonstramos a implementação de uma rotina de login utilizando esperas explícitas para garantir que os campos de entrada e botões estejam prontos para interação.

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Configuração do ambiente
driver_web = webdriver.Chrome()
driver_web.maximize_window()
driver_web.get("https://portal.exemplo.com/login")

# Instância de espera configurada para 15 segundos
aguardar = WebDriverWait(driver_web, 15)

try:
    # Aguarda até que o campo de usuário esteja presente no DOM
    campo_usuario = aguardar.until(
        EC.presence_of_element_located((By.NAME, "login_user"))
    )
    campo_usuario.clear()
    campo_usuario.send_keys("meu_usuario_automatizado")

    # Aguarda até que o campo de senha seja clicável
    campo_senha = aguardar.until(
        EC.element_to_be_clickable((By.ID, "password_field"))
    )
    campo_senha.send_keys("senha_segura_123")

    # Localiza e clica no botão de submissão
    botao_login = driver_web.find_element_by_xpath("//button[@type='submit']")
    botao_login.click()

    # Verificação de sucesso baseada no conteúdo da página
    aguardar.until(EC.title_contains("Dashboard"))
    
    conteudo_pagina = driver_web.page_source
    if "Bem-vindo" in conteudo_pagina:
        print("Autenticação realizada com sucesso!")
    else:
        print("Falha ao validar login.")

except Exception as erro:
    print(f"Ocorreu um erro durante a execução: {erro}")

finally:
    # Pequena pausa para observação e encerramento
    time.sleep(5)
    driver_web.quit()

A principal diferença entre os dois métodos é que, enquanto a espera implícita se aplica a todas as buscas de elementos de forma genérica, a espera explícita permite lidar com situações complexas, como aguardar que um elemento desapareça, que um texto específico apareça ou que um botão se torne habilitado para clique.

Tags: Selenium Python WebDriver WebAutomation Testing

Publicado em 7-25 21:52