Mecanismos de espera de Selenium

En Selenium, los mecanismos de espera son clave para garantizar que los elementos de la página se carguen por completo antes de realizar operaciones.

Debido a que la velocidad de carga de una página web se ve afectada por factores como la red y el rendimiento del servidor, operar directamente sobre elementos que aún no se han cargado puede provocar fallos en el script.

Selenium proporciona varios mecanismos de espera para resolver este problema.

1. Espera implícita (implicitly_wait)

1.1 ¿Qué es la espera implícita?

La espera implícita es un mecanismo de espera global que espera un cierto tiempo al buscar elementos. Si se encuentra el elemento dentro del tiempo especificado, Selenium continúa inmediatamente con las operaciones posteriores; si no se encuentra incluso después del tiempo de espera, se lanzará unaNoSuchElementExceptionexcepción.

1.2 ¿Cómo usar la espera implícita?

La espera implícita se establece a través delimplicitly_wait()método. Este método solo necesita llamarse una vez, y todas las operaciones de búsqueda de elementos posteriores seguirán este tiempo de espera.

Ejemplo

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService

# Establecer la ruta correcta del controlador
service = ChromeService(executable_path="./chromedriver-mac-arm64/chromedriver")
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)

# Establecer el tiempo de espera implícito en 10 segundos
driver.implicitly_wait(10)

# Abrir la página web
driver.get("https://example.com")

# Buscar elemento
element = driver.find_element_by_id("element_id")

# Cerrar el navegador
driver.quit()

1.3 Ventajas y desventajas de la espera implícita

Ventajas:

  • Simple y fácil de usar, solo necesita configurarse una vez y se aplica a todas las operaciones de búsqueda de elementos.
  • Adecuada para la mayoría de escenarios simples.

Desventajas:

  • Es una espera global, puede causar tiempos de espera innecesarios.
  • No puede manejar ciertas condiciones de espera complejas, como esperar a que un elemento se vuelva cliqueable.

2. Espera explícita (WebDriverWait y expected_conditions)

2.1 ¿Qué es la espera explícita?

La espera explícita es un mecanismo de espera más flexible que permite establecer condiciones de espera para operaciones específicas. La espera explícita generalmente se usa junto conWebDriverWaitla clase y elexpected_conditionsmódulo.

2.2 ¿Cómo usar la espera explícita?

El uso básico de la espera explícita es el siguiente:

Ejemplo

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Establecer la ruta correcta del controlador
service = ChromeService(executable_path="./chromedriver-mac-arm64/chromedriver")
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)

# Abrir la página web
driver.get("https://example.com")

# Configurar la espera explícita, esperar hasta 10 segundos hasta que el elemento aparezca
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "element_id"))
)

# Cerrar el navegador
driver.quit()

2.3 expected_conditions más comunes

expected_conditionsEl módulo proporciona varias condiciones de espera predefinidas. A continuación se presentan algunas condiciones comunes:

  • presence_of_element_located: Esperar a que el elemento aparezca en el DOM.
  • visibility_of_element_located: Esperar a que el elemento aparezca en el DOM y sea visible.
  • element_to_be_clickable: Esperar a que el elemento sea cliqueable.
  • text_to_be_present_in_element: Esperar a que el texto del elemento contenga el texto especificado.

2.4 Ventajas y desventajas de la espera explícita

Ventajas:

  • Alta flexibilidad, se pueden establecer diferentes condiciones de espera para diferentes operaciones.
  • Puede manejar escenarios de espera complejos.

Desventajas:

  • El código es relativamente complejo y requiere más cantidad de código.
  • Es necesario configurar condiciones de espera por separado para cada operación.

3. Espera fija (time.sleep)

3.1 ¿Qué es la espera fija?

La espera fija es el mecanismo de espera más simple; mediantetime.sleep()el método se pausa la ejecución del script durante el tiempo especificado. Independientemente de si la página se ha cargado por completo, el script esperará el tiempo especificado antes de continuar.

3.2 ¿Cómo usar la espera fija?

Ejemplo

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService

# Establecer la ruta correcta del controlador
service = ChromeService(executable_path="./chromedriver-mac-arm64/chromedriver")
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)

# Abrir la página web
driver.get("https://example.com")

# Espera fija de 5 segundos
time.sleep(5)

# Buscar elemento
element = driver.find_element_by_id("element_id")

# Cerrar el navegador
driver.quit()

3.3 Ventajas y desventajas de la espera fija

Ventajas:

  • Simple y fácil de usar, adecuada para escenarios de prueba simples.

Desventajas:

  • Ineficiente, puede provocar tiempos de espera innecesarios.
  • No puede ajustar dinámicamente el tiempo de espera según el estado de carga de la página.

4. Fluent Wait

Función:Establece dinámicamente condiciones de espera, permite personalizar la frecuencia de sondeo e ignorar excepciones específicas.

Método:WebDriverWait combinado con polling_every e ignoring

Características:Más flexible, adecuado para escenarios que necesitan ajustar dinámicamente el tiempo de espera.

Ejemplo

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException

# Establecer la ruta correcta del controlador
service = ChromeService(executable_path="./chromedriver-mac-arm64/chromedriver")
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)

driver.get("https://www.example.com")

# Configurar Fluent Wait
wait = WebDriverWait(driver, timeout=10, poll_frequency=1, ignored_exceptions=[NoSuchElementException])
element = wait.until(EC.presence_of_element_located((By.ID, "username")))

5. Resumen

  • Espera implícita: Adecuada para escenarios simples, espera global, pero puede provocar tiempos de espera innecesarios.
  • Espera explícita: Adecuada para escenarios complejos, alta flexibilidad, pero el código es relativamente complejo.
  • Espera fija: Simple y fácil de usar, pero ineficiente; no se recomienda en escenarios de prueba complejos.
  • Fluent Wait:: Adecuada para escenarios que requieren ajustar dinámicamente el tiempo de espera.

En las pruebas automatizadas reales, se recomienda elegir el mecanismo de espera adecuado según las necesidades específicas de la prueba. En general, la espera explícita es la más recomendada, ya que ofrece una mejor flexibilidad y eficiencia.


6. Ejemplo completo

A continuación se muestra un ejemplo completo de cómo usar la espera implícita y la espera explícita:

Ejemplo

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Establecer la ruta correcta del controlador
service = ChromeService(executable_path="./chromedriver-mac-arm64/chromedriver")
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)

# Configurar la espera implícita
driver.implicitly_wait(5)

# Abrir la página web
driver.get("https://www.example.com")

# Usar la espera explícita para esperar a que el elemento sea visible
username = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.ID, "username"))
)
username.send_keys("testuser")

# Usar la espera explícita para esperar a que el elemento sea cliqueable
submit_button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.ID, "submit-btn"))
)
submit_button.click()

# Cerrar el navegador
driver.quit()
Otras extensiones