รีเฟรชเพจโดยใช้ Selenium ไดรเวอร์เว็บ
⚡ สรุปอย่างชาญฉลาด
การรีเฟรชหน้าเว็บใน Selenium WebDriver โหลดข้อมูลปัจจุบันใหม่ URL เพื่อให้องค์ประกอบทุกอย่างแสดงผลก่อนที่การตรวจสอบจะทำงาน และเฟรมเวิร์กนี้มีคำสั่งที่แตกต่างกันห้าคำสั่งซึ่งให้ผลลัพธ์การโหลดซ้ำแบบเดียวกันแต่ในรูปแบบที่แตกต่างกัน
ระหว่างการทดสอบระบบอัตโนมัติของแอปพลิเคชันบนเว็บ อาจมีความจำเป็นต้องรีเฟรชหน้าเว็บหลายครั้งเพื่อให้องค์ประกอบเว็บทั้งหมดโหลดได้อย่างสมบูรณ์ ในการโหลดหน้าเว็บครั้งแรก อาจโหลดองค์ประกอบเว็บได้เพียงบางส่วน แต่ต้องรีเฟรชหน้าเว็บอีกครั้งเพื่อให้องค์ประกอบทั้งหมดปรากฏขึ้น ซึ่งสามารถทำได้โดยใช้คำสั่ง refresh ที่มีให้โดย Selenium เว็บไดร์เวอร์
วิธีรีเฟรชเพจใน Selenium
การรีเฟรชเบราว์เซอร์สามารถทำได้โดยใช้วิธีต่อไปนี้ Selenium- เราจะหารือเกี่ยวกับวิธีการที่กล่าวถึงด้านล่างโดยละเอียดตลอดทั้งบทความ
- คำสั่ง driver.navigate().refresh()
- รับวิธีการ
- ส่งคำสั่งคีย์
- วิธีการนำทาง
- คำสั่ง driver.navigate().to()
1) คำสั่ง driver.navigate().refresh()
นี่คือเมธอดในตัวสำหรับการดำเนินการรีเฟรชหน้าเว็บที่จัดเตรียมโดยระบบ Selenium WebDriver คำสั่งนี้เป็นคำสั่งที่ใช้บ่อยที่สุดในการทดสอบอัตโนมัติเพื่อทำการรีเฟรชหน้าเว็บ คำสั่งรีเฟรชสามารถใช้งานได้ง่ายๆ ดังที่กล่าวไว้ด้านล่าง
driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.navigate().refresh();
การนำทาง (Navigation) คืออินเทอร์เฟซที่ใช้ในการดำเนินการต่างๆ ของเบราว์เซอร์ เช่น การไปยังหน้าก่อนหน้า การไปยังหน้าถัดไป การรีเฟรชหน้า และการปิดเบราว์เซอร์ สามารถเข้าถึงเมธอดของอินเทอร์เฟซการนำทางได้โดยใช้คำสั่ง driver.navigate() เมธอด refresh ของอินเทอร์เฟซการนำทางไม่รับอาร์กิวเมนต์ใดๆ และไม่ส่งค่าคืนใดๆ
ตัวอย่าง:
สถานการณ์การทดสอบ:
- เปิดเบราว์เซอร์ Chrome พร้อมกับหน้าเว็บ https://demo.guru99.com/selenium/guru99home/
- เมื่อโหลดหน้าเว็บสำเร็จแล้ว ให้รีเฟรชหน้าเว็บโดยใช้เมธอด driver.navigate().refresh()
- ปิดเบราว์เซอร์โดยใช้เมธอด driver.close()
Code
package Guru99Demo; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class RefreshDemo { public static void main(String args[]) throws InterruptedException { System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.get("https://demo.guru99.com/selenium/guru99home/"); driver.manage().window().maximize(); driver.navigate().refresh(); driver.close(); } }
⚠️ หมายเหตุเกี่ยวกับเวอร์ชัน: Selenium ผู้จัดการจัดส่งพร้อมกับ Selenium 4.6 และจะดาวน์โหลดไดรเวอร์เบราว์เซอร์ที่ตรงกันโดยอัตโนมัติ ดังนั้นบรรทัด System.setProperty ด้านบนจึงไม่จำเป็นอีกต่อไปในเวอร์ชันปัจจุบัน — new ChromeDriver() แค่นี้ก็เพียงพอแล้ว บรรทัดเดิมยังคงอยู่เพราะยังถูกต้องอยู่ Selenium รูปแบบการตั้งค่า 3 แบบที่ใช้เป็นพื้นฐานในการเขียนตัวอย่าง
Code Output:
เมื่อโหลดหน้าเว็บครั้งแรก หน้าแรกของเวอร์ชันสาธิตจะแสดงผลดังที่แสดงด้านล่าง
หลังจากรีเฟรชหน้าเว็บแล้ว วิดีโอในหน้าเว็บได้เปลี่ยนไป ซึ่งเป็นการยืนยันว่าการโหลดซ้ำเกิดขึ้นจริง
วิธีอื่นๆ ในการรีเฟรชหน้าเว็บ
การรีเฟรชหน้าเว็บไม่ใช่เพียงวิธีเดียวในการโหลดหน้าเว็บใหม่ เทคนิคทั้งสี่ด้านล่างนี้ให้ผลลัพธ์เดียวกันและควรค่าแก่การเรียนรู้ เพราะบางครั้งแอปพลิเคชันที่ถูกจำกัดการเข้าถึงหรือเบราว์เซอร์ที่ดื้อรั้นอาจบล็อกเทคนิคใดเทคนิคหนึ่งไว้
2) รับเมธอด
เมธอด `get` สามารถใช้ในลักษณะเรียกซ้ำเพื่อรีเฟรชหน้าเว็บได้ ในการทำเช่นนั้น เราจำเป็นต้องส่งเมธอดอื่นเป็นอาร์กิวเมนต์ให้กับเมธอด `get`
ตัวอย่าง:
driver.get("https://www.guru99.com");
driver.get(driver.getCurrentUrl());
3) วิธีการนำทาง
วิธีนี้ใช้แนวคิดการเรียกซ้ำแบบเดียวกับที่กล่าวไว้ข้างต้น โดยส่งเมธอด getCurrentUrl() เป็นอาร์กิวเมนต์ไปยังเมธอด driver.navigate().to()
ตัวอย่าง:
driver.get("https://www.guru99.com");
driver.navigate().to(driver.getCurrentUrl());
4) วิธีการส่งคีย์โดยใช้ปุ่ม F5
นี่เป็นวิธีที่ใช้บ่อยเป็นอันดับสองในการรีเฟรชเพจ Seleniumฟังก์ชันนี้รับปุ่มรีเฟรช (F5) เป็นอาร์กิวเมนต์ในเมธอด sendKeys เนื่องจาก sendKeys ทำงานได้เฉพาะกับองค์ประกอบเว็บ ไม่ใช่กับเบราว์เซอร์ เราจึงต้องระบุองค์ประกอบเว็บที่ถูกต้องบนหน้าเว็บก่อน จากนั้นจึงใช้เมธอด sendKeys ซึ่งสามารถทำได้ดังแสดงด้านล่าง
ตัวอย่าง:
driver.get("https://www.guru99.com"); driver.findElement(By.id("username")).sendKeys(Keys.F5);
เนื่องจากคำสั่งกดแป้นพิมพ์ถูกส่งไปยังองค์ประกอบแทนที่จะส่งไปยังส่วนแสดงผลของเบราว์เซอร์ เส้นทางนี้จึงขึ้นอยู่กับว่าองค์ประกอบนั้นกำลังได้รับโฟกัสอยู่หรือไม่ ถ้าหาก... ระบุตำแหน่ง หากตรงกับช่องที่ไม่สามารถรับโฟกัสได้ คีย์จะถูกซ่อนไว้ และหน้าเว็บจะไม่โหลดใหม่
5) วิธีการส่งคีย์โดยใช้ ASCII Code
วิธีนี้ใช้หลักการเดียวกันกับข้างต้น แต่แทนที่จะส่งปุ่ม F5 เป็นอาร์กิวเมนต์ เราจะส่งโค้ดพอยต์ของปุ่มรีเฟรชเป็นอาร์กิวเมนต์แทน ซึ่งสามารถทำได้ดังแสดงด้านล่าง
driver.get("https://www.guru99.com"); driver.findElement(By.id("username")).sendKeys("\uE035");
ค่า \uE035 คือรหัส Unicode ของ WebDriver ที่โปรโตคอลแมปกับ F5 ดังนั้นโค้ดส่วนนี้และส่วนก่อนหน้าจึงเทียบเท่ากัน
วิธีการรีเฟรชหน้าเว็บโดยใช้ JavaScriptExecutor
ทุกเบราว์เซอร์มีฟังก์ชันรีโหลดสำหรับสคริปต์ของหน้าเว็บ และ Selenium สามารถเรียกผ่านทางนั้นได้ Javascriptอินเทอร์เฟซตัวดำเนินการ นี่คือวิธีการสำรองที่ใช้กันโดยทั่วไปเมื่อคำสั่งรีเฟรชของ WebDriver ถูกดักจับโดยแอปพลิเคชันหรือส่วนขยายของเบราว์เซอร์
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("location.reload();");
มีสองรูปแบบที่ควรจดจำ:
- ตำแหน่ง.โหลดใหม่() ทำการโหลดหน้าเว็บใหม่ตามปกติ และอาจแสดงหน้าเว็บจากแคช
- ประวัติศาสตร์.go(0) เป็นเวอร์ชันเก่าที่ชุดโปรแกรมรุ่นเก่าบางชุดยังคงใช้กันอยู่
เส้นทางตัวดำเนินการทำงานอยู่ภายในหน้าเว็บ ดังนั้นจึงไม่รอเอกสารใหม่ด้วยตัวเอง ให้ตามด้วยคำสั่งรออย่างชัดเจนเช่นเดียวกับที่คุณทำหลังจาก driver.navigate().refresh() และจำไว้ว่าการโหลดซ้ำที่ขับเคลื่อนด้วยสคริปต์จะไม่ล้างไดอะล็อกระดับเบราว์เซอร์ หากแอปพลิเคชันที่กำลังทดสอบโหลดเนื้อหาแบบอะซิงโครนัส ก็ต้องระมัดระวังเช่นเดียวกันกับกรณีที่โหลดแบบอะซิงโครนัส การจัดการการเรียกใช้ AJAX ใน Selenium ไดรเวอร์เว็บ.
วิธีหลีกเลี่ยงข้อผิดพลาด StaleElementReferenceException หลังจากการรีเฟรชหน้าเว็บ
การรีเฟรชจะทำลาย DOM ปัจจุบันและสร้าง DOM ใหม่ขึ้นมา WebElement ทุกตัวที่ถูกดึงมาก่อนการรีเฟรชจะชี้ไปยังโหนดที่ไม่มีอยู่อีกต่อไป ดังนั้นการเรียกใช้ครั้งต่อไปจะทำให้เกิดข้อผิดพลาด StaleElementReferenceException นี่คือข้อผิดพลาดที่พบบ่อยที่สุดหลังจากการรีเฟรชหน้าเว็บ
สามนิสัยนี้จะช่วยขจัดความล้มเหลวเหล่านี้ได้เกือบทั้งหมด:
- ค้นหาหลังจากนั้น ไม่ใช่ก่อนหน้านี้ เก็บค่าตัวระบุตำแหน่ง By แทนที่จะเป็น WebElement แล้วเรียก findElement อีกครั้งเมื่อการโหลดเสร็จสิ้น
- รอสัญญาณที่แท้จริงก่อน การรออย่างเจาะจงเพื่อให้องค์ประกอบนั้นปรากฏขึ้นหลังจากโหลดหน้าเว็บใหม่นั้น มีความน่าเชื่อถือมากกว่าการใช้คำสั่ง sleep แบบคงที่
- รีเฟรชหน้าเว็บ แล้วอ่านซ้ำอีกครั้ง ห้ามนำค่าข้อความหรือแอตทริบิวต์ที่ได้มาก่อนการโหลดซ้ำไปใช้ในการตรวจสอบที่ทำหลังจากนั้นเด็ดขาด
รูปแบบด้านล่างนี้ใช้ได้กับทั้งสามอย่าง:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); driver.navigate().refresh(); WebElement search = wait.until( ExpectedConditions.visibilityOfElementLocated(By.id("username"))); search.sendKeys("guru99");
WebDriverWait รับค่า Duration เป็นพารามิเตอร์ Selenium 4 ซึ่งเป็นการเปลี่ยนแปลงจากตัวสร้างวินาทีจำนวนเต็มที่ใช้ใน Selenium 3. เทคนิคที่ครอบคลุมมากขึ้นสำหรับความล้มเหลวเหล่านี้มีอธิบายไว้ในคู่มือของเรา การจัดการข้อยกเว้นใน Selenium.
เปรียบเทียบ Selenium วิธีการรีเฟรชหน้าเว็บ
คำสั่งทั้งหกคำสั่งนี้จะโหลดหน้าเว็บใหม่ แต่มีความแตกต่างกันในสิ่งที่คำสั่งเหล่านั้นขึ้นอยู่กับ และในลักษณะที่เกิดข้อผิดพลาด
| วิธี | ขึ้นอยู่กับ | โหลดซ้ำผ่าน | เมื่อมันเป็นการเลือกที่ถูกต้อง |
|---|---|---|---|
| driver.navigate().refresh() | ไม่มีอะไรพิเศษ | คำสั่งรีโหลดเบราว์เซอร์ | เกือบตลอดเวลา — ค่าเริ่มต้น |
| driver.get(driver.getCurrentUrl()) | กระแสไฟฟ้าที่อ่านได้ URL | ระบบนำทางใหม่ | เมื่อคุณต้องการลบรายการประวัติด้วยเช่นกัน |
| driver.navigate().to(driver.getCurrentUrl()) | กระแสไฟฟ้าที่อ่านได้ URL | ระบบนำทางใหม่ | เช่นเดียวกับข้างต้น แต่เขียนผ่านทางอินเทอร์เฟซการนำทาง |
| ส่งปุ่ม (ปุ่ม F5) | องค์ประกอบที่สามารถโฟกัสได้ | การกดแป้นพิมพ์ | เมื่อคุณจงใจทดสอบเส้นทางการทำงานของแป้นพิมพ์ |
| sendKeys(“\uE035”) | องค์ประกอบที่สามารถโฟกัสได้ | การกดแป้นพิมพ์ | เหมือนกับ F5 ทุกประการ แต่เขียนเป็นรหัสจุด |
| Javascriptตำแหน่งตัวดำเนินการ reload() | เปิดใช้งานการเขียนสคริปต์ | สคริปต์หน้าเว็บ | เมื่อคำสั่ง WebDriver ถูกบล็อก |
เริ่มต้นด้วยคำสั่งรีเฟรช และค่อยไปยังแถวอื่นเมื่อคำสั่งรีเฟรชล้มเหลวด้วยเหตุผลที่คุณเข้าใจ ลำดับความสำคัญเดียวกันนี้ใช้ได้เมื่อคุณ ขยายหรือย่อหน้าต่างเบราว์เซอร์: เลือกใช้การเรียกใช้ WebDriver ดั้งเดิม และถือว่าเส้นทางสคริปต์เป็นตัวเลือกสำรอง


