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.
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.
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.
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ả.


