Como lidar com cookies em Selenium webdriver

⚡ Resumo Inteligente

Os cookies armazenam as preferências do usuário e os identificadores de sessão como pares de chave-valor, e Selenium O WebDriver consegue ler, salvar e reproduzir esses dados, de forma que um teste automatizado ignore a tela de login em todas as execuções subsequentes.

  • 🔘 Noções básicas sobre cookies: Um cookie contém um nome, valor, domínio, caminho, data de expiração e os atributos secure e HttpOnly.
  • ☑️ Seis comandos: Os métodos getCookies, getCookieNamed, addCookie, deleteCookie, deleteCookieNamed e deleteAllCookies abrangem todas as operações.
  • Demonstração em duas etapas: A primeira etapa grava o cookie de autenticação em um arquivo, a segunda etapa o reproduz para autenticar uma nova sessão.
  • 🧪 Tempo economizado: Reutilizar um cookie de sessão elimina as etapas de login de cada caso de teste e reduz o tempo total de execução.
  • 🛠️ Sem edição: Um cookie não pode ser modificado diretamente, portanto, exclua o antigo e adicione uma nova cópia através do Cookie.Builder.
  • ⚠️ Regra de domínio: Acesse o site de destino antes de chamar addCookie; caso contrário, o navegador rejeitará o cookie imediatamente.

Como gerenciar cookies em Selenium webdriver

Um cookie HTTP é composto por informações sobre o usuário e suas preferências. Ele armazena informações usando um par chave-valor. Trata-se de um pequeno arquivo de dados enviado por uma aplicação web e armazenado no navegador enquanto o usuário navega pelo site.

Se você é iniciante no assunto, comece com este guia para teste de cookies.

Selenium Comandos de consulta para cookies

In Selenium Com o WebDriver, podemos consultar e interagir com cookies usando os métodos integrados abaixo. Cada um deles é acessado através de driver.manage(), que retorna a interface Options.

Selenium Comandos de consulta saída
driver.manage().getCookies(); Retorna a lista de todos os cookies.
driver.manage().getCookieNamed(arg0); Retorna um cookie específico de acordo com o nome.
driver.manage().addCookie(arg0); Cria e adiciona o cookie.
driver.manage().deleteCookie(arg0); Exclui um cookie específico.
driver.manage().deleteCookieNamed(arg0); Exclui um cookie específico de acordo com o nome.
driver.manage().deleteAllCookies(); Apaga todos os cookies

Por que lidar (aceitar) cookies em Selenium?

Cada cookie está associado a um nome, valor, domínio, caminho, validade e o status de ser seguro ou não. Para validar um cliente, um servidor analisa todos esses valores em um cookie.

Ao ensaio um aplicativo web usando Selenium Para usar o WebDriver, pode ser necessário criar, atualizar ou excluir um cookie.

Por exemplo, ao automatizar uma loja online.ping Em um aplicativo, você pode precisar automatizar cenários de teste como fazer um pedido, visualizar o carrinho, informações de pagamento, confirmação do pedido e assim por diante.

Se os cookies não forem armazenados, você precisará realizar o login sempre que executar os cenários de teste listados acima. Isso aumentará seu esforço de programação e o tempo de execução.

A solução é armazenar os cookies em um arquivo. Later, recupera os valores do cookie deste arquivo e os adiciona à sua sessão atual do navegador. Como resultado, você pode pular as etapas de login em todos os casos. caso de teste porque sua sessão de driver contém essas informações.

O servidor de aplicativos agora trata sua sessão do navegador como autenticada e o direciona diretamente para o que você solicitou. URL.

Como lidar com cookies em Selenium

Nós vamos usar https://demo.guru99.com/test/cookie/selenium_aut.php para nosso propósito de demonstração.

Este será um processo de 2 etapas.

Passo 1) Faça login no aplicativo e armazene o cookie de autenticação gerado.

O aplicativo de demonstração apresenta o formulário de login simples mostrado abaixo.

