Cómo manejar las cookies en Selenium Controlador web

⚡ Resumen inteligente

Las cookies almacenan las preferencias del usuario y los identificadores de sesión como pares clave-valor, y Selenium WebDriver puede leerlos, guardarlos y reproducirlos, de modo que una prueba automatizada omite la pantalla de inicio de sesión en cada ejecución posterior.

  • 🔘 Información básica sobre las cookies: Una cookie contiene un nombre, un valor, un dominio, una ruta, una fecha de caducidad y los indicadores de seguridad y HttpOnly.
  • ☑️ Seis órdenes: getCookies, getCookieNamed, addCookie, deleteCookie, deleteCookieNamed y deleteAllCookies cubren todas las operaciones.
  • ✅ Demostración en dos pasos: El primer paso consiste en escribir la cookie de autenticación en un archivo; el segundo paso consiste en reproducirla para autenticar una nueva sesión.
  • 🧪 Tiempo ahorrado: Al reproducir una cookie de sesión, se eliminan los pasos de inicio de sesión de cada caso de prueba y se reduce el tiempo total de ejecución.
  • 🛠️ Sin editar: Una cookie no se puede modificar directamente, así que elimine la antigua y añada una copia reconstruida mediante Cookie.Builder.
  • ⚠️ Regla de dominio: Antes de llamar a addCookie, navegue hasta el sitio web de destino; de lo contrario, el navegador rechazará la cookie directamente.

Cómo manejar las cookies en Selenium Controlador web

Una cookie HTTP contiene información sobre el usuario y sus preferencias. Almacena información mediante pares clave-valor. Se trata de un pequeño archivo de datos que una aplicación web envía y que se guarda en el navegador mientras el usuario navega por ese sitio web.

Si eres nuevo en el tema, comienza con esta guía para prueba de cookies.

Selenium Comandos de consulta para cookies

In Selenium En WebDriver, podemos consultar e interactuar con las cookies mediante los métodos integrados que se describen a continuación. A cada uno de ellos se accede a través de driver.manage(), que devuelve la interfaz Options.

Selenium Comandos de consulta Resultado
controlador.manage().getCookies(); Devuelve la lista de todas las cookies.
controlador.manage().getCookieNamed(arg0); Devuelve una cookie específica según su nombre.
controlador.manage().addCookie(arg0); Crea y añade la cookie
controlador.manage().deleteCookie(arg0); Elimina una cookie específica
controlador.manage().deleteCookieNamed(arg0); Elimina una cookie específica según su nombre.
controlador.manage().deleteAllCookies(); Elimina todas las cookies

¿Por qué manejar (aceptar) cookies en Selenium?

Cada cookie está asociada con un nombre, valor, dominio, ruta, caducidad y el estado de si es segura o no. Para validar un cliente, un servidor analiza todos estos valores en una cookie.

Cuando las pruebas una aplicación web que utiliza Selenium Con WebDriver, es posible que necesite crear, actualizar o eliminar una cookie.

Por ejemplo, al automatizar una tienda online.ping En la aplicación, es posible que necesite automatizar escenarios de prueba como realizar un pedido, ver el carrito, la información de pago, la confirmación del pedido, etc.

Si no se almacenan las cookies, deberá iniciar sesión cada vez antes de ejecutar los escenarios de prueba mencionados anteriormente. Esto aumentará el esfuerzo de codificación y el tiempo de ejecución.

La solución consiste en almacenar las cookies en un archivo. Later, recupera los valores de la cookie de este archivo y agrégalos a tu sesión actual del navegador. Como resultado, puedes omitir los pasos de inicio de sesión en cada caso de prueba porque su sesión de conductor contiene esta información.

El servidor de la aplicación ahora trata su sesión del navegador como autenticada y lo lleva directamente a la página solicitada. URL.

Cómo manejar las cookies en Selenium

Usaremos https://demo.guru99.com/test/cookie/selenium_aut.php para nuestro propósito de demostración.

Este será un proceso de 2 pasos.

