Selenium con Python: automatización web completa

Publicado el: 11/07/2026
Tempo de leitura: 5 minutos
Automação web com Selenium usando Python

Selenium con Python permite controlar un navegador real desde un programa. Un script puede abrir páginas, pulsar botones, completar formularios, leer contenido visible, cambiar de pestaña, guardar capturas y comprobar que una aplicación funciona como se espera. Estas capacidades son útiles para pruebas de extremo a extremo, tareas administrativas repetitivas y procesos que no ofrecen una API.

En esta guía aprenderás a instalar Selenium, abrir Chrome, localizar elementos, usar esperas explícitas, trabajar con formularios, alertas, iframes y ventanas, integrar Pytest y mejorar la estabilidad del proyecto. Antes de automatizar un sitio externo, confirma que la actividad está permitida y evita generar una carga excesiva.

Cuándo utilizar Selenium

Selenium controla el navegador mediante WebDriver. A diferencia de Requests en Python, que se comunica directamente por HTTP, Selenium renderiza la página y ejecuta JavaScript. Por eso puede interactuar con interfaces dinámicas, menús, modales y elementos que aparecen después de cargar el HTML inicial.

Es una buena elección para probar inicios de sesión, búsquedas, procesos de compra, formularios y paneles internos. Para descargar una página pública estática, Requests y un analizador HTML suelen ser más rápidos. Selenium tampoco debe utilizarse para saltar CAPTCHAs, autenticación, límites de uso o controles de acceso.

La documentación oficial de Selenium es la referencia principal para WebDriver, selectores, opciones del navegador y cambios de API.

Instalar Selenium

Crea un entorno separado siguiendo la guía de venv en Python:

python -m venv .venv
python -m pip install selenium

Las versiones modernas incluyen Selenium Manager, que puede localizar o descargar un controlador compatible. En equipos corporativos, las políticas de red pueden impedirlo; en ese caso, revisa la configuración oficial del navegador y del controlador.

Abrir y cerrar el navegador

from selenium import webdriver


def main():
    driver = webdriver.Chrome()
    try:
        driver.get("https://example.com")
        print(driver.title)
    finally:
        driver.quit()


if __name__ == "__main__":
    main()

quit() cierra todas las ventanas y finaliza el proceso de WebDriver. El bloque finally garantiza la limpieza aunque falle un selector o una comprobación. La guía de try y except en Python explica esta estructura.

Ejecutar Chrome sin interfaz

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

opciones = Options()
opciones.add_argument("--headless=new")
opciones.add_argument("--window-size=1440,1000")

driver = webdriver.Chrome(options=opciones)

El modo headless resulta útil en servidores y sistemas de integración continua. Prueba primero con una ventana visible y define un tamaño realista, porque el diseño adaptable puede cambiar la posición de los elementos.

Localizar elementos

from selenium.webdriver.common.by import By

titulo = driver.find_element(By.TAG_NAME, "h1")
correo = driver.find_element(By.ID, "email")
boton = driver.find_element(
    By.CSS_SELECTOR,
    "button[type='submit']",
)

Prioriza identificadores estables o atributos dedicados a pruebas, como data-testid. Un selector CSS breve suele ser más mantenible que una ruta profunda. XPath es útil cuando necesitas relacionar elementos o buscar texto, pero no debe convertirse en una cadena frágil dependiente de cada contenedor visual.

Esperar elementos dinámicos

Una pausa fija con time.sleep() puede ser demasiado lenta en un equipo rápido y insuficiente en uno lento. Utiliza una espera explícita:

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

espera = WebDriverWait(driver, 10)
boton = espera.until(
    EC.element_to_be_clickable((By.ID, "login-button"))
)
boton.click()

La documentación oficial sobre esperas explica la diferencia entre esperas implícitas y explícitas. Evita mezclarlas sin una razón clara, porque los tiempos acumulados pueden resultar difíciles de interpretar.

Completar formularios

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

nombre = driver.find_element(By.ID, "name")
nombre.clear()
nombre.send_keys("Ana")

pais = Select(driver.find_element(By.ID, "country"))
pais.select_by_visible_text("España")

driver.find_element(
    By.CSS_SELECTOR,
    "button[type='submit']",
).click()

No guardes credenciales reales en el archivo. Utiliza variables de entorno y una cuenta de pruebas con permisos limitados. La guía sobre variables de entorno en Python muestra cómo separar secretos del código.

Comprobar el resultado

mensaje = espera.until(
    EC.visibility_of_element_located(
        (By.CLASS_NAME, "success-message")
    )
)
assert "guardado" in mensaje.text.lower()

Una automatización se convierte en prueba cuando valida un resultado esperado. Comprueba texto, URL, título, estado de un botón o contenido de un registro. Evita verificar detalles visuales sin importancia que cambian con frecuencia.

Integrar Selenium con Pytest

import pytest
from selenium import webdriver


@pytest.fixture
def driver():
    navegador = webdriver.Chrome()
    navegador.set_window_size(1440, 1000)
    yield navegador
    navegador.quit()


def test_titulo_pagina(driver):
    driver.get("https://example.com")
    assert "Example" in driver.title

