while (i! = i) {} - возможно ли присвоение, которое всегда верно [дубликат]

Важно отметить, что вызов 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 (): внутренний метод, который возвращает, как долго должна быть разрешена страница load in seconds
  • verify (): внутренний метод гарантирует, что страница действительно загружена

Опять же, в подавляющем большинстве случаев цикл do / while запускает одиночный время, потому что код за пределами навигации (). refresh () не выполняется, пока браузер фактически не перезагрузит страницу полностью, но мы видели случаи, когда на самом деле требуется секунд, чтобы пройти через этот цикл, потому что navigate (). refresh ( ) не блокировалось, пока браузер не завершил загрузку.

13
задан DonCallisto 20 June 2017 в 07:33
поделиться