Важливо відзначити, що дзвінок driver.navigate (). Refresh () іноді здається асинхронним, це означає, що він не чекає, коли оновлення закінчиться, він просто "запускає оновлення" і не блокує подальше виконання поки браузер перезавантажує сторінку.
Хоча це здається лише в меншій кількості випадків, ми подумали, що краще переконатися, що це працює на 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 (): внутрішній метод, який повертає, скільки довгих сторінок потрібно дозволити завантажувати за секунди
- verify (): внутрішній метод гарантує, що сторінка фактично завантажена
Знову ж таки, у переважній більшості випадків цикл do / while працює одноразово, оскільки код за межами navigate (). Refresh () не виконується, поки браузер фактично не перезавантажив сторінку повністю, але ми спостерігали випадки, коли насправді потрібні секунди, щоб пройти цей цикл, оскільки навігація (). refresh () не блокується, поки браузер не завершить завантаження.