Eine wichtige Sache, die zu beachten ist, ist, dass der Aufruf von driver.navigate (). Refresh () manchmal asynchron zu sein scheint, was bedeutet, dass er nicht auf den Abschluss der Aktualisierung wartet, sondern nur "die Aktualisierung startet" und die weitere Ausführung nicht blockiert während der Browser die Seite neu lädt.
Obwohl dies nur in wenigen Fällen der Fall zu sein scheint, haben wir herausgefunden, dass es besser ist, sicherzustellen, dass dies zu 100% funktioniert, indem Sie eine manuelle Überprüfung hinzufügen, ob die Seite wirklich neu geladen wurde.
Hier ist der Code, den ich dafür in unserer Basisseitenobjektklasse geschrieben habe:
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();
}
Einige Notizen:
- Da Sie die Seite neu laden, können Sie nicht einfach die Existenz eines bestimmten Elements überprüfen, da das Element dort ist, bevor das Neuladen beginnt und nachdem es auch abgeschlossen ist. Manchmal wird es also wahr, aber die Seite wurde noch nicht einmal geladen.
- Wenn die Seite neu geladen wird, wird beim Überprüfen von WebElement.isDisplayed () eine StaleElementReferenceException ausgelöst. Der Rest soll nur alle Basen abdecken
- getName (): Interne Methode, die den Namen der Seite abruft
- getMaximumLoadTime (): Interne Methode, die zurückgibt, wie lange eine Seite in Sekunden geladen werden soll
- verify (): Die interne Methode stellt sicher, dass die Seite tatsächlich geladen wird
Wiederum wird in den allermeisten Fällen die do / while-Schleife ein einziges Mal ausgeführt, da der Code jenseits von navig (). Refresh () erst ausgeführt wird, wenn der Browser die Seite tatsächlich vollständig neu geladen hat, aber wir haben Fälle gesehen, in denen Es dauert tatsächlich Sekunden, um diese Schleife zu durchlaufen, da navig (). refresh () nicht blockiert wurde, bis der Browser das Laden beendet hat.