Automatización de Interacciones Web con Selenium: Desplegables, Alertas y Desplazamiento

Manipulación de Menús Desplegables (Dropdowns)

Para interactuar con elementos <select> en HTML, Selenium proporciona la clase Select. Esta abstracción simplifica la selección de opciones sin necesidad de hacer clic directamente en cada elemento <option>.

Implementación y Métodos de Selección

El flujo de trabajo estándar implica importar la clase, localizar el nodo <select>, instanciar el objeto y aplicar el método de selección deseado.

from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By

# 1. Localizar el elemento contenedor del menú desplegable
dropdown_element = driver.find_element(By.ID, "selector_paises")

# 2. Instanciar la clase Select
menu = Select(dropdown_element)

# 3. Ejecutar selecciones mediante diferentes criterios
menu.select_by_index(2)                  # Selección por índice (inicia en 0)
menu.select_by_value("codigo_pais")      # Selección por el atributo 'value' de la opción
menu.select_by_visible_text("España")    # Selección por el texto visible en la UI

# 4. Inspeccionar el estado actual del desplegable
opcion_activa = menu.first_selected_option  # Obtiene el primer elemento seleccionado
lista_completa = menu.options               # Devuelve una lista con todos los nodos <option>

Gestión de Diálogos Emergentes (Alertas del Navegador)

Las ventanas nativas del navegador (JavaScript alerts) bloquean la ejecución del DOM hasta que son resueltas. Selenium maneja estos diálogos mediante el contexto de alerta, permitiendo leer su contenido, aceptar, cancelar o introducir texto.

Tipos de Diálogos y Operaciones Disponibles

  • Alert: Solo muestra un mensaje y un botón de aceptación.
  • Confirm: Muestra un mensaje con opciones de aceptar o cancelar.
  • Prompt: Solicita la entrada de texto por parte del usuario.

La interfaz de alerta expone las siguientes propiedades y métodos: text (retorna el mensaje), accept() (confirma), dismiss() (cancela) y send_keys() (inyecta texto en prompts).

Ejemplos de Interacción

# Interacción con un Alert estándar
driver.find_element(By.NAME, "trigger_alert").click()
popup_alerta = driver.switch_to.alert
print(f"Contenido de la alerta: {popup_alerta.text}")
popup_alerta.accept()

# Interacción con un Confirm
driver.find_element(By.NAME, "trigger_confirm").click()
popup_confirm = driver.switch_to.alert
print(f"Confirmación requerida: {popup_confirm.text}")
popup_confirm.dismiss()  # Simula presionar "Cancelar"

# Interacción con un Prompt
driver.find_element(By.NAME, "trigger_prompt").click()
popup_prompt = driver.switch_to.alert
popup_prompt.send_keys("Datos de prueba")
popup_prompt.accept()

Control de Desplazamiento y Gestos Táctiles

En aplicaciones web modernas, muchos elementos se cargan dinámicamente (lazy loading) o requieren que el usuario acepte términos legales desplazando la barra hasta el final. Dado que Selenium no tiene un método nativo para hacer scroll, se utiliza la inyección de JavaScript.

Desplazamiento mediante JavaScript

El objeto window del DOM permite manipular la vista actual. Se ejecuta mediante el método execute_script del WebDriver.

# Desplazar hasta el pie de página (altura máxima del documento)
script_al_final = "window.scrollTo(0, document.body.scrollHeight);"
driver.execute_script(script_al_final)

# Desplazar de vuelta a la parte superior
script_al_inicio = "window.scrollTo(0, 0);"
driver.execute_script(script_al_inicio)

# Desplazamiento a coordenadas absolutas específicas (x, y)
script_coordenadas = "window.scrollTo(500, 1500);"
driver.execute_script(script_coordenadas)

Gestos de Deslizamiento y Arrastre

Para entornos móviles o interacciones avanzadas de arrastre, se utilizan métodos basados en coordenadas o referencias de elementos.

  • Swipe (Deslizar): Requiere coordenadas de inicio y fin. No tiene inercia, el movimiento es directo entre los puntos.
  • Drag and Drop (Arrastrar y Soltar): Transfiere la posición de un elemento origen a un elemento destino.
# Deslizamiento táctil usando coordenadas (x_inicio, y_inicio, x_fin, y_fin)
coordenada_inicio_x, coordenada_inicio_y = 300, 1000
coordenada_fin_x, coordenada_fin_y = 300, 200
driver.swipe(coordenada_inicio_x, coordenada_inicio_y, coordenada_fin_x, coordenada_fin_y)

# Arrastrar un elemento y soltarlo sobre otro
nodo_origen = driver.find_element(By.ID, "item_arrastrable")
nodo_destino = driver.find_element(By.ID, "zona_soltado")
driver.drag_and_drop(nodo_origen, nodo_destino)

Etiquetas: Selenium Python Web-Automation ui-testing javascript-execution

Publicado el 7-7 02:30