Guru99 Selenium Formulário de login de demonstração de cookies com campos de nome de usuário e senha

Passo 2) Utilize o cookie armazenado para fazer login novamente no aplicativo sem usar um nome de usuário e senha.

Etapa 1) Armazenar informações 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 sobre a versão: A linha System.setProperty é mantida exatamente como estava no tutorial original. Selenium 4.6 em diante, Selenium O gerenciador baixa e configura o chromedriver correspondente automaticamente, portanto, essa linha não é mais necessária na configuração atual. O código original permanece intacto abaixo e ainda compila.

Code Explicação

  • Crie uma instância do WebDriver.
  • Acesse o site usando driver.get(“https://demo.guru99.com/test/cookie/selenium_aut.php”).
  • Faça login no aplicativo.
  • Leia as informações do cookie usando
    driver.manage().getCookies();
  • Armazene as informações do cookie usando o arquivo.Writer aula para escrever fluxos de caracteres, e BufferedWriter Para escrever o texto em um arquivo chamado Cookies.data.
  • O arquivo Cookies.data armazena todas as informações dos cookies, incluindo nome, valor, domínio e caminho. Podemos recuperar essas informações e fazer login no aplicativo sem precisar inserir as credenciais de acesso.

Após executar o código acima, o arquivo Cookies.data será criado na estrutura de pastas do projeto. Abra o arquivo e você poderá ver as credenciais de login do AUT salvas em formato de cookie, como mostra a imagem destacada abaixo.

Conteúdo do arquivo Cookies.data mostrando o cookie de sessão salvo no formato nome-valor-caminho do domínio

Etapa 2) Usando o cookie armazenado para fazer login no aplicativo

Agora, acessaremos o cookie gerado na etapa 1 e o utilizaremos para autenticar nossa sessão no aplicativo.

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: Você é direcionado diretamente para a tela de login bem-sucedido sem precisar inserir o nome de usuário e a senha.

NOTA: Caso a página de login seja exibida após a execução do script acima, utilize a função "atualizar a página à força".

⚠️ Java notas: O script do leitor usa `new Boolean(String)` e `new Date(String)`, ambos obsoletos no JDK há muito tempo. Em um JDK moderno, os equivalentes são `Boolean.parseBoolean(token.nextToken())` e um analisador de `java.time`. As linhas originais são mantidas acima; considere a nota como a substituição moderna, e não como uma edição.

Atributos de cookies e os Selenium Aula de Biscoitos

Os dois scripts acima movem seis campos para dentro e para fora de um arquivo. Esses campos são exatamente o que a classe org.openqa.selenium.Cookie expõe, e conhecê-los torna o loop do analisador léxico na Etapa 2 muito mais fácil de ler.

Atributo Assessor O que significa
Nome getName () A chave que o servidor procura, por exemplo, JSESSIONID.
Valor Obter valor() Os dados armazenados, geralmente o identificador da sessão.
Domínio obterDomínio() O host para o qual o navegador enviará o cookie de volta.
Caminho obterCaminho() O URL prefixo ao qual o cookie se aplica.
Termo getExpiry () A data em que o cookie expira. Um valor nulo significa um cookie de sessão.
Garanta o éSeguro() Verdadeiro quando o cookie é enviado apenas por HTTPS.
HttpOnly isHttpOnly() Verdadeiro quando JavaO script na página não consegue ler o cookie.
Mesmo Site obterMesmoSite() Rigoroso, flexível ou nenhum. Adicionado em Selenium 4.

Em vez do construtor de seis argumentos usado na Etapa 2, o código atual geralmente cria um cookie por meio da classe Builder interna, que permite definir apenas os campos que lhe interessam.

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

driver.manage().addCookie(sessionCookie);

Uma regra costuma enganar a maioria das pessoas: um objeto cookie não pode ser editado depois de criado. Para alterar um valor, você exclui o cookie antigo e adiciona uma nova cópia, e é por isso que o Builder é tão ú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);

