WebDriver con Python

Básico
Selenium
Selenium
Actualizado: 05/05/2026

Inicialización del WebDriver

flowchart LR
    Imp[from selenium import webdriver] --> Cls{Driver}
    Cls --> Ch[webdriver.Chrome]
    Cls --> FF[webdriver.Firefox]
    Cls --> Ed[webdriver.Edge]
    Cls --> Sf[webdriver.Safari]
    Ch --> Ctx["Context manager: with"]
    Ctx --> Get[driver.get url]
    Get --> Find["driver.find_element By.ID, val"]
    Find --> El[WebElement]
    El --> Click["click / send_keys"]
    Get --> Win[driver.window_handles]
    Get --> SS[save_screenshot path]
    Ctx --> Auto[Auto-close al salir del with]

La forma más correcta de gestionar el WebDriver en Python es usando el gestor de contexto (with), que garantiza que el navegador se cierre automáticamente aunque ocurra una excepción.

from selenium import webdriver

# Usando gestor de contexto (recomendado)
with webdriver.Chrome() as driver:
    driver.get("https://www.selenium.dev")
    print(driver.title)
# El navegador se cierra automáticamente al salir del bloque with

Si necesitas controlar manualmente el ciclo de vida:

from selenium import webdriver

driver = webdriver.Chrome()
try:
    driver.get("https://www.selenium.dev")
    print(driver.title)
finally:
    driver.quit()  # Cierra el navegador y libera recursos

Diferencia entre close() y quit()

driver.close()  # Cierra solo la pestaña/ventana activa
driver.quit()   # Cierra todas las ventanas y termina la sesión del WebDriver

Usa siempre quit() al final de la prueba para liberar completamente los recursos.

Información básica de la página

from selenium import webdriver

with webdriver.Chrome() as driver:
    driver.get("https://www.ejemplo.com")

    # Título de la página
    titulo = driver.title
    print(f"Título: {titulo}")

    # URL actual
    url_actual = driver.current_url
    print(f"URL: {url_actual}")

    # Código fuente HTML de la página
    fuente = driver.page_source
    print(f"Longitud del HTML: {len(fuente)} caracteres")

Navegación entre páginas

from selenium import webdriver

with webdriver.Chrome() as driver:
    # Navegar a una URL
    driver.get("https://www.ejemplo.com")

    # Navegar usando navigate().to() (equivalente a get())
    driver.get("https://www.ejemplo.com/pagina1")
    driver.get("https://www.ejemplo.com/pagina2")

    # Retroceder al historial
    driver.back()

    # Avanzar en el historial
    driver.forward()

    # Recargar la página actual
    driver.refresh()

Control de la ventana del navegador

from selenium import webdriver
from selenium.webdriver.common.window import WindowTypes

with webdriver.Chrome() as driver:
    driver.get("https://www.ejemplo.com")

    # Maximizar la ventana
    driver.maximize_window()

    # Minimizar la ventana
    driver.minimize_window()

    # Pantalla completa
    driver.fullscreen_window()

    # Establecer tamaño específico
    driver.set_window_size(1280, 720)

    # Establecer posición
    driver.set_window_position(0, 0)

    # Obtener el tamaño actual
    tamaño = driver.get_window_size()
    print(f"Ancho: {tamaño['width']}, Alto: {tamaño['height']}")

    # Obtener la posición actual
    posicion = driver.get_window_position()
    print(f"X: {posicion['x']}, Y: {posicion['y']}")

Gestión de múltiples ventanas y pestañas

Cuando una acción abre una nueva ventana o pestaña, el WebDriver sigue en el contexto original. Para interactuar con la nueva ventana debes cambiar el window handle.

from selenium import webdriver
from selenium.webdriver.common.by import By

with webdriver.Chrome() as driver:
    driver.get("https://www.ejemplo.com")

    # Guardar el handle de la ventana original
    ventana_original = driver.current_window_handle

    # Abrir una nueva pestaña haciendo clic en un enlace con target="_blank"
    driver.find_element(By.LINK_TEXT, "Abrir en nueva pestaña").click()

    # Obtener todos los window handles disponibles
    todos_los_handles = driver.window_handles
    print(f"Ventanas abiertas: {len(todos_los_handles)}")

    # Cambiar a la nueva pestaña
    for handle in todos_los_handles:
        if handle != ventana_original:
            driver.switch_to.window(handle)
            break

    print(f"URL de la nueva pestaña: {driver.current_url}")

    # Cerrar la nueva pestaña y volver a la original
    driver.close()
    driver.switch_to.window(ventana_original)

    print(f"De vuelta en: {driver.current_url}")

