วิธีจัดการกับคุกกี้ใน Selenium ไดรเวอร์เว็บ
⚡ สรุปอย่างชาญฉลาด
คุกกี้จะจัดเก็บการตั้งค่าของผู้ใช้และตัวระบุเซสชันในรูปแบบคู่คีย์-ค่า และ Selenium WebDriver สามารถอ่าน บันทึก และเล่นซ้ำข้อมูลเหล่านี้ได้ ดังนั้นการทดสอบอัตโนมัติจึงข้ามหน้าจอเข้าสู่ระบบในการเรียกใช้งานครั้งต่อๆ ไป
คุกกี้ HTTP ประกอบด้วยข้อมูลเกี่ยวกับผู้ใช้และค่ากำหนดของผู้ใช้ โดยจะจัดเก็บข้อมูลโดยใช้คู่คีย์-ค่า เป็นข้อมูลขนาดเล็กที่ส่งจากเว็บแอปพลิเคชันและจัดเก็บไว้ในเว็บเบราว์เซอร์ขณะที่ผู้ใช้กำลังเรียกดูเว็บไซต์นั้น
หากคุณยังใหม่กับเรื่องนี้ โปรดเริ่มต้นด้วยคู่มือนี้ การทดสอบคุกกี้.
Selenium คำสั่งแบบสอบถามสำหรับคุกกี้
In Selenium ใน WebDriver เราสามารถสอบถามและโต้ตอบกับคุกกี้ได้โดยใช้วิธีการในตัวด้านล่าง ซึ่งแต่ละวิธีจะเข้าถึงได้ผ่านทาง driver.manage() ซึ่งจะส่งคืนอินเทอร์เฟซ Options
| Selenium คำสั่งแบบสอบถาม | เอาท์พุต |
|---|---|
| driver.manage().getCookies(); | ส่งคืนรายการคุกกี้ทั้งหมด |
| driver.manage().getCookieNamed(arg0); | ส่งคืนคุกกี้เฉพาะตามชื่อที่กำหนด |
| driver.manage().addCookie(arg0); | สร้างและเพิ่มคุกกี้ |
| driver.manage().deleteCookie(arg0); | ลบคุกกี้ที่ระบุ |
| driver.manage().deleteCookieNamed(arg0); | ลบคุกกี้ที่ระบุตามชื่อ |
| driver.manage().deleteAllCookies(); | ลบคุกกี้ทั้งหมด |
ทำไมต้องจัดการ (ยอมรับ) คุกกี้ Selenium?
คุกกี้แต่ละตัวมีความเชื่อมโยงกับชื่อ ค่า โดเมน เส้นทาง การหมดอายุ และสถานะว่าปลอดภัยหรือไม่ เพื่อตรวจสอบความถูกต้องของไคลเอ็นต์ เซิร์ฟเวอร์จะแยกวิเคราะห์ค่าเหล่านี้ทั้งหมดในคุกกี้
เมื่อ การทดสอบ แอปพลิเคชันเว็บที่ใช้ Selenium ใน WebDriver คุณอาจจำเป็นต้องสร้าง อัปเดต หรือลบคุกกี้
ตัวอย่างเช่น เมื่อต้องการทำให้ร้านค้าออนไลน์เป็นระบบอัตโนมัติping ในแอปพลิเคชัน คุณอาจจำเป็นต้องสร้างระบบอัตโนมัติสำหรับสถานการณ์ทดสอบต่างๆ เช่น การสั่งซื้อ การดูตะกร้าสินค้า ข้อมูลการชำระเงิน การยืนยันคำสั่งซื้อ และอื่นๆ
หากไม่มีการจัดเก็บคุกกี้ คุณจะต้องทำการล็อกอินทุกครั้งก่อนที่จะดำเนินการทดสอบตามสถานการณ์ที่ระบุไว้ข้างต้น ซึ่งจะทำให้ความพยายามในการเขียนโค้ดและเวลาในการดำเนินการเพิ่มขึ้น
วิธีแก้ปัญหาคือการจัดเก็บคุกกี้ไว้ในไฟล์ Laterดึงค่าของคุกกี้จากไฟล์นี้และเพิ่มลงในเซสชันเบราว์เซอร์ปัจจุบันของคุณ ส่งผลให้คุณสามารถข้ามขั้นตอนการเข้าสู่ระบบได้ทุกครั้ง กรณีทดสอบ เพราะเซสชันไดรเวอร์ของคุณมีข้อมูลนี้อยู่ในนั้น
ขณะนี้เซิร์ฟเวอร์แอปพลิเคชันถือว่าเซสชันเบราว์เซอร์ของคุณได้รับการตรวจสอบสิทธิ์แล้ว และจะนำคุณไปยังหน้าที่คุณร้องขอโดยตรง URL.
วิธีจัดการกับคุกกี้ใน Selenium
เราจะใช้ https://demo.guru99.com/test/cookie/selenium_aut.php เพื่อจุดประสงค์ในการสาธิตของเรา
นี่จะเป็นกระบวนการ 2 ขั้นตอน
ขั้นตอนที่ 1) เข้าสู่ระบบแอปพลิเคชันและบันทึกคุกกี้การตรวจสอบสิทธิ์ที่สร้างขึ้น
แอปพลิเคชันสาธิตนี้แสดงแบบฟอร์มล็อกอินแบบง่ายดังที่แสดงด้านล่าง
ขั้นตอนที่ 2) ใช้คุกกี้ที่บันทึกไว้เพื่อเข้าสู่ระบบแอปพลิเคชันอีกครั้งโดยไม่ต้องใช้ชื่อผู้ใช้และรหัสผ่าน
ขั้นตอนที่ 1) จัดเก็บข้อมูลคุกกี้
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(); } } }
⚠️ หมายเหตุเกี่ยวกับเวอร์ชัน: บรรทัด System.setProperty ยังคงเหมือนเดิมทุกประการตามที่เขียนไว้ในบทช่วยสอนต้นฉบับ Selenium 4.6 เป็นต้นไป Selenium โปรแกรมจัดการจะดาวน์โหลดและกำหนดค่า chromedriver ที่ตรงกันโดยอัตโนมัติ ดังนั้นบรรทัดนั้นจึงไม่จำเป็นอีกต่อไปในการตั้งค่าปัจจุบัน โค้ดเดิมยังคงอยู่ด้านล่างและยังคงคอมไพล์ได้ตามปกติ
Code คำอธิบาย
- สร้างอินสแตนซ์ WebDriver
- เข้าชมเว็บไซต์โดยใช้ driver.get(“https://demo.guru99.com/test/cookie/selenium_aut.php”)
- เข้าสู่ระบบแอปพลิเคชัน
- อ่านข้อมูลคุกกี้โดยใช้
driver.manage().getCookies();
- บันทึกข้อมูลคุกกี้โดยใช้ไฟล์Writer ชั้นเรียนสำหรับการเขียนข้อความตัวอักษรจำนวนมาก และ BufferedWriter เพื่อเขียนข้อความลงในไฟล์ชื่อ Cookies.data
- ไฟล์ Cookies.data จะเก็บข้อมูลคุกกี้ทั้งหมด รวมถึงชื่อ ค่า โดเมน และเส้นทาง เราสามารถเรียกดูข้อมูลนี้และเข้าสู่ระบบแอปพลิเคชันได้โดยไม่ต้องป้อนข้อมูลประจำตัวในการเข้าสู่ระบบ
เมื่อคุณรันโค้ดด้านบน ไฟล์ Cookies.data จะถูกสร้างขึ้นในโครงสร้างโฟลเดอร์ของโปรเจ็กต์ เปิดไฟล์นั้นแล้วคุณจะเห็นข้อมูลการเข้าสู่ระบบของแอปพลิเคชันที่กำลังทดสอบ (AUT) ที่บันทึกไว้ในรูปแบบคุกกี้ ดังที่แสดงในภาพที่ไฮไลต์ด้านล่าง
ขั้นตอนที่ 2) การใช้คุกกี้ที่เก็บไว้เพื่อเข้าสู่แอปพลิเคชัน
ต่อไป เราจะเข้าถึงคุกกี้ที่สร้างขึ้นในขั้นตอนที่ 1 และใช้คุกกี้นั้นเพื่อยืนยันตัวตนของเราในแอปพลิเคชัน
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"); } }
ผลลัพธ์: คุณจะถูกนำไปยังหน้าจอเข้าสู่ระบบสำเร็จโดยตรงโดยไม่ต้องป้อนรหัสผู้ใช้และรหัสผ่าน
หมายเหตุ: หากพบหน้าล็อกอินหลังจากเรียกใช้สคริปต์ข้างต้น โปรดรีเฟรชหน้าเว็บทันที
⚠️ Java บันทึกย่อ: สคริปต์ตัวอ่านใช้ new Boolean(String) และ new Date(String) ซึ่งทั้งสองอย่างนี้ JDK ได้ยกเลิกการใช้งานไปนานแล้ว ใน JDK รุ่นใหม่ จะมีการใช้ Boolean.parseBoolean(token.nextToken()) และตัวแยกวิเคราะห์ java.time แทน บรรทัดเดิมยังคงอยู่ด้านบน โปรดพิจารณาหมายเหตุนี้ว่าเป็นส่วนที่นำมาใช้แทนที่ในเวอร์ชันปัจจุบัน ไม่ใช่การแก้ไข
คุณลักษณะของคุกกี้และ Selenium คลาสคุกกี้
สคริปต์สองตัวข้างต้นจะย้ายฟิลด์หกฟิลด์เข้าและออกจากไฟล์ ฟิลด์เหล่านั้นตรงกับสิ่งที่คลาส org.openqa.selenium.Cookie เปิดเผย และการรู้ฟิลด์เหล่านั้นจะทำให้ลูปการแยกคำในขั้นตอนที่ 2 อ่านง่ายขึ้นมาก
| คุณลักษณะ | อุปกรณ์เสริม | มันหมายถึงอะไร |
|---|---|---|
| ชื่อ | getName () | คีย์ที่เซิร์ฟเวอร์ใช้ในการค้นหา เช่น JSESSIONID |
| ความคุ้มค่า | getValue () | ข้อมูลที่จัดเก็บไว้ ซึ่งโดยปกติจะเป็นตัวระบุเซสชัน |
| โดเมน | รับโดเมน() | โฮสต์ที่เบราว์เซอร์จะส่งคุกกี้กลับไป |
| เส้นทาง | getPath() | การขอ URL คำนำหน้าที่คุกกี้ใช้บังคับ |
| หมดอายุ | getExpire() | วันที่คุกกี้หมดอายุ ค่าว่างหมายถึงคุกกี้เซสชัน |
| ปลอดภัย | isSecure() | ถูกต้องเมื่อส่งคุกกี้ผ่าน HTTPS เท่านั้น |
| httpOnly | isHttpOnly() | จริงเมื่อ Javaสคริปต์ในหน้านี้ไม่สามารถอ่านคุกกี้ได้ |
| เว็บไซต์เดียวกัน | getSameSite() | เข้มงวด ผ่อนปรน หรือไม่เลย เพิ่มเข้ามาแล้ว Selenium 4. |
แทนที่จะใช้คอนสตรัคเตอร์ที่มีอาร์กิวเมนต์หกตัวเหมือนในขั้นตอนที่ 2 โค้ดปัจจุบันมักจะสร้างคุกกี้ผ่านคลาส Builder ภายใน ซึ่งช่วยให้คุณตั้งค่าเฉพาะฟิลด์ที่คุณสนใจได้
Cookie sessionCookie = new Cookie.Builder("JSESSIONID", "A1B2C3D4") .domain("demo.guru99.com") .path("/") .isSecure(true) .isHttpOnly(true) .build(); driver.manage().addCookie(sessionCookie);
มีกฎข้อหนึ่งที่คนส่วนใหญ่มักพลาด คือ อ็อบเจ็กต์คุกกี้ไม่สามารถแก้ไขได้หลังจากสร้างแล้ว หากต้องการเปลี่ยนค่า คุณต้องลบคุกกี้เก่าและสร้างสำเนาใหม่ขึ้นมา ซึ่งเป็นเหตุผลว่าทำไม Builder ถึงมีประโยชน์มาก
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);
ข้อผิดพลาดเกี่ยวกับคุกกี้ที่พบบ่อยใน Selenium WebDriver และวิธีการแก้ไขปัญหา
โค้ดเกี่ยวกับคุกกี้มักมีข้อผิดพลาดในรูปแบบที่คาดเดาได้ไม่กี่อย่าง ตารางด้านล่างแสดงรายการข้อผิดพลาดที่พบได้บ่อยที่สุด พร้อมสาเหตุและวิธีแก้ไข
| อาการ | ก่อให้เกิด | แก้ไขปัญหา |
|---|---|---|
| ข้อผิดพลาดคุกกี้โดเมนไม่ถูกต้อง | ฟังก์ชัน addCookie ถูกเรียกก่อนที่จะเข้าชมเว็บไซต์ ดังนั้นเบราว์เซอร์จึงยังคงแสดงหน้า about:blank อยู่ | เรียกใช้ driver.get บนโดเมนเป้าหมายก่อน จากนั้นจึงเพิ่มคุกกี้ |
| ไม่สามารถตั้งค่าคุกกี้ได้ ยกเว้นข้อผิดพลาด | โดเมนของคุกกี้ไม่ตรงกับหน้าเว็บที่กำลังโหลดอยู่ | ลบช่องโดเมนออก หรือตั้งค่าเป็นโฮสต์ที่ถูกต้องของหน้าเว็บที่เปิดอยู่ |
| หน้าล็อกอินยังคงปรากฏอยู่หลังจากเพิ่มคุกกี้แล้ว | หน้าเว็บนี้แสดงผลก่อนที่คุกกี้จะถูกสร้างขึ้น | เรียกใช้ driver.navigate().refresh() ซึ่งเป็นสิ่งที่หมายเหตุข้างต้นหมายถึงว่าเป็นการรีเฟรชแบบเต็มรูปแบบ |
| เมธอด getCookieNamed ส่งคืนค่า null | ชื่อสะกดผิด หรือคุกกี้เป็นของพาธหรือโดเมนย่อยอื่น | ใช้คำสั่ง getCookies เพื่อดึงข้อมูลคุกกี้ทั้งหมด แล้วเปรียบเทียบชื่อคุกกี้เหล่านั้น |
| คุกกี้ที่บันทึกไว้จะถูกปฏิเสธในการเรียกใช้งานครั้งต่อไป | ระยะเวลาหมดอายุได้ผ่านไปแล้ว หรือเซิร์ฟเวอร์ได้ยุติเซสชันแล้ว | สร้างไฟล์ Cookies.data ขึ้นใหม่โดยเรียกใช้ขั้นตอนที่ 1 อีกครั้ง |
หากเบราว์เซอร์เปิดและตรวจสอบสิทธิ์ได้อย่างถูกต้อง แต่สคริปต์ทำงานล้มเหลวในภายหลัง ปัญหาน่าจะไม่ได้อยู่ที่คุกกี้ ลองตรวจสอบทีละขั้นตอนดู การจัดการข้อยกเว้นใน Selenium เป็นเส้นทางที่เร็วกว่าจากจุดนั้น และเป็นเส้นทางเฉพาะ Firefox โปรไฟล์ เป็นทางเลือกปกติเมื่อคุณต้องการให้ข้อมูลเซสชันคงอยู่โดยไม่ต้องจัดเก็บเป็นไฟล์


