วิธีจัดการกับคุกกี้ใน Selenium ไดรเวอร์เว็บ

⚡ สรุปอย่างชาญฉลาด

คุกกี้จะจัดเก็บการตั้งค่าของผู้ใช้และตัวระบุเซสชันในรูปแบบคู่คีย์-ค่า และ Selenium WebDriver สามารถอ่าน บันทึก และเล่นซ้ำข้อมูลเหล่านี้ได้ ดังนั้นการทดสอบอัตโนมัติจึงข้ามหน้าจอเข้าสู่ระบบในการเรียกใช้งานครั้งต่อๆ ไป

  • 🔘 ข้อมูลพื้นฐานเกี่ยวกับคุกกี้: คุกกี้จะเก็บข้อมูลชื่อ ค่า โดเมน เส้นทาง วันหมดอายุ และแฟล็กความปลอดภัยและ HttpOnly ไว้
  • ☑️ หกคำสั่ง: เมธอด getCookies, getCookieNamed, addCookie, deleteCookie, deleteCookieNamed และ deleteAllCookies ครอบคลุมการดำเนินการทุกอย่าง
  • ✅ การสาธิตแบบสองขั้นตอน: ขั้นตอนแรกจะเขียนคุกกี้การตรวจสอบสิทธิ์ลงในไฟล์ ขั้นตอนที่สองจะนำคุกกี้นั้นกลับมาใช้เพื่อตรวจสอบสิทธิ์ในเซสชันใหม่
  • 🧪 เวลาที่ประหยัด: การใช้คุกกี้เซสชันซ้ำจะช่วยขจัดขั้นตอนการเข้าสู่ระบบออกจากทุกกรณีทดสอบ และลดเวลาในการดำเนินการโดยรวมให้สั้นลง
  • 🛠️ ห้ามแก้ไข: ไม่สามารถแก้ไขคุกกี้ได้โดยตรง ดังนั้นให้ลบคุกกี้เก่าแล้วสร้างสำเนาใหม่ขึ้นมาโดยใช้ Cookie.Builder
  • ⚠️ กฎโดเมน: โปรดไปยังเว็บไซต์เป้าหมายก่อนเรียกใช้ addCookie มิเช่นนั้นเบราว์เซอร์จะปฏิเสธคุกกี้โดยสิ้นเชิง

วิธีจัดการคุกกี้ใน Selenium ไดรเวอร์เว็บ

คุกกี้ 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) เข้าสู่ระบบแอปพลิเคชันและบันทึกคุกกี้การตรวจสอบสิทธิ์ที่สร้างขึ้น

แอปพลิเคชันสาธิตนี้แสดงแบบฟอร์มล็อกอินแบบง่ายดังที่แสดงด้านล่าง

Guru99 Selenium แบบฟอร์มล็อกอินสาธิตการใช้คุกกี้ พร้อมช่องสำหรับชื่อผู้ใช้และรหัสผ่าน

ขั้นตอนที่ 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) ที่บันทึกไว้ในรูปแบบคุกกี้ ดังที่แสดงในภาพที่ไฮไลต์ด้านล่าง

เนื้อหาไฟล์ Cookies.data แสดงคุกกี้เซสชันที่บันทึกไว้ในรูปแบบชื่อ ค่า โดเมน เส้นทาง

ขั้นตอนที่ 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 โปรไฟล์ เป็นทางเลือกปกติเมื่อคุณต้องการให้ข้อมูลเซสชันคงอยู่โดยไม่ต้องจัดเก็บเป็นไฟล์

คำถามที่พบบ่อย

มีสองทางเลือก อย่างแรกคือคลิกปุ่มยอมรับเหมือนกับองค์ประกอบอื่นๆ หรืออย่างที่สองคือตั้งค่าคุกกี้ขอความยินยอมของเว็บไซต์ด้วย addCookie ก่อนที่จะโหลดหน้าเว็บใหม่ เพื่อไม่ให้แบนเนอร์แสดงขึ้นมา วิธีที่สองเร็วกว่าและช่วยขจัดสาเหตุทั่วไปที่ทำให้ขั้นตอนแรกไม่เสถียร

