Sobes.tech
Middle

Fale sobre alguns tipos de espera no Selenium.

sobes.tech IA

Resposta da IA

No Selenium Webdriver, são utilizados diferentes tipos de esperas para sincronizar as ações do script com o carregamento da página web.

  1. Espera implícita (Implicit Wait): Define o tempo máximo durante o qual o Selenium tentará encontrar um elemento na página antes de lançar uma exceção NoSuchElementException. Aplica-se globalmente a todas as operações de busca de elementos após a sua configuração.

    from selenium import webdriver
    
    # Criar uma instância do driver
    driver = webdriver.Chrome()
    
    # Definir espera implícita (10 segundos)
    driver.implicitly_wait(10)
    
    # As operações de busca de elementos subsequentes usarão esta espera
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # Fechar o driver
    # driver.quit()
    
  2. Espera explícita (Explicit Wait): Define o tempo máximo para cumprir uma condição específica antes de lançar uma exceção TimeoutException. Aplica-se a um elemento ou condição concreta. Para usá-la, é necessária a classe WebDriverWait e uma das "condições esperadas" predefinidas ou personalizadas.

    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
    
    # Criar uma instância do driver (não é necessária espera implícita aqui, 
    # se usar explícita para elementos específicos)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Definir espera explícita (10 segundos) para a presença do elemento
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # Ações posteriores com o elemento
        # element.click()
    except:
        # Lidar com exceção se o elemento não for encontrado em 10 segundos
        print("Elemento não encontrado em 10 segundos")
    
    # Definir espera explícita para que o elemento seja clicável
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("Elemento não se tornou clicável em 15 segundos")
    
    # Fechar o driver
    # driver.quit()
    
  3. Espera fluida (Fluent Wait): Semelhante à espera explícita, permite definir o tempo máximo de espera e a condição. Além disso, permite especificar o intervalo de sondagem (polling interval) para verificar a condição e uma lista de exceções a ignorar durante a espera.

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import FluentWait
    from selenium.common.exceptions import NoSuchElementException
    
    # Criar uma instância do driver
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Definir espera fluida
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # Ações posteriores com o elemento
        # element.click()
    except:
        print("Elemento não encontrado com a espera fluida")
    
    # Fechar o driver
    # driver.quit()
    

Comparação:

Tipo de espera Aplicação Condição Flexibilidade Uso
Implicita Global Pesquisa de elemento Baixa (apenas tempo) Configuração simples para todos os elementos
Explícita Específica Condição definida Alta (tempo, condição) Espera por estados específicos de elementos
Flexível Específica Condição definida Máxima (tempo, condição, intervalo, exceções a ignorar) Cenários de espera complexos com manipulação de erros