Una cosa importante a tener en cuenta es que la llamada driver.navigate (). Refresh () a veces parece ser asíncrona, lo que significa que no espera a que finalice la actualización, simplemente "inicia la actualización" y no bloquea la ejecución posterior mientras el navegador está recargando la página.
Si bien esto solo parece suceder en una minoría de casos, pensamos que es mejor asegurarse de que esto funcione al 100% agregando una verificación manual si la página realmente comenzó a recargarse.
Aquí está el código que escribí para eso en nuestra clase de objeto de página base:
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();
}
Algunas notas:
- Como está volviendo a cargar la página, no puede simplemente verificar la existencia de un elemento dado, porque el elemento estará allí antes de que comience la recarga y después de que también se haya completado. Entonces, a veces puede ser cierto, pero la página ni siquiera comenzó a cargarse todavía.
- Cuando la página se vuelve a cargar, la comprobación de WebElement.isDisplayed () arrojará una StaleElementReferenceException. El resto es solo para cubrir todas las bases.
- getName (): método interno que obtiene el nombre de la página
- getMaximumLoadTime (): método interno que devuelve cuánto tiempo se debe permitir que la página se cargue en segundos
- verificar (): el método interno asegura que la página se cargue realmente
Nuevamente, en la gran mayoría de los casos, el bucle do / while se ejecuta una sola vez porque el código más allá de navegar (). Refresh () no se ejecuta hasta que el navegador vuelve a cargar la página por completo, pero hemos visto casos en los que En realidad, lleva unos segundos atravesar ese ciclo porque el navegador (). refresh () no se bloqueó hasta que el navegador terminó de cargarse.