한 가지 중요한 점은 driver.navigate (). refresh () 호출이 때때로 비동기식으로 보인다는 것입니다. 즉, 새로 고침이 완료 될 때까지 기다리지 않고 "새로 고침을 시작"하고 추가 실행을 차단하지 않습니다. 브라우저가 페이지를 다시로드하는 동안.
이것은 소수의 경우에만 발생하는 것처럼 보이지만, 페이지가 실제로 새로 고침을 시작했는지 수동 확인을 추가하여 100 % 작동하는지 확인하는 것이 좋습니다.
다음은 기본 페이지 개체 클래스에서 작성한 코드입니다.
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();
}
몇 가지 참고 사항 :
- 페이지를 다시로드하고 있기 때문에 해당 요소가 새로 고침이 시작되기 전과 완료된 후에도 존재하기 때문에 주어진 요소의 존재를 확인할 수 없습니다. 따라서 때로는 사실이 될 수 있지만 페이지가 아직로드되지도 않았습니다.
- 페이지가 다시로드 될 때 WebElement.isDisplayed ()를 확인하면 StaleElementReferenceException이 발생합니다. 나머지는 모든 기지를 덮는 것입니다.
- getName () : 페이지 이름을 가져 오는 내부 메소드
- getMaximumLoadTime () : 페이지로드가 허용되어야하는 시간 (초)을 반환하는 내부 메서드
- verify () : 내부 메서드는 페이지가 실제로로드되었는지 확인합니다.
다시 말하지만, 대부분의 경우에 do / while 루프는 브라우저가 실제로 페이지를 완전히 다시로드 할 때까지 navigate (). refresh () 이외의 코드가 실행되지 않기 때문에 한 번만 실행됩니다. 브라우저가로드를 마칠 때까지 navigate (). refresh ()가 차단되지 않았기 때문에 실제로 해당 루프를 통과하는 데 몇 초가 걸립니다.