Python ใช้รูปแบบ snake_case ในตัวไดรเวอร์เอง: driver.get_cookies(), driver.get_cookie(name), driver.add_cookie(dict) และ driver.delete_all_cookies() คุกกี้จะถูกส่งกลับมาในรูปแบบพจนานุกรม ไม่ใช่ในรูปแบบอ็อบเจ็กต์ Cookie ดังนั้นจึงต้องอ่านค่าด้วยวงเล็บเหลี่ยม

ใช่แล้ว WebDriver สื่อสารกับเบราว์เซอร์ผ่านทางไดรเวอร์ ไม่ใช่ผ่านทางอื่น Javaสคริปต์นี้ทำให้สามารถมองเห็นคุกกี้ HttpOnly ได้ผ่านทาง getCookies เรียกใช้ isHttpOnly และ isSecure บนอ็อบเจ็กต์ Cookie เพื่อตรวจสอบแฟล็กเหล่านั้น

กลุ่มการวิเคราะห์ที่ใช้ AI ช่วยจัดกลุ่มการทำงานที่ล้มเหลวโดยใช้สัญญาณร่วมกัน และมักจะ tracการออกจากระบบล้มเหลวเป็นระยะๆ อาจเกิดจากคุกกี้เซสชันหมดอายุหรือหายไป เครื่องมือบางอย่างยังเรียนรู้ว่าการใช้งานแต่ละครั้งมีคุกกี้ใดบ้าง และจะแจ้งเตือนเมื่อเซสชันเบี่ยงเบนไปจากค่าพื้นฐานนั้น

นักบิน GitHub โปรแกรมนี้เขียนลูปการอ่าน การเขียน และการกู้คืนได้อย่างรวดเร็ว แต่ก็มักจะสร้างตัวสร้าง Boolean และ Date ใหม่ที่เลิกใช้งานแล้วซ้ำๆ Revตรวจสอบโค้ดตัวอย่างที่สร้างขึ้นทั้งหมดเทียบกับเวอร์ชันปัจจุบัน Java และ Selenium APIs

ไม่ เซสชันคุกกี้เป็นข้อมูลประจำตัวที่ใช้งานอยู่ ดังนั้นไฟล์ Cookies.data ที่ถูกบันทึกไว้จะทำให้ใครก็ตามที่มีสิทธิ์เข้าถึงที่เก็บข้อมูลสามารถแอบอ้างเป็นบัญชีนั้นได้ ควรเก็บไฟล์นี้ไว้ให้ห่างจากการควบคุมเวอร์ชัน และสร้างไฟล์ใหม่ทุกครั้งที่ใช้งานในแต่ละสภาพแวดล้อม

โดยปกติแล้วจะไม่ใช่แบบนั้น แต่ละเซสชันจะเริ่มต้นด้วยโปรไฟล์เบราว์เซอร์ที่สะอาด ซึ่งเป็นเหตุผลว่าทำไมคุกกี้จึงถูกเขียนลงดิสก์และเล่นซ้ำ การแนบโปรไฟล์เบราว์เซอร์ที่บันทึกไว้เป็นอีกวิธีหนึ่งที่จะทำให้เซสชันยังคงใช้งานได้ระหว่างการใช้งานแต่ละครั้ง

คุกกี้เซสชันจะมีเวลาหมดอายุ และเซิร์ฟเวอร์ก็จะเก็บข้อมูลนี้ไว้ด้วยเช่นกัน tracคุกกี้มีอายุการใช้งานเฉพาะในแต่ละเซสชัน เมื่ออายุการใช้งานหมดลง คุกกี้ที่นำมาใช้ซ้ำจะถูกปฏิเสธและหน้าเข้าสู่ระบบจะกลับมา ดังนั้นควรสร้างคุกกี้ที่จัดเก็บไว้ใหม่แทนที่จะใช้ไฟล์เก่าซ้ำ

สรุปโพสต์นี้ด้วย: