Cách xử lý cookie trong Selenium webdriver

⚡ Tóm tắt thông minh

Cookie lưu trữ các tùy chọn của người dùng và mã định danh phiên dưới dạng cặp khóa-giá trị, và Selenium WebDriver có thể đọc, lưu và phát lại chúng, do đó bài kiểm tra tự động sẽ bỏ qua màn hình đăng nhập trong mỗi lần chạy tiếp theo.

  • 🔘 Những điều cơ bản về bánh quy: Một cookie chứa tên, giá trị, tên miền, đường dẫn, thời hạn hết hạn và các cờ secure và HttpOnly.
  • ☑️ Sáu mệnh lệnh: Các phương thức getCookies, getCookieNamed, addCookie, deleteCookie, deleteCookieNamed và deleteAllCookies bao gồm mọi thao tác.
  • Ví dụ minh họa hai bước: Bước một ghi cookie xác thực vào một tệp, bước hai phát lại cookie đó để xác thực một phiên mới.
  • 🧪 Thời gian tiết kiệm được: Việc phát lại cookie phiên giúp loại bỏ các bước đăng nhập khỏi mọi trường hợp kiểm thử và rút ngắn tổng thời gian thực thi.
  • 🛠️ Không chỉnh sửa: Không thể chỉnh sửa cookie trực tiếp, vì vậy hãy xóa cookie cũ và thêm bản sao được tạo lại thông qua Cookie.Builder.
  • ⚠️ Quy tắc miền: Hãy truy cập vào trang web mục tiêu trước khi gọi hàm addCookie, nếu không trình duyệt sẽ từ chối cookie ngay lập tức.

Cách xử lý cookie trong Selenium webdriver

Cookie HTTP chứa thông tin về người dùng và các tùy chọn của họ. Nó lưu trữ thông tin bằng cách sử dụng cặp khóa-giá trị. Đó là một mẩu dữ liệu nhỏ được gửi từ ứng dụng web và được lưu trữ trong trình duyệt web khi người dùng đang duyệt trang web đó.

Nếu bạn mới tìm hiểu về chủ đề này, hãy bắt đầu với hướng dẫn này. kiểm tra cookie.

Selenium Lệnh truy vấn cho cookie

In Selenium Với WebDriver, chúng ta có thể truy vấn và tương tác với cookie bằng các phương thức tích hợp sẵn bên dưới. Mỗi phương thức đều được truy cập thông qua driver.manage(), phương thức này trả về giao diện Options.

Selenium Lệnh truy vấn Đầu ra
driver.manage().getCookies(); Trả về danh sách tất cả các cookie.
driver.manage().getCookieNamed(arg0); Trả về một cookie cụ thể theo tên.
driver.manage().addCookie(arg0); Tạo và thêm cookie
driver.manage().deleteCookie(arg0); Xóa một cookie cụ thể
driver.manage().deleteCookieNamed(arg0); Xóa một cookie cụ thể theo tên.
driver.manage().deleteAllCookies(); Xóa tất cả cookie

Tại sao phải xử lý (chấp nhận) cookie trong Selenium?

Mỗi cookie được liên kết với tên, giá trị, tên miền, đường dẫn, thời hạn sử dụng và trạng thái xem nó có an toàn hay không. Để xác thực ứng dụng khách, máy chủ sẽ phân tích tất cả các giá trị này trong cookie.

Thời Gian thử nghiệm một ứng dụng web sử dụng Selenium WebDriver, bạn có thể cần tạo, cập nhật hoặc xóa một cookie.

Ví dụ, khi tự động hóa một cửa hàng trực tuyếnping Trong ứng dụng này, bạn có thể cần tự động hóa các kịch bản kiểm thử như đặt hàng, xem giỏ hàng, thông tin thanh toán, xác nhận đơn hàng, v.v.

Nếu cookie không được lưu trữ, bạn sẽ cần thực hiện thao tác đăng nhập mỗi lần trước khi chạy các kịch bản kiểm thử được liệt kê ở trên. Điều này sẽ làm tăng công sức lập trình và thời gian thực thi.

Giải pháp là lưu trữ cookie trong một tập tin. LaterTruy xuất các giá trị của cookie từ tệp này và thêm chúng vào phiên trình duyệt hiện tại của bạn. Kết quả là, bạn có thể bỏ qua các bước đăng nhập trong mọi trình duyệt. trường hợp thử nghiệm vì phiên trình điều khiển của bạn có thông tin này trong đó.

Máy chủ ứng dụng hiện coi phiên duyệt web của bạn là đã được xác thực và trực tiếp đưa bạn đến trang bạn yêu cầu. URL.

Cách xử lý cookie trong Selenium

Chúng tôi sẽ sử dụng https://demo.guru99.com/test/cookie/selenium_aut.php cho mục đích demo của chúng tôi.

Đây sẽ là một quá trình 2 bước.

Bước 1) Đăng nhập vào ứng dụng và lưu lại cookie xác thực được tạo ra.

Ứng dụng demo hiển thị biểu mẫu đăng nhập đơn giản như bên dưới.

Guru99 Selenium Mẫu đăng nhập thử nghiệm cookie với các trường tên người dùng và mật khẩu.

Bước 2) Sử dụng cookie đã lưu để đăng nhập lại vào ứng dụng mà không cần dùng tên người dùng và mật khẩu.

Bước 1) Lưu trữ thông tin 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();			
        }		
    }		
}

⚠️ Lưu ý về phiên bản: Dòng lệnh System.setProperty được giữ nguyên chính xác như trong hướng dẫn gốc. Từ Selenium 4.6 trở đi, Selenium Trình quản lý tự động tải xuống và cấu hình chromedriver phù hợp, vì vậy dòng lệnh đó không còn cần thiết trong thiết lập hiện tại. Mã gốc được giữ nguyên và vẫn biên dịch được.

Code Giải thích

  • Tạo một phiên bản WebDriver.
  • Truy cập trang web bằng cách sử dụng driver.get(“https://demo.guru99.com/test/cookie/selenium_aut.php”).
  • Đăng nhập vào ứng dụng.
  • Đọc thông tin cookie bằng cách sử dụng
    driver.manage().getCookies();
  • Lưu trữ thông tin cookie bằng cách sử dụng TệpWriter lớp học viết các dòng ký tự, và BufferedWriter Ghi đoạn văn bản này vào một tệp có tên là Cookies.data.
  • Tệp Cookies.data lưu trữ tất cả thông tin cookie bao gồm tên, giá trị, tên miền và đường dẫn. Chúng ta có thể truy xuất thông tin này và đăng nhập vào ứng dụng mà không cần nhập thông tin đăng nhập.

Sau khi chạy đoạn mã trên, tệp Cookies.data sẽ được tạo trong cấu trúc thư mục dự án. Mở tệp đó ra và bạn có thể thấy thông tin đăng nhập của ứng dụng cần kiểm thử (AUT) được lưu dưới dạng cookie, như hình ảnh được đánh dấu bên dưới cho thấy.

Nội dung tệp Cookies.data hiển thị cookie phiên đã lưu ở định dạng tên, giá trị, tên miền và đường dẫn.

Bước 2) Sử dụng cookie đã lưu trữ để đăng nhập vào ứng dụng

Bây giờ, chúng ta sẽ truy cập vào cookie được tạo ở bước 1 và sử dụng nó để xác thực phiên làm việc của mình trong ứng dụng.

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

Kết quả: Bạn được chuyển thẳng đến màn hình đăng nhập thành công mà không cần nhập tên người dùng và mật khẩu.

LƯU Ý: Hãy làm mới trang (hard refresh) nếu bạn vẫn thấy trang đăng nhập sau khi thực thi đoạn mã trên.

⚠️ Java ghi chú: Tập lệnh đọc sử dụng `new Boolean(String)` và `new Date(String)`, cả hai đều đã bị JDK loại bỏ từ lâu. Trên JDK hiện đại, các phương thức tương đương là `Boolean.parseBoolean(token.nextToken())` và trình phân tích cú pháp `java.time`. Các dòng gốc được giữ nguyên ở trên; hãy coi ghi chú này như là sự thay thế hiện đại chứ không phải là một chỉnh sửa.

Thuộc tính Cookie và Selenium Lớp học làm bánh quy

Hai đoạn mã trên di chuyển sáu trường vào và ra khỏi một tệp. Những trường đó chính xác là những gì lớp org.openqa.selenium.Cookie cung cấp, và việc biết chúng giúp vòng lặp phân tích từ trong Bước 2 dễ đọc hơn nhiều.

đặc tính Phụ kiện Nghĩa là gì
Họ tên getName () Khóa mà máy chủ tìm kiếm, ví dụ như JSESSIONID.
Giá trị getValue () Dữ liệu được lưu trữ, thường là mã định danh phiên.
miền getDomain() Máy chủ mà trình duyệt sẽ gửi cookie trở lại.
Đường dẫn getPath() URL Tiền tố mà cookie này áp dụng.
Hết hạn getExpiry() Ngày mà cookie hết hạn. Giá trị null có nghĩa là cookie phiên.
Bảo mật isSecure() Điều này đúng khi cookie chỉ được gửi qua HTTPS.
httpOnly isHttpOnly() Đúng khi JavaĐoạn mã trên trang không thể đọc cookie.
Cùng trang web getSameSite() Nghiêm ngặt, Lỏng lẻo hoặc Không có. Được thêm vào Selenium 4.

Thay vì sử dụng hàm tạo sáu tham số như ở Bước 2, mã hiện tại thường tạo cookie thông qua lớp Builder bên trong, cho phép bạn chỉ thiết lập các trường mà bạn quan tâm.

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

driver.manage().addCookie(sessionCookie);

Có một quy tắc khiến hầu hết mọi người bối rối: đối tượng cookie không thể chỉnh sửa sau khi đã được tạo. Để thay đổi giá trị, bạn phải xóa cookie cũ và thêm một bản sao được tạo lại, đó là lý do tại sao Builder lại hữu ích đến vậy.

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

Các lỗi cookie thường gặp trong Selenium WebDriver và cách khắc phục chúng

