Một điều quan trọng cần lưu ý là cuộc gọi driver.navigate (). Refresh () đôi khi dường như không đồng bộ, có nghĩa là nó không đợi quá trình làm mới kết thúc, nó chỉ "khởi động làm mới" và không chặn thực thi thêm trong khi trình duyệt đang tải lại trang.
Mặc dù điều này dường như chỉ xảy ra trong một số ít trường hợp, chúng tôi đã hiểu rằng tốt hơn là đảm bảo điều này hoạt động 100% bằng cách thêm kiểm tra thủ công xem trang có thực sự bắt đầu tải lại hay không.
Đây là mã tôi đã viết cho nó trong lớp đối tượng trang cơ sở của chúng tôi:
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();
}
Một số lưu ý:
- Vì bạn đang tải lại trang, bạn không thể kiểm tra sự tồn tại của một yếu tố nhất định, bởi vì yếu tố đó sẽ ở đó trước khi tải lại bắt đầu và sau khi nó được thực hiện. Vì vậy, đôi khi bạn có thể trở thành sự thật, nhưng trang thậm chí chưa bắt đầu tải.
- Khi trang tải lại, kiểm tra WebEuity.isDisplayed () sẽ đưa ra StaleEuityReferenceException. Phần còn lại chỉ là để trang trải tất cả các căn cứ
- getName (): phương thức nội bộ lấy tên của trang
- getMaximumLoadTime (): phương thức nội bộ trả về thời gian trang sẽ được phép tải trong vài giây
- verify (): phương thức bên trong đảm bảo trang thực sự được tải
Một lần nữa, trong phần lớn các trường hợp, vòng lặp do / while chạy một lần duy nhất vì mã nằm ngoài điều hướng (). Refresh () không được thực thi cho đến khi trình duyệt thực sự tải lại trang hoàn toàn, nhưng chúng ta đã thấy các trường hợp trong đó thực sự phải mất vài giây để vượt qua vòng lặp đó vì điều hướng (). refresh () không chặn cho đến khi trình duyệt tải xong.