Selenium y condiciones esperadas

Javi AS
3 min readJul 28, 2023

--

En uno de los últimos proyectos en los que participé, tuve que implementar Selenium para automatizar una serie de acciones en portales de ámbito nacional que no están muy cuidados, como ya sabrá cualquier ciudadano que haya realizado algún trámite en ellos.

Logotipo de Selenium

Para quien no lo conozca, Selenium es un proyecto de código abierto que permite automatizar un navegador web realizando determinadas acciones definidas por programación. Se encuentra disponible para una gran variedad de lenguajes de programación y su utilidad principal sería realizar pruebas automáticas, esto podría ser:

  • Navegar a una aplicación web, realizar login y comprobar que puedes acceder a tu perfil.
  • En un comercio electrónico, asegurar que todos los pasos desde añadir un producto al carrito hasta el checkout funcionan adecuadamente.
  • Realizar pruebas de rendimiento en un sitio web.

Las posibilidades, en este sentido, son tan grandes como la imaginación de quien escriba las pruebas.

Durante el ejercicio mencionado al principio, una de las características que tuve que indagar fueron las condiciones esperadas, y es que el automatismo necesitaba que ocurriera algo en el sitio web para poder seguir avanzando. Utilizar un tiempo de espera genérico terminaría afectando al rendimiento y no aseguraría siempre un buen resultado, aquí entran en juego las condiciones de espera, unas funciones muy buenas para ayudar en estos casos. A continuación listo algunos ejemplos.

Esperar a que haya más de una pestaña abierta:

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

driver = webdriver.Chrome()
driver.get("https://www.mytestsite.com")

# Encontrar y hacer click en un botón que abra nueva pestaña.
driver.find_element_by_id("open_in_new_tab").click()

# Espera hasta que el número de pestañas sea 2.
WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))

# Cambiar el driver a la nueva pestaña.
driver.switch_to.window(driver.window_handles[1])

Esperar a que un elemento sea visible en la página:

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

driver = webdriver.Chrome()
driver.get("https://www.mytestsite.com")

# Esperar hasta que el elemento sea visible en la página.
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "delayed_element")))

# Suponiendo que esperamos hasta que aparezca un elemento <input/>
# Escribir en el elemento una vez ha aparecido.
driver.find_element_by_id("delayed_element").send_keys("Sin la espera anterior esta línea daría error")

Esperar a que NO se cumpla una serie de condiciones esperadas:

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

driver = webdriver.Chrome()
driver.get("https://www.mytestsite.com")

# Encontrar todos los elementos con la clase "btn".
elements = driver.find_elements(By.CLASS_NAME, "btn")

# Esperar hasta que ninguno de los elementos tenga el texto "Cargando"
WebDriverWait(driver, 10).until(EC.none_of(elements, EC.text_to_be_present_in_element("Cargando")))

# Hacer click en uno de los botones una vez ha cargado y cambiado su aspecto
elements[0].click()

Como se puede ver, las condiciones esperadas permiten definir de forma bastante concreta qué esperamos que ocurra en un sitio web y así poder planear una prueba automática coherente. Hay un mayor listado de funciones de espera, pero creo que con esta pequeña pincelada ya se le puede dar juego al tema.

Referencias

--

--

Javi AS
0 Followers

Entusiasta de la tecnología y del aprendizaje continuo.