Ważną rzeczą do zapamiętania jest to, że wywołanie driver.navigate (). Refresh () czasami wydaje się być asynchroniczne, co oznacza, że nie czeka na zakończenie odświeżania, po prostu „uruchamia odświeżanie” i nie blokuje dalszego wykonania podczas ponownego ładowania strony przez przeglądarkę.
Chociaż wydaje się, że zdarza się to tylko w nielicznych przypadkach, doszliśmy do wniosku, że lepiej jest upewnić się, że działa to w 100%, dodając ręczne sprawdzenie, czy strona naprawdę zaczęła się ponownie ładować.
Oto kod, który napisałem dla tego w naszej klasie obiektów strony bazowej:
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();
}
Kilka uwag:
- Ponieważ przeładowujesz stronę, nie możesz po prostu sprawdzić istnienia danego elementu, ponieważ będzie on tam przed rozpoczęciem ponownego ładowania i po jego zakończeniu. Czasami może się to udać, ale strona nawet się jeszcze nie ładowała.
- Po ponownym załadowaniu strony sprawdzenie WebElement.isDisplayed () spowoduje zgłoszenie wyjątku StaleElementReferenceException. Reszta dotyczy tylko wszystkich podstaw
- getName (): wewnętrzna metoda pobierająca nazwę strony
- getMaximumLoadTime (): wewnętrzna metoda, która zwraca czas wczytywania strony w ciągu kilku sekund
- verify (): metoda wewnętrzna zapewnia, że strona została faktycznie załadowana
Ponownie, w zdecydowanej większości przypadków pętla do / while jest uruchamiana jednorazowo, ponieważ kod poza navigate (). Refresh () nie jest wykonywany, dopóki przeglądarka nie załaduje całkowicie strony, ale widzieliśmy przypadki, w których w rzeczywistości przejście przez tę pętlę zajmuje kilka sekund, ponieważ funkcja navigate (). refresh () nie blokowała się, dopóki przeglądarka nie zakończy ładowania.