Selenium Java (правильное ожидание загрузки новой страницы)

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

В течение нескольких дней пытались найти одно лучшее решение (без sheninigans:-D), чтобы дождаться загрузки новой страницы, после нажатия и т. Д. Ofc нет старых дней 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 ответ

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

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
wait.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(By.Name("elementNameHere")));
Другие вопросы по тегам