Paso 1) Inicie sesión en la aplicación y guarde la cookie de autenticación generada.

La aplicación de demostración presenta el formulario de inicio de sesión simple que se muestra a continuación.

Guru99 Selenium Formulario de inicio de sesión de demostración de cookies con campos de nombre de usuario y contraseña

Paso 2) Utilice la cookie almacenada para iniciar sesión en la aplicación nuevamente sin usar un nombre de usuario y contraseña.

Paso 1) Almacenamiento de información de cookies

package CookieExample;

import java.io.BufferedWriter;		
import java.io.File;		
import java.io.FileWriter;
import java.util.Set;
import org.openqa.selenium.By;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.Cookie;		

public class cookieRead{	
        public static void main(String[] args)		
    {
    	WebDriver driver;	
        System.setProperty("webdriver.chrome.driver","G:///chromedriver.exe");					
		driver=new ChromeDriver();        
		driver.get("https://demo.guru99.com/test/cookie/selenium_aut.php");

       				
        // Input Email id and Password If you are already Register		
        driver.findElement(By.name("username")).sendKeys("abc123");							
        driver.findElement(By.name("password")).sendKeys("123xyz");							
        driver.findElement(By.name("submit")).click();					
        		
        // create file named Cookies to store Login Information		
        File file = new File("Cookies.data");							
        try		
        {	  
            // Delete old file if exists
			file.delete();		
            file.createNewFile();			
            FileWriter fileWrite = new FileWriter(file);							
            BufferedWriter Bwrite = new BufferedWriter(fileWrite);							
            // loop for getting the cookie information 		
            	
            // loop for getting the cookie information 		
            for(Cookie ck : driver.manage().getCookies())							
            {			
                Bwrite.write((ck.getName()+";"+ck.getValue()+";"+ck.getDomain()+";"+ck.getPath()+";"+ck.getExpiry()+";"+ck.isSecure()));																									
                Bwrite.newLine();             
            }			
            Bwrite.close();			
            fileWrite.close();	
            
        }
        catch(Exception ex)					
        {		
            ex.printStackTrace();			
        }		
    }		
}

⚠️ Nota de versión: La línea System.setProperty se mantiene exactamente como la escribió el tutorial original. Desde Selenium 4.6 en adelante, Selenium El administrador descarga y configura automáticamente el chromedriver correspondiente, por lo que esa línea ya no es necesaria en la configuración actual. El código original se mantiene sin cambios a continuación y sigue compilando.

Code Explicación

  • Crea una instancia de WebDriver.
  • Visite el sitio web usando driver.get(“https://demo.guru99.com/test/cookie/selenium_aut.php”).
  • Inicia sesión en la aplicación.
  • Lea la información de las cookies usando
    driver.manage().getCookies();
  • Almacenar la información de las cookies utilizando el archivoWriter clase para escribir secuencias de caracteres y BufferedWriter escribir el texto en un archivo llamado Cookies.data.
  • El archivo Cookies.data almacena toda la información de las cookies, incluyendo el nombre, el valor, el dominio y la ruta. Podemos recuperar esta información e iniciar sesión en la aplicación sin necesidad de introducir las credenciales.

Una vez ejecutado el código anterior, se crea el archivo Cookies.data en la estructura de carpetas del proyecto. Abra el archivo y podrá ver las credenciales de inicio de sesión de la aplicación bajo prueba guardadas en formato de cookie, como se muestra en la captura de pantalla resaltada a continuación.

Contenido del archivo Cookies.data que muestra la cookie de sesión guardada en formato nombre, valor, dominio y ruta.

Paso 2) Usar la cookie almacenada para iniciar sesión en la aplicación

Ahora, accederemos a la cookie generada en el paso 1 y la utilizaremos para autenticar nuestra sesión en la aplicación.

package CookieExample;

import java.io.BufferedReader;		
import java.io.File;		
import java.io.FileReader;		
import java.util.Date;		
import java.util.StringTokenizer;		
import org.openqa.selenium.Cookie;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.chrome.ChromeDriver;

