Jedną ważną rzeczą jest, aby pamiętać, że driver.navigate(). Odświeżania() nazywamy czasami wydaje się być asynchroniczny, co oznacza, że nie czeka na odświeżenie do końca, to po prostu "rozpoczyna odświeżanie" i nie blokuje dalszego wykonywania, gdy przeglądarka ponownie ładuje stronę.
Chociaż zdarza się to tylko w niewielkiej liczbie przypadków, pomyśleliśmy, że lepiej jest upewnić się, że działa to w 100%, dodając ręczne sprawdzenie, czy strona naprawdę zaczęła się przeładowywać.
Oto kod, który napisałem dla naszego bazowego klasy strona obiektu:
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:
- Skoro przeładowania strony, nie można po prostu sprawdzić istnienie dany element, ponieważ element będzie tam przed ponownym załadowaniem i po jego zakończeniu. Czasami możesz uzyskać prawdę, ale strona nie zaczęła jeszcze się ładować.
- Po załadowaniu strony sprawdzenie WebElement.isDisplayed() spowoduje zgłoszenie wyjątku StaleElementReferenceException. Reszta to tylko na pokrycie wszystkich baz
- getName(): metoda wewnętrzna że Pobiera nazwę strony
- getMaximumLoadTime(): wewnętrzna metoda, która zwraca jak długo strona powinna mieć możliwość załadowania w sekundach
- weryfikujących (): metoda wewnętrzna sprawia, czy strona faktycznie załadowane
Ponownie, w zdecydowanej większości przypadków, do/while działa jeden raz, ponieważ kod poza Nawigacja (odśwież)() nie zostanie wykonana. do momentu, gdy przeglądarka faktycznie całkowicie załaduje stronę, ale widzieliśmy przypadki, w których zajmie to kilka sekund, aby przejść przez tę pętlę, ponieważ funkcja navigate(). refresh() nie ock, dopóki przeglądarka nie zakończy ładowania.
Dobrze! to ci pomogło. Alternatywnie, jeśli używasz czystego selenu RC lub WebDriverBackedSelenium możesz również użyć: selenium.refresh(); –
Nie jest to równoznaczne z naciśnięciem klawisza F5. 'driver.navigate(). refresh()' w nagłówku żądania mówi "no-cache", co w rezultacie bezwarunkowo przeładowuje całą zawartość. Podczas gdy naciśnięcie klawisza F5 może spowodować żądanie "If-Modified-Since", może pojawić się odpowiedź "Nie zmodyfikowano". Musisz pamiętać o tej różnicy, jeśli wczytujesz testy. –
Dziękuję bardzo za tę odpowiedź :) Upvote – WEshruth