Erros comuns de cookies em Selenium WebDriver e como corrigir problemas

O código de cookies tende a falhar de algumas maneiras previsíveis. A tabela abaixo lista as falhas relatadas com mais frequência, juntamente com a causa e a solução.

Sintoma Causar Fixar
Exceção de domínio de cookie inválido O método addCookie foi chamado antes de navegar para o site, portanto o navegador ainda está em about:blank. Primeiro, acesse o driver.get no domínio de destino e, em seguida, adicione o cookie.
Exceção não foi possível definir o cookie O domínio do cookie não corresponde à página atualmente carregada. Remova o campo de domínio ou defina-o com o host exato da página aberta.
A página de login ainda aparece mesmo após adicionar o cookie. A página foi renderizada antes da existência do cookie. Chame driver.navigate().refresh(), que é o que a NOTA acima quer dizer com uma atualização completa.
getCookieNamed retorna nulo O nome está escrito incorretamente ou o cookie pertence a um caminho ou subdomínio diferente. Use o comando getCookies para extrair todos os cookies e comparar os nomes.
O cookie armazenado será rejeitado em uma execução posterior. O prazo de validade expirou ou o servidor encerrou a sessão. Recompile o arquivo Cookies.data executando o Passo 1 novamente.

Se o navegador abrir e autenticar corretamente, mas o script falhar em seguida, provavelmente o problema não está no cookie. Vamos analisar o problema. tratamento de exceções em Selenium é o caminho mais rápido a partir desse ponto, e um dedicado Firefox profile é a alternativa usual quando se deseja que os dados da sessão sobrevivam sem nenhum arquivo.

Perguntas Frequentes

Existem duas opções. Clique no botão Aceitar como em qualquer outro elemento ou defina o cookie de consentimento do site com addCookie antes de recarregar a página, para que o banner nunca seja exibido. A segunda abordagem é mais rápida e elimina uma causa comum de problemas iniciais.

Python Usa equivalentes em snake_case no próprio driver: driver.get_cookies(), driver.get_cookie(name), driver.add_cookie(dict) e driver.delete_all_cookies(). Os cookies são retornados como dicionários em vez de objetos Cookie, portanto, leia os valores com colchetes.

Sim. O WebDriver se comunica com o navegador por meio do driver, e não diretamente por meio dele. JavaScript, para que os cookies HttpOnly sejam visíveis através de getCookies. Chame isHttpOnly e isSecure no objeto Cookie para inspecionar esses sinalizadores.

Grupos de análise assistida por IA falham em execuções por meio de sinais compartilhados e frequentemente tracAlgumas falhas intermitentes de logout podem ser atribuídas a um cookie de sessão expirado ou ausente. Algumas ferramentas também aprendem quais cookies uma execução bem-sucedida carrega e avisam quando uma sessão se desvia desse padrão.

Copiloto do GitHub Escreve os loops de leitura, escrita e restauração rapidamente, mas frequentemente reproduz os construtores obsoletos `new Boolean` e `new Date`. RevVeja cada trecho gerado em comparação com o atual. Java e Selenium APIs.

Não. Um cookie de sessão é uma credencial ativa, portanto, um arquivo Cookies.data incluído no repositório permite que qualquer pessoa com acesso ao repositório se faça passar por essa conta. Mantenha o arquivo fora do controle de versão e regenere-o para cada ambiente.

Não por padrão. Cada sessão começa com um perfil de navegador limpo, e é exatamente por isso que o cookie é gravado no disco e reproduzido. Anexar um perfil de navegador salvo é outra maneira de manter uma sessão ativa entre execuções.

Os cookies de sessão contêm um carimbo de data/hora de expiração e o servidor também tracO cookie tem seu próprio tempo de vida útil de sessão. Assim que qualquer um deles expira, o cookie reproduzido é rejeitado e a página de login é retornada; portanto, regenere o cookie armazenado em vez de reutilizar um arquivo antigo.

Resuma esta postagem com: