Важно отметить, что вызов 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 () не блокировалась, пока браузер не завершил загрузку.
person
mac
schedule
09.06.2016