Selenium Java (правильное ожидание загрузки новой страницы) - PullRequest
0 голосов
/ 11 сентября 2018

Это не вопрос, а обмен информацией (я думаю, что многие будут использовать ее)

В течение нескольких дней пытались найти одно лучшее решение (без sheninigans :-D), чтобы дождаться загрузки новой страницы, после нажатия и т. Д. Ofc no old days Thread.sleep или неявное ожидание

Некоторые люди предлагали дождаться загрузки последнего элемента из новой страницы, некоторые предлагали использовать JS executor (решение document.readyState), которое иногда не будет работать (в моем случае, оно всегда давало полный ответ)

Нашел другое решение, чтобы проверить, когда ссылка на элемент на текущей странице вызовет исключение StaleElementReferenceException. Но ... в этом случае страницу не удалось загрузить после этого исключения.

Что я сделал? объединили оба решения вместе, и это всегда помогает мне ... Один следит за тем, чтобы документ не был в состоянии готовности (причина вызывает исключение staleElementReferenceException), а другой сразу после этого проверяет, пока страница полностью не загружается, и выдает readyState == complete

    while(true) {    
       try {
          //it's just an interaction (can be any) with element on current page
          anyElementFromCurrentPage.getText();
       } catch (StaleElementReferenceException e) {
            break;
       }
       waitForLoad(driver);
       return this;
    }

    void waitForLoad(WebDriver driver) {
       new WebDriverWait(driver, 30).until((ExpectedCondition<Boolean>) wd ->
                    ((JavascriptExecutor) wd).executeScript("return 
       document.readyState").equals("complete"));
    }

надеюсь, что некоторые люди будут использовать это пуленепробиваемое решение :-)

1 Ответ

0 голосов
/ 11 сентября 2018

Так что я работаю в C #, но Java похожа.Это то, что я сейчас использую, хотя оно помечено как «устаревшее».

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
wait.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(By.Name("elementNameHere")));
...