รีเฟรชเพจโดยใช้ Selenium ไดรเวอร์เว็บ

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

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

  • 🔘 ตัวเลือกเริ่มต้น: driver.navigate().refresh() คือฟังก์ชันรีโหลดในตัว ซึ่งไม่รับอาร์กิวเมนต์และไม่ส่งค่าใดๆ กลับมา
  • ☑️ รูปแบบเรียกซ้ำ: การส่งค่า getCurrentUrl() เข้าไปใน get() หรือ navigate().to() จะเป็นการโหลดที่อยู่เดิมซ้ำอีกครั้ง
  • เส้นทางแป้นพิมพ์: sendKeys รับค่า Keys.F5 หรือค่า Unicode \uE035 แต่ต้องกำหนดเป้าหมายไปยังองค์ประกอบจริง
  • 🧪 เส้นทางสคริปต์: Javascriptการเรียกใช้ location.reload() ใน Executor จะทำงานเมื่อคำสั่ง WebDriver ถูกบล็อก
  • 🛠️ หลังจากโหลดเสร็จ: ข้อมูลอ้างอิงองค์ประกอบทุกอย่างที่บันทึกไว้ก่อนหน้านี้จะล้าสมัยและต้องค้นหาใหม่อีกครั้ง
  • 📊 การตั้งค่าแบบสมัยใหม่: Selenium ฟังก์ชัน Manager ถูกเพิ่มเข้ามาในเวอร์ชัน 4.6 ดังนั้นจึงไม่จำเป็นต้องตั้งค่าเส้นทางไดรเวอร์ด้วยตนเองอีกต่อไป

รีเฟรชหน้าเว็บโดยใช้ Selenium คำสั่ง WebDriver

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

วิธีรีเฟรชเพจใน Selenium

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

  1. คำสั่ง driver.navigate().refresh()
  2. รับวิธีการ
  3. ส่งคำสั่งคีย์
  4. วิธีการนำทาง
  5. คำสั่ง driver.navigate().to()

1) คำสั่ง driver.navigate().refresh()

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

driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.navigate().refresh();

การนำทาง (Navigation) คืออินเทอร์เฟซที่ใช้ในการดำเนินการต่างๆ ของเบราว์เซอร์ เช่น การไปยังหน้าก่อนหน้า การไปยังหน้าถัดไป การรีเฟรชหน้า และการปิดเบราว์เซอร์ สามารถเข้าถึงเมธอดของอินเทอร์เฟซการนำทางได้โดยใช้คำสั่ง driver.navigate() เมธอด refresh ของอินเทอร์เฟซการนำทางไม่รับอาร์กิวเมนต์ใดๆ และไม่ส่งค่าคืนใดๆ

ตัวอย่าง:

สถานการณ์การทดสอบ:

  1. เปิดเบราว์เซอร์ Chrome พร้อมกับหน้าเว็บ https://demo.guru99.com/selenium/guru99home/
  2. เมื่อโหลดหน้าเว็บสำเร็จแล้ว ให้รีเฟรชหน้าเว็บโดยใช้เมธอด driver.navigate().refresh()
  3. ปิดเบราว์เซอร์โดยใช้เมธอด 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:

เมื่อโหลดหน้าเว็บครั้งแรก หน้าแรกของเวอร์ชันสาธิตจะแสดงผลดังที่แสดงด้านล่าง

Guruหน้าแรกสาธิต 99 หน้า ในการโหลดครั้งแรกก่อนที่คำสั่งรีเฟรชจะทำงาน

หลังจากรีเฟรชหน้าเว็บแล้ว วิดีโอในหน้าเว็บได้เปลี่ยนไป ซึ่งเป็นการยืนยันว่าการโหลดซ้ำเกิดขึ้นจริง

Guruหน้าแรกสาธิต 99 หลังจาก driver.navigate().refresh() แสดงวิดีโอที่แตกต่างออกไป

วิธีอื่นๆ ในการรีเฟรชหน้าเว็บ

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

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

