Selenium: Fundamentos WebDriver

Selenium: fundamentos de Selenium WebDriver. Explora en detalle los conceptos esenciales de Selenium WebDriver, sus componentes y cómo implementarlo en proyectos de automatización de pruebas web.

Aprende Selenium GRATIS y certifícate

Selenium WebDriver constituye el núcleo del framework de Selenium, proporcionando una interfaz de programación completa para controlar el comportamiento de los navegadores web. A diferencia del componente Selenium IDE, WebDriver está diseñado para crear pruebas robustas mediante código, lo que permite una automatización mucho más sofisticada y personalizable.

La arquitectura de WebDriver en Selenium 4.29 implementa completamente el protocolo W3C WebDriver, estableciendo una comunicación estandarizada entre el código y los navegadores. Este protocolo define una API REST que proporciona una forma consistente de interactuar con diferentes navegadores, independientemente de su implementación interna.

El funcionamiento interno de WebDriver sigue un modelo cliente-servidor donde tu código Java actúa como cliente, enviando comandos a un servidor (el driver del navegador), que luego los traduce en acciones específicas dentro del navegador. Esta abstracción permite escribir código que funcione de manera consistente en distintos navegadores.

La interfaz principal en la API de WebDriver es WebDriver, que define los métodos fundamentales para la interacción con el navegador:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class EjemploWebDriver {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.ejemplo.com");
        
        // Navegar a otra URL
        driver.navigate().to("https://www.otroejemplo.com");
        
        // Navegar hacia atrás
        driver.navigate().back();
        
        // Navegar hacia adelante
        driver.navigate().forward();
        
        // Refrescar la página
        driver.navigate().refresh();
        
        // Cerrar el navegador
        driver.quit();
    }
}

En Selenium 4.29, la gestión de los controladores de navegador se ha simplificado enormemente. Ya no es necesario descargar y configurar manualmente los drivers (como chromedriver, geckodriver, etc.), gracias a la implementación del WebDriver Manager integrado. Este gestor detecta automáticamente la versión del navegador instalado y descarga el driver compatible:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class MultiplesNavegadores {
    public static void main(String[] args) {
        // Chrome - No se necesita System.setProperty
        WebDriver chromeDriver = new ChromeDriver();
        chromeDriver.quit();
        
        // Firefox - No se necesita System.setProperty
        WebDriver firefoxDriver = new FirefoxDriver();
        firefoxDriver.quit();
        
        // Edge - No se necesita System.setProperty
        WebDriver edgeDriver = new EdgeDriver();
        edgeDriver.quit();
    }
}

La configuración de los navegadores se realiza mediante clases de opciones específicas para cada navegador. Estas clases permiten personalizar diversos aspectos como el modo headless (sin interfaz gráfica), argumentos de línea de comandos, preferencias, extensiones y más:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class OpcionesNavegador {
    public static void main(String[] args) {
        ChromeOptions opciones = new ChromeOptions();
        
        // Ejecutar en modo headless (sin interfaz gráfica)
        opciones.addArguments("--headless=new");
        
        // Desactivar notificaciones
        opciones.addArguments("--disable-notifications");
        
        // Establecer tamaño de ventana personalizado
        opciones.addArguments("--window-size=1920,1080");
        
        // Iniciar navegador con las opciones configuradas
        WebDriver driver = new ChromeDriver(opciones);
        driver.get("https://www.ejemplo.com");
        driver.quit();
    }
}

Una de las mejoras más significativas en WebDriver 4.29 es el soporte mejorado para el manejo de ventanas y pestañas. La nueva API proporciona métodos intuitivos para trabajar con múltiples ventanas:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.chrome.ChromeDriver;

public class ManejoVentanas {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.ejemplo.com");
        
        // Guardar el identificador de la ventana original
        String ventanaOriginal = driver.getWindowHandle();
        