public class CookieWrite		
{		
  
	public static void main(String[] args){ 
    	WebDriver driver;     
       	System.setProperty("webdriver.chrome.driver","G://chromedriver.exe");					
        driver=new ChromeDriver();					
    try{			
     
        File file = new File("Cookies.data");							
        FileReader fileReader = new FileReader(file);							
        BufferedReader Buffreader = new BufferedReader(fileReader);							
        String strline;			
        while((strline=Buffreader.readLine())!=null){									
        StringTokenizer token = new StringTokenizer(strline,";");									
        while(token.hasMoreTokens()){					
        String name = token.nextToken();					
        String value = token.nextToken();					
        String domain = token.nextToken();					
        String path = token.nextToken();					
        Date expiry = null;					
        		
        String val;			
        if(!(val=token.nextToken()).equals("null"))
		{		
        	expiry = new Date(val);					
        }		
        Boolean isSecure = new Boolean(token.nextToken()).								
        booleanValue();		
        Cookie ck = new Cookie(name,value,domain,path,expiry,isSecure);			
        System.out.println(ck);
        driver.manage().addCookie(ck); // This will add the stored cookie to your current session					
        }		
        }		
        }catch(Exception ex){					
        ex.printStackTrace();			
        }		
        driver.get("https://demo.guru99.com/test/cookie/selenium_aut.php");					
}	
	}	

Resultado: Se le redirige directamente a la pantalla de inicio de sesión exitoso sin necesidad de introducir el nombre de usuario ni la contraseña.

NOTA: Utilice la función de actualización forzada en caso de que vea la página de inicio de sesión después de ejecutar el script anterior.

⚠️ Java Nota: El script del lector utiliza `new Boolean(String)` y `new Date(String)`, funciones que el JDK dejó de usar hace mucho tiempo. En un JDK moderno, las equivalentes son `Boolean.parseBoolean(token.nextToken())` y un analizador `java.time`. Las líneas originales se conservan arriba; considere esta nota como la sustitución moderna, no como una edición.

Atributos de cookies y la Selenium Clase de galletas

Los dos scripts anteriores transfieren seis campos dentro y fuera de un archivo. Esos campos son exactamente los que expone la clase org.openqa.selenium.Cookie, y conocerlos facilita enormemente la lectura del bucle del tokenizador en el paso 2.

Atributo Accesor Qué significa
Nombre getName () La clave que busca el servidor, por ejemplo JSESSIONID.
Valor getValue () Los datos almacenados, normalmente el identificador de sesión.
Dominio obtenerDominio() El host al que el navegador enviará la cookie.
Path obtenerRuta() El URL prefijo al que se aplica la cookie.
Expiración getExpiry () La fecha en que caduca la cookie. Un valor nulo significa que se trata de una cookie de sesión.
Seguro isSecure() Esto es cierto cuando la cookie solo se envía a través de HTTPS.
HttpOnly isHttpOnly() Verdadero cuando JavaEl script de la página no puede leer la cookie.
MismoSitio obtenerMismoSitio() Estricto, laxo o ninguno. Añadido en Selenium 4.

En lugar del constructor de seis argumentos utilizado en el paso 2, el código actual suele crear una cookie a través de la clase interna Builder, que permite configurar solo los campos que interesan.

Cookie sessionCookie = new Cookie.Builder("JSESSIONID", "A1B2C3D4")
        .domain("demo.guru99.com")
        .path("/")
        .isSecure(true)
        .isHttpOnly(true)
        .build();

driver.manage().addCookie(sessionCookie);

Hay una regla que suele confundir a la mayoría: una cookie no se puede editar después de su creación. Para cambiar un valor, hay que eliminar la cookie antigua y añadir una copia nueva, por eso Builder es tan útil.

Cookie original = driver.manage().getCookieNamed("JSESSIONID");
driver.manage().deleteCookie(original);

Cookie updated = new Cookie.Builder(original.getName(), "NEW-VALUE")
        .domain(original.getDomain())
        .path(original.getPath())
        .isSecure(original.isSecure())
        .build();