มีสองรูปแบบที่ควรจดจำ:

  1. ตำแหน่ง.โหลดใหม่() ทำการโหลดหน้าเว็บใหม่ตามปกติ และอาจแสดงหน้าเว็บจากแคช
  2. ประวัติศาสตร์.go(0) เป็นเวอร์ชันเก่าที่ชุดโปรแกรมรุ่นเก่าบางชุดยังคงใช้กันอยู่

เส้นทางตัวดำเนินการทำงานอยู่ภายในหน้าเว็บ ดังนั้นจึงไม่รอเอกสารใหม่ด้วยตัวเอง ให้ตามด้วยคำสั่งรออย่างชัดเจนเช่นเดียวกับที่คุณทำหลังจาก driver.navigate().refresh() และจำไว้ว่าการโหลดซ้ำที่ขับเคลื่อนด้วยสคริปต์จะไม่ล้างไดอะล็อกระดับเบราว์เซอร์ หากแอปพลิเคชันที่กำลังทดสอบโหลดเนื้อหาแบบอะซิงโครนัส ก็ต้องระมัดระวังเช่นเดียวกันกับกรณีที่โหลดแบบอะซิงโครนัส การจัดการการเรียกใช้ AJAX ใน Selenium ไดรเวอร์เว็บ.

วิธีหลีกเลี่ยงข้อผิดพลาด StaleElementReferenceException หลังจากการรีเฟรชหน้าเว็บ

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

สามนิสัยนี้จะช่วยขจัดความล้มเหลวเหล่านี้ได้เกือบทั้งหมด:

  1. ค้นหาหลังจากนั้น ไม่ใช่ก่อนหน้านี้ เก็บค่าตัวระบุตำแหน่ง By แทนที่จะเป็น WebElement แล้วเรียก findElement อีกครั้งเมื่อการโหลดเสร็จสิ้น
  2. รอสัญญาณที่แท้จริงก่อน การรออย่างเจาะจงเพื่อให้องค์ประกอบนั้นปรากฏขึ้นหลังจากโหลดหน้าเว็บใหม่นั้น มีความน่าเชื่อถือมากกว่าการใช้คำสั่ง sleep แบบคงที่
  3. รีเฟรชหน้าเว็บ แล้วอ่านซ้ำอีกครั้ง ห้ามนำค่าข้อความหรือแอตทริบิวต์ที่ได้มาก่อนการโหลดซ้ำไปใช้ในการตรวจสอบที่ทำหลังจากนั้นเด็ดขาด

รูปแบบด้านล่างนี้ใช้ได้กับทั้งสามอย่าง:

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 ดั้งเดิม และถือว่าเส้นทางสคริปต์เป็นตัวเลือกสำรอง

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

เป็นไปได้ค่ะ หากหน้าเว็บปัจจุบันถูกสร้างขึ้นโดยวิธีการ POST เบราว์เซอร์อาจขอให้ส่งข้อมูลใหม่ และการโหลดหน้าเว็บจะหยุดชะงักอยู่หลังกล่องโต้ตอบนั้น การไปยังหน้าเว็บ URL การใช้ get() อีกครั้งจะช่วยหลีกเลี่ยงข้อความแจ้งเตือนได้อย่างสมบูรณ์

ชื่อการผูกอาจแตกต่างกัน แต่คำสั่งเหมือนกันคือ driver.refresh() ใน Pythondriver.Navigate().Refresh() ใน C# และ driver.navigate().refresh() ใน Javaทั้งสามตัวออกคำสั่ง WebDriver เหมือนกันทุกประการ

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

กลไกการซ่อมแซมตัวเองจะทำการแก้ไขตัวระบุตำแหน่งใหม่จากคุณลักษณะหลายอย่างเมื่อ DOM ที่โหลดใหม่ไม่ตรงกันอีกต่อไป และแบบจำลองการวิเคราะห์ความล้มเหลวจะจัดกลุ่มความผิดพลาดด้านเวลาในการโหลดใหม่ เพื่อให้ทีมแก้ไขปัญหาการรอเพียงครั้งเดียวแทนที่จะทำการทดสอบห้าสิบครั้ง

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

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

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

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

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