Abrir una nueva pestaña con JavaScript

from selenium import webdriver

with webdriver.Chrome() as driver:
    driver.get("https://www.ejemplo.com")

    # Abrir una nueva pestaña vacía usando JavaScript
    driver.execute_script("window.open('');")

    # Cambiar a la nueva pestaña (el último handle)
    nueva_pestaña = driver.window_handles[-1]
    driver.switch_to.window(nueva_pestaña)

    # Navegar en la nueva pestaña
    driver.get("https://www.selenium.dev")
    print(f"Nueva pestaña: {driver.title}")

Gestión de frames e iframes

Los frames e iframes son documentos HTML incrustados dentro de otro documento. Para interactuar con elementos dentro de un frame, primero debes cambiar el contexto al frame.

from selenium import webdriver
from selenium.webdriver.common.by import By

with webdriver.Chrome() as driver:
    driver.get("https://www.ejemplo.com/con-frames")

    # Cambiar al frame por índice (0 = primer frame)
    driver.switch_to.frame(0)

    # Cambiar al frame por nombre o ID
    driver.switch_to.frame("nombre-del-frame")

    # Cambiar al frame por WebElement
    frame_elemento = driver.find_element(By.CSS_SELECTOR, "iframe.mi-frame")
    driver.switch_to.frame(frame_elemento)

    # Ahora puedes interactuar con elementos dentro del frame
    elemento_en_frame = driver.find_element(By.ID, "campo-en-frame")
    elemento_en_frame.send_keys("Texto dentro del frame")

    # Volver al contexto principal (fuera del frame)
    driver.switch_to.default_content()

    # Cambiar al frame padre (si hay frames anidados)
    driver.switch_to.parent_frame()

Capturas de pantalla

from selenium import webdriver
from selenium.webdriver.common.by import By

with webdriver.Chrome() as driver:
    driver.get("https://www.selenium.dev")

    # Guardar captura de pantalla en un archivo
    driver.save_screenshot("captura_pagina.png")

    # Obtener captura como bytes (útil para adjuntar a reportes)
    captura_bytes = driver.get_screenshot_as_png()

    # Obtener captura como base64 (útil para HTML/JSON)
    captura_base64 = driver.get_screenshot_as_base64()

    # Captura de un elemento específico
    elemento = driver.find_element(By.ID, "mi-elemento")
    elemento.screenshot("captura_elemento.png")

Obtener atributos y propiedades de la página

from selenium import webdriver

with webdriver.Chrome() as driver:
    driver.get("https://www.selenium.dev")

    # Obtener cookies de la sesión
    cookies = driver.get_cookies()
    for cookie in cookies:
        print(f"Cookie: {cookie['name']} = {cookie['value']}")

    # Ejecutar JavaScript en la página
    altura_scroll = driver.execute_script("return document.body.scrollHeight;")
    print(f"Altura total de la página: {altura_scroll}px")

    # Obtener la capacidad del driver
    capacidades = driver.capabilities
    print(f"Navegador: {capacidades['browserName']} {capacidades.get('browserVersion', '')}")

Ejemplo completo: prueba de navegación

import pytest
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


def test_navegacion_basica():
    """Prueba básica de navegación con múltiples páginas."""
    with webdriver.Chrome() as driver:
        driver.maximize_window()

        # Página principal
        driver.get("https://www.selenium.dev")
        assert "Selenium" in driver.title

        # Captura para documentación
        driver.save_screenshot("inicio.png")

        # Navegar a documentación
        driver.get("https://www.selenium.dev/documentation/")
        assert driver.current_url == "https://www.selenium.dev/documentation/"

        # Volver a la página anterior
        driver.back()
        assert "selenium.dev" in driver.current_url

        # Avanzar de nuevo
        driver.forward()

        print(f"Test completado. URL final: {driver.current_url}")

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en Selenium

Documentación oficial de Selenium
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Selenium es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Selenium

Explora más contenido relacionado con Selenium y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

Inicializar y cerrar WebDriver correctamente usando el gestor de contexto de Python. Navegar entre páginas y gestionar el historial del navegador. Controlar el tamaño y posición de la ventana del navegador. Gestionar múltiples ventanas y pestañas con window handles. Cambiar el contexto de ejecución a frames e iframes. Tomar capturas de pantalla de página completa y de elementos individuales.