        // Abrir una nueva pestaña y cambiar a ella
        driver.switchTo().newWindow(WindowType.TAB);
        driver.get("https://www.segundoejemplo.com");
        
        // Abrir una nueva ventana y cambiar a ella
        driver.switchTo().newWindow(WindowType.WINDOW);
        driver.get("https://www.tercerejemplo.com");
        
        // Volver a la ventana original
        driver.switchTo().window(ventanaOriginal);
        
        // Cerrar todas las ventanas
        driver.quit();
    }
}

La gestión de tiempos de espera es crucial para crear pruebas estables con WebDriver. Selenium 4.29 ofrece tres tipos principales de esperas:

  • Esperas implícitas: establecen un tiempo máximo de espera para encontrar elementos
  • Esperas explícitas: permiten esperar condiciones específicas
  • Esperas fluidas: combinan esperas explícitas con una sintaxis más legible
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;
import java.util.NoSuchElementException;

public class TiemposEspera {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.ejemplo.com");
        
        // Espera implícita - afecta a todas las búsquedas de elementos
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        
        // Espera explícita - esperar hasta 20 segundos para una condición específica
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));
        WebElement elemento = wait.until(ExpectedConditions.elementToBeClickable(By.id("botonEnviar")));
        
        // Espera fluida - más personalizable
        Wait<WebDriver> esperaFluida = new FluentWait<>(driver)
                .withTimeout(Duration.ofSeconds(30))
                .pollingEvery(Duration.ofMillis(500))
                .ignoring(NoSuchElementException.class);
        
        WebElement elementoFluido = esperaFluida.until(d -> d.findElement(By.id("elementoDinamico")));
        
        driver.quit();
    }
}

El manejo de cookies y el almacenamiento del navegador es otra área donde WebDriver proporciona una API sólida. Esto es especialmente útil para probar escenarios que dependen de estados específicos de la sesión:

import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.Set;

public class ManejoCookies {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.ejemplo.com");
        
        // Añadir una cookie
        Cookie cookie = new Cookie.Builder("nombre", "valor")
                .domain("ejemplo.com")
                .path("/")
                .expiresOn(null)
                .isSecure(true)
                .isHttpOnly(true)
                .sameSite("Strict")
                .build();
        
        driver.manage().addCookie(cookie);
        
        // Obtener todas las cookies
        Set<Cookie> cookies = driver.manage().getCookies();
        cookies.forEach(c -> System.out.println(c.getName() + ": " + c.getValue()));
        
        // Obtener una cookie específica
        Cookie miCookie = driver.manage().getCookieNamed("nombre");
        
        // Eliminar una cookie
        driver.manage().deleteCookie(cookie);
        
        // Eliminar todas las cookies
        driver.manage().deleteAllCookies();
        
        driver.quit();
    }
}

Una característica de WebDriver es la capacidad de ejecutar JavaScript dentro del contexto de la página. Esto permite interactuar con elementos que podrían ser difíciles de manipular utilizando solo la API estándar de WebDriver:

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class EjecutorJavaScript {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.ejemplo.com");
        
        // Casting del driver a JavascriptExecutor
        JavascriptExecutor js = (JavascriptExecutor) driver;
        
        // Ejecutar JavaScript simple
        js.executeScript("console.log('Hola desde Selenium');");
        
        // Desplazarse a un elemento
        WebElement elemento = driver.findElement(By.id("elementoEnParte"));
        js.executeScript("arguments[0].scrollIntoView(true);", elemento);
        
        // Modificar el DOM
        js.executeScript("document.body.style.backgroundColor = 'lightblue';");
        
        // Obtener información de la página
        String titulo = (String) js.executeScript("return document.title;");
        Long altura = (Long) js.executeScript("return window.innerHeight;");
        
        driver.quit();
    }
}

WebDriver en Selenium 4.29 introduce soporte completo para la **a

Empezar curso de Selenium

Lecciones de este módulo de Selenium

Lecciones de programación del módulo Fundamentos WebDriver del curso de Selenium.