La fixture crea un navegador nuevo y garantiza su cierre. La guía de Pytest para principiantes explica fixtures, descubrimiento de pruebas y excepciones esperadas.

Alertas, iframes y nuevas ventanas

Alertas JavaScript

alerta = espera.until(EC.alert_is_present())
print(alerta.text)
alerta.accept()

Iframe

espera.until(
    EC.frame_to_be_available_and_switch_to_it(
        (By.ID, "payment-frame")
    )
)
# Interacciones dentro del iframe.
driver.switch_to.default_content()

Nueva pestaña

original = driver.current_window_handle
espera.until(EC.number_of_windows_to_be(2))

nueva = next(
    identificador
    for identificador in driver.window_handles
    if identificador != original
)
driver.switch_to.window(nueva)

Antes de buscar el siguiente elemento, confirma que el navegador se encuentra en el contexto correcto.

Capturas de pantalla y diagnóstico

from pathlib import Path

carpeta = Path("artifacts")
carpeta.mkdir(exist_ok=True)
driver.save_screenshot(str(carpeta / "error-checkout.png"))

La guía de pathlib en Python ayuda a construir rutas portables. Cuando una prueba falla, guarda también la URL actual, el título y, cuando sea apropiado, el HTML de la página. Evita almacenar información privada innecesaria.

Patrón Page Object

Copiar los mismos selectores por muchas pruebas dificulta el mantenimiento. Un objeto de página agrupa localizadores y acciones:

from selenium.webdriver.common.by import By


class PaginaLogin:
    CORREO = (By.ID, "email")
    CLAVE = (By.ID, "password")
    ENVIAR = (By.CSS_SELECTOR, "button[type='submit']")

    def __init__(self, driver):
        self.driver = driver

    def iniciar_sesion(self, correo, clave):
        self.driver.find_element(*self.CORREO).send_keys(correo)
        self.driver.find_element(*self.CLAVE).send_keys(clave)
        self.driver.find_element(*self.ENVIAR).click()

Las pruebas pueden describir el comportamiento sin repetir detalles del HTML. Para comprender clases y métodos, revisa programación orientada a objetos en Python.

Errores frecuentes

  • NoSuchElementException: selector incorrecto, contexto equivocado o elemento todavía ausente.
  • ElementClickInterceptedException: un modal, aviso o capa de carga cubre el elemento.
  • StaleElementReferenceException: la página reconstruyó el nodo; localízalo de nuevo.
  • TimeoutException: la condición esperada no ocurrió dentro del plazo.
  • Pruebas inestables: datos compartidos, selectores visuales frágiles o dependencia entre pruebas.

No añadas reintentos automáticos como primera solución. Investiga el estado del navegador y conserva información suficiente para reproducir el fallo. Para registros estructurados, consulta la guía del módulo logging.

Buenas prácticas

  • Espera condiciones significativas, no segundos arbitrarios.
  • Usa selectores estables y específicos.
  • Mantén las pruebas independientes.
  • Crea y elimina datos de prueba de forma controlada.
  • Protege credenciales y datos personales.
  • Guarda capturas y registros al fallar.
  • Separa acciones de página, preparación y aserciones.

Conclusión

Selenium con Python funciona mejor cuando el proyecto usa selectores estables, esperas explícitas, limpieza garantizada y comprobaciones claras. Empieza con un único flujo visible, añade Pytest y capturas de diagnóstico, y después incorpora modo headless o ejecución en servidores. Una automatización fiable no depende de pausas largas ni de reintentos ciegos: observa el estado real de la aplicación y documenta cada fallo.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Criação de bot Telegram com Python
    Automatización y Scripts
    Foto de perfil de Leandro Hirt da Academify

    Cómo crear un bot de Telegram con Python

    Crea un bot de Telegram con Python: configura BotFather, protege el token, maneja comandos y mensajes, añade botones, archivos, logging

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026
    Geração de arquivos PDF usando biblioteca FPDF em Python
    Automatización y Scripts
    Foto de perfil de Leandro Hirt da Academify

    Cómo crear archivos PDF con Python y FPDF

    Aprende a crear PDF con Python y fpdf2: páginas, fuentes, párrafos, imágenes, tablas, Unicode, rutas, informes y manejo de errores.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026
    Logos do Python e Excel lado a lado representando a importação de dados do Excel para Python.
    Automatización y Scripts
    Foto de perfil de Leandro Hirt da Academify

    Cómo importar archivos Excel en Python con Pandas

    Importa archivos Excel en Python con Pandas y openpyxl: hojas, columnas, tipos, fechas, valores ausentes, limpieza y exportación.

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026
    Python e ícone de e-mail sobre teclado de notebook
    Automatización y Scripts
    Foto de perfil de Leandro Hirt da Academify

    Cómo automatizar correos electrónicos con Python

    Automatiza correos con Python usando EmailMessage y smtplib, variables de entorno, HTML, adjuntos, destinatarios múltiples y manejo de errores.

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026
    Logo do Python com o texto 'Python argparse CLI' abaixo
    Automatización y Scripts
    Foto de perfil de Leandro Hirt da Academify

    Cómo crear una CLI en Python con argparse

    Crea una CLI en Python con argparse: argumentos, banderas, tipos, choices, subcomandos, validación, pruebas y empaquetado moderno.

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026