如何在 Selenium WebDriver 中处理 Cookies

HTTP cookie 包含有关用户及其偏好的信息。它使用键值对存储信息。它是从 Web 应用程序发送并存储在 Web 浏览器中的一小段数据,当用户浏览该网站时。

点击此处了解cookie 测试

Selenium Cookie 查询命令

在 Selenium Webdriver 中,我们可以使用以下内置方法查询和与 cookie 交互

Selenium 查询命令 输出
driver.manage().getCookies(); 返回所有 Cookie 的列表
driver.manage().getCookieNamed(arg0); 根据名称返回特定 cookie
driver.manage().addCookie(arg0); 创建并添加 cookie
driver.manage().deleteCookie(arg0); 删除特定 cookie
driver.manage().deleteCookieNamed(arg0); 根据名称删除特定 cookie
driver.manage().deleteAllCookies(); 删除所有 cookie

为什么要在 Selenium 中处理(接受)Cookie?

每个 cookie 都关联一个名称、值、域、路径、过期时间以及它是否安全的状态。为了验证客户端,服务器会解析 cookie 中的所有这些值。

在使用 selenium web driver测试Web 应用程序时,您可能需要创建、更新或删除 cookie。

例如,当自动化在线购物应用程序时,您可能需要自动化诸如提交订单、查看购物车、支付信息、订单确认等测试场景。

如果未存储 cookie,则每次执行上述测试场景之前都需要执行登录操作。这将增加您的编码工作量和执行时间。

解决方案是将 cookie 存储在一个文件中。然后,从该文件中检索 cookie 的值并添加到您当前的浏览器会话中。因此,您可以跳过每个测试用例中的登录步骤,因为您的驱动程序会话中包含此信息。

应用程序服务器现在将您的浏览器会话视为已认证,并直接将您带到请求的 URL。

如何在 Selenium 中处理 Cookie

我们将使用 https://demo.guru99.com/test/cookie/selenium_aut.php 进行演示。

这将是一个两步过程。

步骤 1) 登录应用程序并存储生成的身份验证 cookie。

Handle Cookies in Selenium

步骤 2) 使用存储的 cookie,再次登录应用程序,无需使用用户 ID 和密码。

步骤 1) 存储 cookie 信息

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();			
        }		
    }		
}

代码解释

  • 创建 WebDriver 实例
  • 我们使用 driver.get(“https://demo.guru99.com/test/cookie/selenium_aut.php”) 访问网站
  • 登录应用程序
  • 使用以下方法读取 cookie 信息
    driver.manage().getCookies();
  • 使用 FileWriter 类写入字符流,并使用 BufferedWriter 将文本写入文件以创建名为 Cookies.data 的文件来存储 cookie 信息。
  • “Cookies.data”文件存储所有 cookie 信息,包括“名称、值、域、路径”。我们可以检索此信息并登录应用程序,而无需输入登录凭据。
  • 运行上述代码后,“Cookie.data”文件将在项目文件夹结构中创建,如以下屏幕所示。打开“Cookie.data”文件,您可以看到 AUT 的登录凭据已以 Cookie 格式保存,请参见以下突出显示的屏幕。

    Handle Cookies in Selenium

步骤 2) 使用存储的 cookie 登录应用程序

现在,我们将访问步骤 1 中生成的 cookie,并使用该 cookie 在应用程序中验证我们的会话。

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");					
}	
	}	

输出:您将直接进入登录成功屏幕,无需输入用户 ID 和密码。

注意: 如果执行上述脚本后看到登录页面,请使用硬刷新。

结论

因此,在 Selenium Webdriver 的帮助下,您可以避免在服务器上反复输入用户名和密码进行验证,从而节省大量时间。