Mã cookie thường gặp lỗi theo một số ít cách có thể dự đoán được. Bảng dưới đây liệt kê những lỗi được báo cáo thường xuyên nhất, cùng với nguyên nhân và cách khắc phục.

Triệu chứng Nguyên nhân Sửa chữa
InvalidCookieDomainException Hàm addCookie đã được gọi trước khi điều hướng đến trang web, vì vậy trình duyệt vẫn đang ở trạng thái about:blank. Trước tiên, hãy gọi phương thức driver.get trên miền mục tiêu, sau đó thêm cookie.
Không thể thiết lập CookieException Tên miền của cookie không khớp với trang hiện đang được tải. Hãy bỏ trường tên miền hoặc đặt nó thành chính xác tên máy chủ của trang đang mở.
Trang đăng nhập vẫn hiển thị sau khi thêm cookie. Trang web được hiển thị trước khi cookie tồn tại. Hãy gọi hàm driver.navigate().refresh(), đó chính là ý nghĩa của việc làm mới cứng (hard refresh) được đề cập trong phần LƯU Ý ở trên.
getCookieNamed trả về null Tên bị viết sai chính tả, hoặc cookie thuộc về một đường dẫn hoặc tên miền phụ khác. Lấy tất cả các cookie bằng getCookies và so sánh tên của chúng.
Cookie đã lưu sẽ bị từ chối trong lần chạy sau. Thời gian đã hết hạn hoặc máy chủ đã kết thúc phiên làm việc. Hãy tạo lại tập tin Cookies.data bằng cách chạy lại Bước 1.

Nếu trình duyệt mở và xác thực thành công nhưng sau đó tập lệnh bị lỗi, thì có lẽ lỗi không phải do cookie. (Đang xử lý...) xử lý ngoại lệ trong Selenium là tuyến đường nhanh hơn từ điểm đó, và là tuyến đường chuyên dụng. Firefox Hồ sơ Đây là phương án thay thế thường được sử dụng khi bạn muốn dữ liệu phiên được lưu trữ mà không cần đến tệp tin nào cả.

Câu Hỏi Thường Gặp

Có hai lựa chọn. Nhấp vào nút Chấp nhận như bất kỳ phần tử nào khác, hoặc thiết lập cookie đồng ý của trang web bằng addCookie trước khi tải lại trang để biểu ngữ không bao giờ hiển thị. Cách thứ hai nhanh hơn và loại bỏ một nguyên nhân phổ biến gây ra sự không ổn định trong các bước đầu tiên.

Python Sử dụng các phương thức tương đương snake_case trên chính trình điều khiển: driver.get_cookies(), driver.get_cookie(name), driver.add_cookie(dict) và driver.delete_all_cookies(). Cookies được trả về dưới dạng từ điển chứ không phải đối tượng Cookie, vì vậy hãy đọc các giá trị trong dấu ngoặc vuông.

Đúng vậy. WebDriver giao tiếp với trình duyệt thông qua trình điều khiển chứ không phải thông qua... JavaĐoạn mã này cho phép các cookie HttpOnly hiển thị thông qua getCookies. Gọi phương thức isHttpOnly và isSecure trên đối tượng Cookie để kiểm tra các cờ đó.

Phân tích có sự hỗ trợ của AI nhóm các lần chạy thất bại bằng các tín hiệu chung và thường xuyên tracLỗi đăng xuất không thường xuyên có thể do cookie phiên hết hạn hoặc bị thiếu. Một số công cụ cũng học cách nhận biết các cookie mà một lần chạy đang mang theo và cảnh báo khi phiên lệch khỏi mức cơ bản đó.

Trợ lý GitHub Chương trình viết các vòng lặp đọc, ghi và khôi phục nhanh chóng, nhưng nó thường xuyên tạo lại các hàm tạo new Boolean và new Date đã lỗi thời. RevXem xét từng đoạn mã được tạo ra so với phiên bản hiện tại. Java và Selenium API.

Không. Cookie phiên là một thông tin xác thực hoạt động, vì vậy một tập tin Cookies.data đã được lưu trữ cho phép bất kỳ ai có quyền truy cập kho lưu trữ đều có thể mạo danh tài khoản đó. Hãy giữ tập tin này ngoài hệ thống kiểm soát phiên bản và tạo lại nó cho mỗi môi trường.

Theo mặc định thì không. Mỗi phiên bắt đầu với một cấu hình trình duyệt sạch, đó chính là lý do tại sao cookie được ghi vào ổ đĩa và được sử dụng lại. Đính kèm cấu hình trình duyệt đã lưu là cách khác để duy trì phiên hoạt động giữa các lần chạy.

Cookie phiên có dấu thời gian hết hạn và máy chủ cũng vậy. tracMỗi cookie có thời hạn phiên riêng. Khi một trong hai thời hạn này hết hạn, cookie được tạo lại sẽ bị từ chối và trang đăng nhập sẽ quay lại, vì vậy hãy tạo lại cookie đã lưu thay vì sử dụng lại tệp cũ.

Tóm tắt bài viết này với: