Qué son las cookies en el contexto de pruebas
Las cookies son pequeños fragmentos de información que los servidores web almacenan en el navegador del usuario. En el contexto de las pruebas automatizadas, gestionar cookies permite:
- Simular sesiones autenticadas sin pasar por el flujo de login en cada test
- Verificar que la aplicación gestiona correctamente las cookies de sesión
- Establecer preferencias o configuración de usuario para el test
- Probar comportamientos que dependen de cookies específicas (idioma, región, consentimiento)
Leer cookies
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Set;
WebDriver driver = new ChromeDriver();
// IMPORTANTE: primero debes navegar al dominio
driver.get("https://www.ejemplo.com");
// Obtener TODAS las cookies de la sesión actual
Set<Cookie> todasLasCookies = driver.manage().getCookies();
System.out.println("Número de cookies: " + todasLasCookies.size());
for (Cookie cookie : todasLasCookies) {
System.out.printf(
"Nombre: %-20s | Valor: %-30s | Dominio: %s%n",
cookie.getName(),
cookie.getValue(),
cookie.getDomain()
);
}
// Obtener una cookie específica por nombre
Cookie cookieSesion = driver.manage().getCookieNamed("session_id");
if (cookieSesion != null) {
System.out.println("Token de sesión: " + cookieSesion.getValue());
System.out.println("Expira: " + cookieSesion.getExpiry());
System.out.println("HttpOnly: " + cookieSesion.isHttpOnly());
System.out.println("Secure: " + cookieSesion.isSecure());
}
driver.quit();
Añadir cookies
Para añadir cookies, el navegador debe haber navegado primero al dominio correspondiente. No puedes añadir cookies para un dominio desde una página diferente.
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Date;
WebDriver driver = new ChromeDriver();
// Navegar primero al dominio (obligatorio antes de añadir cookies)
driver.get("https://www.ejemplo.com");
// Cookie simple
Cookie cookieSimple = new Cookie("usuario_preferencia", "modo_oscuro");
driver.manage().addCookie(cookieSimple);
// Cookie con todos los atributos
Date fechaExpiracion = new Date(System.currentTimeMillis() + 3600000L); // +1 hora
Cookie cookieCompleta = new Cookie.Builder("token_acceso", "abc123xyz")
.domain("ejemplo.com")
.path("/")
.expiresOn(fechaExpiracion)
.isSecure(false)
.isHttpOnly(true)
.build();
driver.manage().addCookie(cookieCompleta);
// Verificar que se añadió correctamente
Cookie cookieLeida = driver.manage().getCookieNamed("token_acceso");
System.out.println("Cookie añadida: " + cookieLeida.getValue());
// Recargar la página para que el servidor vea las nuevas cookies
driver.navigate().refresh();
driver.quit();
Eliminar cookies
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
WebDriver driver = new ChromeDriver();
driver.get("https://www.ejemplo.com");
// Eliminar una cookie específica por nombre
driver.manage().deleteCookieNamed("cookie_marketing");
// Eliminar una cookie pasando el objeto Cookie
Cookie cookieAEliminar = driver.manage().getCookieNamed("preferencia_idioma");
if (cookieAEliminar != null) {
driver.manage().deleteCookie(cookieAEliminar);
}
// Eliminar TODAS las cookies de la sesión
driver.manage().deleteAllCookies();
// Verificar que se eliminaron
Set<Cookie> cookies = driver.manage().getCookies();
System.out.println("Cookies restantes: " + cookies.size()); // 0
driver.quit();
Caso de uso: simular sesión autenticada
Una técnica muy útil en testing es inyectar la cookie de sesión en lugar de hacer el login completo en cada test. Esto acelera enormemente la ejecución de la suite y reduce la dependencia de la UI del login.
import org.junit.jupiter.api.*;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import static org.junit.jupiter.api.Assertions.*;
class PruebasConSesionTest {
private static String tokenSesion;
private WebDriver driver;
@BeforeAll
static void obtenerTokenSesion() {
// Hacer login una sola vez para obtener el token
WebDriver driverLogin = new ChromeDriver();
try {
driverLogin.get("https://www.ejemplo.com/login");
driverLogin.findElement(By.id("email")).sendKeys("admin@ejemplo.com");
driverLogin.findElement(By.id("password")).sendKeys("password123");
driverLogin.findElement(By.id("btn-login")).click();
// Esperar a que se establezca la cookie de sesión
new WebDriverWait(driverLogin, Duration.ofSeconds(10))
.until(d -> d.manage().getCookieNamed("session_token") != null);
tokenSesion = driverLogin.manage()
.getCookieNamed("session_token")
.getValue();
} finally {
driverLogin.quit();
}
}
@BeforeEach
void setUp() {
driver = new ChromeDriver();
driver.manage().window().maximize();
}
@AfterEach
void tearDown() {
if (driver != null) {
driver.quit();
}
}
private void inyectarSesion() {
// Navegar al dominio primero (requerido antes de añadir cookies)
driver.get("https://www.ejemplo.com");
// Inyectar el token de sesión obtenido en @BeforeAll
Cookie cookieSesion = new Cookie.Builder("session_token", tokenSesion)
.domain("ejemplo.com")
.path("/")
.build();
driver.manage().addCookie(cookieSesion);
// Navegar al dashboard directamente (ya autenticado)
driver.get("https://www.ejemplo.com/dashboard");
}
@Test
void debeAccederAlDashboardConSesionInyectada() {
inyectarSesion();
// Ya estamos autenticados sin haber pasado por el login
assertTrue(driver.getCurrentUrl().contains("/dashboard"));
}
@Test
void debeMostrarPerfil() {
inyectarSesion();
driver.get("https://www.ejemplo.com/perfil");
assertFalse(driver.findElement(By.id("nombre-usuario")).getText().isEmpty());
}
}
Gestionar cookies entre dominios y subdominios
WebDriver driver = new ChromeDriver();
driver.get("https://app.ejemplo.com");
// Cookie para el dominio raíz (accesible desde todos los subdominios)
Cookie cookieDominioRaiz = new Cookie.Builder("usuario_id", "12345")
.domain(".ejemplo.com") // El punto inicial hace que aplique a subdominios
.path("/")
.build();
driver.manage().addCookie(cookieDominioRaiz);
// Cookie solo para el subdominio actual
Cookie cookieSubdominio = new Cookie.Builder("app_config", "v2")
.domain("app.ejemplo.com")
.path("/")
.build();
driver.manage().addCookie(cookieSubdominio);
driver.quit();
Serializar y restaurar cookies (entre sesiones de test)
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.*;
import java.util.*;
// Guardar cookies en un archivo JSON
private void guardarCookies(WebDriver driver, String rutaArchivo) throws IOException {
Set<Cookie> cookies = driver.manage().getCookies();
List<Map<String, Object>> listaCookies = new ArrayList<>();
for (Cookie c : cookies) {
Map<String, Object> mapa = new HashMap<>();
mapa.put("name", c.getName());
mapa.put("value", c.getValue());
mapa.put("domain", c.getDomain());
mapa.put("path", c.getPath());
if (c.getExpiry() != null) {
mapa.put("expiry", c.getExpiry().getTime());
}
mapa.put("isSecure", c.isSecure());
mapa.put("isHttpOnly", c.isHttpOnly());
listaCookies.add(mapa);
}
new ObjectMapper().writeValue(new File(rutaArchivo), listaCookies);
System.out.println("Cookies guardadas en: " + rutaArchivo);
}
// Restaurar cookies desde un archivo JSON
private void restaurarCookies(WebDriver driver, String rutaArchivo) throws IOException {
List<Map<String, Object>> listaCookies = new ObjectMapper()
.readValue(new File(rutaArchivo), List.class);
for (Map<String, Object> mapa : listaCookies) {
Cookie.Builder builder = new Cookie.Builder(
(String) mapa.get("name"),
(String) mapa.get("value")
);
if (mapa.containsKey("domain")) builder.domain((String) mapa.get("domain"));
if (mapa.containsKey("path")) builder.path((String) mapa.get("path"));
driver.manage().addCookie(builder.build());
}
System.out.println("Cookies restauradas: " + listaCookies.size());
}
Verificar comportamiento de cookies en la aplicación
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
import java.time.Duration;
import static org.junit.jupiter.api.Assertions.*;
class CookiesTest {
@Test
void debeRecordarPreferenciaDeIdioma() {
WebDriver driver = new ChromeDriver();
try {
driver.get("https://www.ejemplo.com");
// Establecer preferencia de idioma via cookie
driver.manage().addCookie(new Cookie("idioma_preferido", "es"));
driver.navigate().refresh();
// Verificar que la UI refleja el idioma configurado
String textoBoton = driver.findElement(By.id("btn-inicio-sesion")).getText();
assertEquals("Iniciar sesión", textoBoton);
} finally {
driver.quit();
}
}
@Test
void debeLimpiarSesionAlEliminarCookieDeSesion() {
WebDriver driver = new ChromeDriver();
WebDriverWait espera = new WebDriverWait(driver, Duration.ofSeconds(10));
try {
// Login
driver.get("https://www.ejemplo.com/login");
driver.findElement(By.id("email")).sendKeys("usuario@test.com");
driver.findElement(By.id("password")).sendKeys("pass123");
driver.findElement(By.id("btn-login")).click();
espera.until(ExpectedConditions.urlContains("/dashboard"));
// Verificar que hay cookie de sesión
Cookie sesion = driver.manage().getCookieNamed("session_id");
assertNotNull(sesion, "Debe existir cookie de sesión tras el login");
// Eliminar cookie de sesión (simular expiración)
driver.manage().deleteCookieNamed("session_id");
driver.navigate().refresh();
// Verificar redirección al login
espera.until(ExpectedConditions.urlContains("/login"));
assertTrue(driver.getCurrentUrl().contains("/login"));
} finally {
driver.quit();
}
}
}
Fuentes y referencias
Documentación oficial y recursos externos para profundizar en Selenium
Documentación oficial de Selenium
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
Leer todas las cookies y obtener una cookie específica por nombre. Añadir cookies personalizadas con atributos como dominio, ruta y expiración. Eliminar cookies individuales y borrar todas las cookies de la sesión. Usar cookies para simular sesiones de usuario y evitar el flujo de login en cada test. Gestionar cookies de sesión y cookies persistentes en pruebas automatizadas. Comprender las restricciones de cookies (same-site, secure, httpOnly) en automatización.