driver.manage().addCookie(updated);

Errores comunes de cookies en Selenium WebDriver y cómo solucionarlos

El código de las cookies suele fallar de maneras predecibles. La siguiente tabla enumera las fallas más frecuentes, junto con su causa y la solución.

Síntoma Causa Solución
InvalidCookieDomainException Se llamó a addCookie antes de navegar al sitio, por lo que el navegador todavía está en about:blank. Primero, llama a driver.get en el dominio de destino y luego agrega la cookie.
Excepción no configurable El dominio de la cookie no coincide con la página cargada actualmente. Elimine el campo de dominio o configúrelo con el host exacto de la página abierta.
La página de inicio de sesión sigue apareciendo después de añadir la cookie. La página se generó antes de que existiera la cookie. Llama a driver.navigate().refresh(), que es lo que la NOTA anterior quiere decir con una actualización forzada.
getCookieNamed devuelve null El nombre está mal escrito o la cookie pertenece a una ruta o subdominio diferente. Extrae todas las cookies con getCookies y compara los nombres.
La cookie almacenada se rechaza en una ejecución posterior. El plazo de caducidad ha expirado o el servidor ha finalizado la sesión. Regenera el archivo Cookies.data ejecutando de nuevo el Paso 1.

Si el navegador se abre y se autentica correctamente, pero el script falla después, es probable que la cookie no sea la culpable. Trabajando a través de manejo de excepciones en Selenium es la ruta más rápida desde ese punto, y un dedicado Firefox perfiles Es la alternativa habitual cuando se desea que los datos de la sesión se conserven sin necesidad de un archivo.

Preguntas Frecuentes

Hay dos opciones. Haz clic en el botón Aceptar como en cualquier otro elemento, o configura la cookie de consentimiento del sitio con addCookie antes de recargar la página para que el banner no se muestre. La segunda opción es más rápida y elimina una causa común de problemas en los primeros pasos.

Python Utiliza equivalentes en formato snake_case en el propio controlador: driver.get_cookies(), driver.get_cookie(name), driver.add_cookie(dict) y driver.delete_all_cookies(). Las cookies se devuelven como diccionarios en lugar de objetos Cookie, por lo que se deben leer los valores entre corchetes.

Sí. WebDriver se comunica con el navegador a través del controlador en lugar de a través de JavaScript, para que las cookies HttpOnly sean visibles a través de getCookies. Llama a isHttpOnly e isSecure en el objeto Cookie para inspeccionar esos indicadores.

Los grupos de análisis asistidos por IA fallan en las ejecuciones por señales compartidas y a menudo tracLos fallos intermitentes de cierre de sesión se deben a una cookie de sesión caducada o faltante. Algunas herramientas también aprenden qué cookies lleva una ejecución exitosa y advierten cuando una sesión se desvía de esa línea base.

Copiloto de GitHub Escribe rápidamente los bucles de lectura, escritura y restauración, pero con frecuencia reproduce los constructores obsoletos new Boolean y new Date. Revver cada fragmento generado contra el actual Java y Selenium APIs

No. Una cookie de sesión es una credencial activa, por lo que un archivo Cookies.data guardado permite que cualquier persona con acceso al repositorio suplante la identidad de esa cuenta. Mantenga el archivo fuera del control de versiones y generéelo de nuevo para cada entorno.

No por defecto. Cada sesión comienza con un perfil de navegador limpio, razón por la cual la cookie se guarda en el disco y se vuelve a utilizar. Adjuntar un perfil de navegador guardado es otra forma de mantener una sesión activa entre ejecuciones.

Las cookies de sesión llevan una marca de tiempo de caducidad y el servidor también tracks tiene su propia duración de sesión. Una vez que expira, la cookie reutilizada se rechaza y se vuelve a la página de inicio de sesión, por lo que se regenera la cookie almacenada en lugar de reutilizar un archivo antiguo.

Resumir este post con: