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ícateSelenium 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
Lecciones de este módulo de Selenium
Lecciones de programación del módulo Fundamentos WebDriver del curso de Selenium.