Sobes.tech
Middle

Habla sobre algunos tipos de espera en Selenium.

sobes.tech AI

Respuesta de la IA

En Selenium Webdriver se utilizan diferentes tipos de esperas para sincronizar las acciones del script con la carga de la página web.

  1. Espera implícita (Implicit Wait): Establece el tiempo máximo durante el cual Selenium intentará encontrar un elemento en la página antes de lanzar una excepción NoSuchElementException. Se aplica globalmente a todas las operaciones de búsqueda de elementos después de su configuración.

    from selenium import webdriver
    
    # Crear una instancia del driver
    driver = webdriver.Chrome()
    
    # Establecer espera implícita (10 segundos)
    driver.implicitly_wait(10)
    
    # Las operaciones de búsqueda de elementos posteriores usarán esta espera
    # driver.get("http://example.com")
    # element = driver.find_element_by_id("some_id")
    
    # Cerrar el driver
    # driver.quit()
    
  2. Espera explícita (Explicit Wait): Define el tiempo máximo para cumplir una condición específica antes de lanzar una excepción TimeoutException. Se aplica a un elemento o condición concreta. Para usarla, se necesita la clase WebDriverWait y una de las "condiciones esperadas" predefinidas o 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
    
    # Crear una instancia del driver (no es necesaria espera implícita aquí, 
    # si se usa explícita para elementos específicos)
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Establecer espera explícita (10 segundos) para la presencia del elemento
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "some_id"))
        )
        # Acciones posteriores con el elemento
        # element.click()
    except:
        # Manejar la excepción si el elemento no se encontró en 10 segundos
        print("Elemento no encontrado en 10 segundos")
    
    # Establecer espera explícita para que el elemento sea clickeable
    try:
        clickable_element = WebDriverWait(driver, 15).until(
            EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
        )
        # clickable_element.click()
    except:
        print("El elemento no fue clickeable en 15 segundos")
    
    # Cerrar el driver
    # driver.quit()
    
  3. Espera flexible (Fluent Wait): Similar a la espera explícita, permite definir el tiempo máximo de espera y la condición. Además, permite especificar el intervalo de sondeo (polling interval) para verificar la condición y una lista de excepciones a ignorar durante la 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
    
    # Crear una instancia del driver
    driver = webdriver.Chrome()
    
    # driver.get("http://example.com")
    
    # Establecer espera flexible
    wait = FluentWait(driver, timeout=30, poll_frequency=5,
                      ignored_exceptions=[NoSuchElementException])
    
    try:
        element = wait.until(lambda driver: driver.find_element(By.ID, "some_id"))
        # Acciones posteriores con el elemento
        # element.click()
    except:
        print("Elemento no encontrado con la espera flexible")
    
    # Cerrar el driver
    # driver.quit()
    

Comparación:

Tipo de espera Aplicación Condición Flexibilidad Uso
Implícita Global Búsqueda de elemento Baja (solo tiempo) Configuración sencilla para todos los elementos
Explícita Específica Condición definida Alta (tiempo, condición) Espera por estados específicos de elementos
Flexible Específica Condición definida Máxima (tiempo, condición, intervalo, excepciones a ignorar) Escenarios complejos con manejo de errores