สิ่งสำคัญที่ควรทราบคือไดรเวอร์บางครั้งเรียกใช้ (). รีเฟรช () เรียกบางครั้งดูเหมือนจะไม่ตรงกันซึ่งหมายความว่ามันไม่รอให้การฟื้นฟูเสร็จ ขณะที่เบราว์เซอร์ทำการโหลดหน้าอีกครั้ง
แม้ว่าสิ่งนี้จะเกิดขึ้นในกรณีส่วนน้อยเท่านั้นเราคิดว่ามันจะดีกว่าเพื่อให้แน่ใจว่าใช้งานได้ 100% โดยการเพิ่มการตรวจสอบด้วยตนเองว่าหน้านั้นเริ่มโหลดซ้ำจริงๆหรือไม่
นี่คือรหัสที่ฉันเขียนไว้ในคลาสออบเจ็กต์หน้าฐาน
public void reload() {
// remember reference to current html root element
final WebElement htmlRoot = getDriver().findElement(By.tagName("html"));
// the refresh seems to sometimes be asynchronous, so this sometimes just kicks off the refresh,
// but doesn't actually wait for the fresh to finish
getDriver().navigate().refresh();
// verify page started reloading by checking that the html root is not present anymore
final long startTime = System.currentTimeMillis();
final long maxLoadTime = TimeUnit.SECONDS.toMillis(getMaximumLoadTime());
boolean startedReloading = false;
do {
try {
startedReloading = !htmlRoot.isDisplayed();
} catch (ElementNotVisibleException | StaleElementReferenceException ex) {
startedReloading = true;
}
} while (!startedReloading && (System.currentTimeMillis() - startTime < maxLoadTime));
if (!startedReloading) {
throw new IllegalStateException("Page " + getName() + " did not start reloading in " + maxLoadTime + "ms");
}
// verify page finished reloading
verify();
}
หมายเหตุบางส่วน:
- เนื่องจากคุณกำลังโหลดหน้าซ้ำคุณไม่สามารถตรวจสอบการมีอยู่ขององค์ประกอบที่กำหนดได้เนื่องจากองค์ประกอบจะอยู่ที่นั่นก่อนที่การโหลดจะเริ่มขึ้นและหลังจากเสร็จสิ้นการโหลดเช่นกัน ดังนั้นบางครั้งคุณอาจได้รับจริง แต่หน้านั้นยังไม่ได้เริ่มโหลด
- เมื่อเพจโหลดซ้ำการตรวจสอบ WebElement.isDisplayed () จะเป็นการโยน StaleElementReferenceException ที่เหลือก็เพื่อปกปิดฐานทั้งหมด
- getName (): วิธีการภายในที่ได้รับชื่อของหน้า
- getMaximumLoadTime (): วิธีการภายในที่ส่งคืนระยะเวลาที่อนุญาตให้โหลดหน้าเว็บในไม่กี่วินาที
- ตรวจสอบ (): วิธีการภายในทำให้แน่ใจว่าหน้าโหลดจริง
อีกครั้งในกรณีส่วนใหญ่ do / while loop ทำงานเพียงครั้งเดียวเพราะโค้ดที่อยู่เหนือการนำทาง (). รีเฟรช () ไม่ได้รับการดำเนินการจนกว่าเบราว์เซอร์จะโหลดหน้าเว็บอีกครั้งจริง ๆ แต่เราเห็นกรณีที่ ใช้เวลาไม่กี่วินาทีในการผ่านลูปนั้นเนื่องจากการนำทาง () การรีเฟรช () ไม่ได้ปิดกั้นจนกว่าเบราว์เซอร์จะโหลดเสร็จ