Uma coisa importante a ser observada é que a chamada driver.navigate (). Refresh () às vezes parece assíncrona, o que significa que ela não espera a atualização terminar, apenas "inicia a atualização" e não impede a execução adicional enquanto o navegador estiver recarregando a página.
Embora isso pareça acontecer apenas em uma minoria de casos, concluímos que é melhor garantir que isso funcione 100% adicionando uma verificação manual se a página realmente começou a ser recarregada.
Aqui está o código que escrevi para isso em nossa classe 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();
}
Algumas notas:
- Como você está recarregando a página, não é possível apenas verificar a existência de um determinado elemento, porque o elemento estará lá antes do recarregamento começar e depois que ele terminar. Às vezes, você pode se tornar realidade, mas a página ainda nem começou a carregar.
- Quando a página é recarregada, a verificação de WebElement.isDisplayed () gera uma StaleElementReferenceException. O resto é apenas para cobrir todas as bases
- getName (): método interno que obtém o nome da página
- getMaximumLoadTime (): método interno que retorna por quanto tempo a página deve carregar em segundos
- Verifique (): o método interno garante que a página esteja realmente carregada
Novamente, na grande maioria dos casos, o loop do / while é executado uma única vez, porque o código além de navigate (). Refresh () não é executado até que o navegador realmente recarregue a página completamente, mas vimos casos em que na verdade, leva alguns segundos para atravessar esse loop, porque o navegador (). refresh () não foi bloqueado até o navegador terminar de carregar.