Дождитесь загрузки страницы в Selenium

240

Как заставить Selenium 2.0 ждать загрузки страницы?

Картик Кумар
источник
7
Для меня только правильный ответ Павла выглядит правильным, большинство ответов с высокими голосами говорят о ожидании определенного элемента.
xyz

Ответы:

138

Вы также можете проверить загруженную страницу, используя следующий код

IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));

 wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
Имран
источник
22
Можно подумать, что что-то подобное будет встроено. Ожидание загрузки страницы - довольно распространенная вещь в Интернете.
PRMan
19
это действительно работает все время? Может быть, я что-то упустил из вашего кода, но вы ждете, пока DOM будет в состоянии готовности. Но учтите, что если ваш код выполняется слишком быстро, предыдущая страница может быть еще не выгружена, и она вернет true, даже если вы все еще находитесь на старой странице. Что вам нужно сделать, это дождаться загрузки текущей страницы, а затем вызвать указанный выше код. Способ обнаружить разгрузку страницы - получить веб-элемент на текущей странице и подождать, пока он не станет устаревшим. obeythetestinggoat.com/…
Джордж
6
К вашему сведению - даже вышеупомянутое не гарантирует, что страница готова - просто, что дом готов. Любой dojo / jquery может по-прежнему динамически создавать элементы на странице, поэтому вам может потребоваться сначала подождать динамические элементы, прежде чем взаимодействовать с ними.
Джордж
3
Имейте в виду, что этот метод проверяет только DOM. Если вы используете Ajax или AngularJS, это не будет работать, потому что будут некоторые асинхронные вызовы, которые не могут быть обнаружены document.readyState.
Homewrecker
3
Это код C #. Это не работает с Java, и вопрос, заданный о Java .
Kingamere
89

Используйте класс WebDriverWait

Также смотрите здесь

Вы можете ожидать показать какой-то элемент. что-то вроде в C #:

WebDriver _driver = new WebDriver();
WebDriverWait _wait = new WebDriverWait(_driver, new TimeSpan(0, 1, 0));

_wait.Until(d => d.FindElement(By.Id("Id_Your_UIElement"));
Артем
источник
Это сработало отлично. Это очень хороший современный способ решения проблемы.
CrazyDart
3
@ EmmanuelAngelo.R TimeSpan - это структура данных .Net.
rjzii
12
Что делать, если я не знаю, какой элемент будет на странице?
JustGoscha
3
Это будет работать, чтобы дождаться загрузки определенного элемента, а не всей страницы.
xyz
1
Это вовсе не гарантирует, что элемент будет полностью загружен, и не отвечает на вопрос. Как кто-нибудь может поддержать это?
Борис Дмитриевич Теохаров
36

Если вы установите неявное ожидание драйвера, а затем вызовите findElementметод для элемента, который, как вы ожидаете, будет на загруженной странице, WebDriver будет запрашивать этот элемент, пока не найдет элемент или не достигнет значения времени ожидания.

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

источник: неявный-ждет

Сэм
источник
3
Это не поможет в ожидании загрузки страницы.
xyz
Это означает, что он попробует что-то в течение 10 секунд, прежде чем вызовет исключение. поэтому он не может быть уверен, что это займет 10 секунд.
skysign
1
@xyz - почему это не поможет?
MasterJoe2
@ testerjoe2 ждет, пока будет найден конкретный элемент, вопрос в том, как ждать загрузки страницы.
XYZ
35

В целом, в Selenium 2.0 веб-драйвер должен возвращать управление вызывающему коду только после того, как определит, что страница загружена. Если это не так, вы можете позвонить waitforelemement, который циклически повторяет вызов findelementдо тех пор, пока он не будет найден или не истечет время ожидания (можно установить время ожидания).

Пол Хэдфилд
источник
2
Добавление к ответу Павла. Пожалуйста, проверьте это также stackoverflow.com/questions/5858743/… .
9ихан
27
К сожалению, Selenium 2 не всегда ждет загрузки страницы. Например, WebElement: click () не ждет, и об этом прямо говорится в принадлежащем Javadoc. Тем не менее, они не говорят, как я могу проверить новую страницу для загрузки. If click() causes a new page to be loaded via an event or is done by sending a native event (which is a common case on Firefox, IE on Windows) then the method will not wait for it to be loaded and the caller should verify that a new page has been loaded.
Себи
С документа ... и метод будет блокироваться, пока загрузка не будет завершена ...
xyz
2
@Karna: Да, теоретически так должно быть всегда, а на практике - большую часть времени. Использование Selenium в то время показало, что были времена, когда он думал, что страница закончила загрузку, но это не так. Я не использовал селен в последнее время, так что это может быть, а может и не быть.
Пол Хэдфилд
3
Я согласен: особенно драйвер Internet Explorer глючит и сразу же возвращает управление, даже если страница все еще загружается. В моем случае я добавил ожидание, используя для того JavascriptExecutor, чтобы document.readyState было «завершено». Я полагаю, что из-за обратной поездки от селена к браузеру состояние гонки смягчается, и это «всегда» работает для меня. После «click ()», когда я ожидаю загрузки страницы, я явно жду (используя WebDriverWait) состояние готовности. ]
Дмансфилд
22

Реализация Ruby:

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {
    @driver.execute_script("return document.readyState;") == "complete" 
}
allenhwkim
источник
17
Эквивалент Python: WebDriverWait (драйвер, 10) .until (лямбда-d: d.execute_script ('return document.readyState') == 'complete')
пылая
2
Python использует приведенный выше код, но не забудьте эту строку .. | из selenium.webdriver.support.ui import WebDriverWait
t3dodson
У меня была проблема при нажатии на элемент, когда страница была загружена не полностью. В Python я попробовал time.sleep (30). Это сработало. Это всегда будет ждать максимум 30 секунд. Затем я попробовал следующий код, и теперь он более эффективен, быстрее. WebDriverWait (драйвер, 10) .until (лямбда-д: driver.find_element_by_xpath ("// div [. = 'Administration']").
Click
20

Вы можете удалить System.outстроку. Это добавлено для целей отладки.

WebDriver driver_;

public void waitForPageLoad() {

    Wait<WebDriver> wait = new WebDriverWait(driver_, 30);
    wait.until(new Function<WebDriver, Boolean>() {
        public Boolean apply(WebDriver driver) {
            System.out.println("Current Window State       : "
                + String.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState")));
            return String
                .valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState"))
                .equals("complete");
        }
    });
}
QIKHAN
источник
Спасибо за эти советы. Я добавляю это в мой SeleniumHelper; ср javabox
boly38
17

Все эти решения подходят для конкретных случаев, но они страдают по крайней мере от одной из пары возможных проблем:

  1. Они не достаточно универсальны - они хотят, чтобы вы знали заранее, что для страницы, на которую вы переходите, будут выполняться некоторые конкретные условия (например, будет отображаться какой-то элемент)

  2. Они открыты для состояния гонки, когда вы используете элемент, который фактически присутствует на старой странице, а также на новой странице.

Вот моя попытка общего решения, которое позволяет избежать этой проблемы (в Python):

Во-первых, общая функция ожидания (используйте WebDriverWait, если хотите, я нахожу их безобразными):

def wait_for(condition_function):
    start_time = time.time()
    while time.time() < start_time + 3:
        if condition_function():
            return True
        else:
            time.sleep(0.1)
    raise Exception('Timeout waiting for {}'.format(condition_function.__name__))

Далее, решение опирается на тот факт, что селен записывает (внутренний) id-номер для всех элементов на странице, включая <html>элемент верхнего уровня . Когда страница обновляется или загружается, она получает новый HTML-элемент с новым идентификатором.

Итак, если вы хотите нажать на ссылку с текстом «моя ссылка», например:

old_page = browser.find_element_by_tag_name('html')

browser.find_element_by_link_text('my link').click()

def page_has_loaded():
    new_page = browser.find_element_by_tag_name('html')
    return new_page.id != old_page.id

wait_for(page_has_loaded)

Для большего Pythonic, многоразового, универсального помощника, вы можете сделать контекстный менеджер:

from contextlib import contextmanager

@contextmanager
def wait_for_page_load(browser):
    old_page = browser.find_element_by_tag_name('html')

    yield

    def page_has_loaded():
        new_page = browser.find_element_by_tag_name('html')
        return new_page.id != old_page.id

    wait_for(page_has_loaded)

И тогда вы можете использовать его практически для любого взаимодействия с селеном:

with wait_for_page_load(browser):
    browser.find_element_by_link_text('my link').click()

Я считаю, что это пуленепробиваемый! Что вы думаете?

Более подробная информация в блоге об этом здесь

hwjp
источник
Я прочитал вашу веб-страницу, прежде чем снова искать более конкретный код Java, который реализует ваше решение. Пока ничего ...
Эндрю Лориен
11

Вы также можете использовать класс: ExpectedConditionsдля явного ожидания появления элемента на веб-странице, прежде чем предпринимать какие-либо действия.

Вы можете использовать ExpectedConditionsкласс, чтобы определить, является ли элемент видимым:

WebElement element = (new WebDriverWait(getDriver(), 10)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input#houseName")));

Смотрите ExpectedConditions class Javadocсписок всех условий, которые вы можете проверить.

TedEd
источник
11

Ответ Имрана перефразирован для Java 7:

    WebDriverWait wait = new WebDriverWait(driver, 30);

    wait.until(new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver wdriver) {
            return ((JavascriptExecutor) driver).executeScript(
                "return document.readyState"
            ).equals("complete");
        }
    });
Плавник
источник
10

Похоже, это серьезное ограничение WebDriver. Очевидно, что ожидание элемента не подразумевает загрузку страницы, в частности, DOM может быть полностью собран (состояние готовности), при этом JS все еще выполняется, а CSS и изображения все еще загружаются.

Я считаю, что самое простое решение - установить переменную JS для события onload после того, как все будет инициализировано, а также проверить и дождаться этой переменной JS в Selenium.

sibidiba
источник
Это просто, если сайт ваш, чтобы изменить!
reinierpost
Да, просто используйте JavascriptExecutor для выполнения jQuery.js, и тогда у вас есть доступ к событиям загрузки jQuery. Это редкий случай, когда это необходимо. Стандартный Webdriver имеет достаточно мощности, чтобы сделать 98% правильного ожидания.
Джангофан
@djangofan было бы замечательно увидеть пример этого ... Я парень из внешнего интерфейса, поэтому не уверен, где и как используется JavascriptExecutor.
BradGreens
@BradGreens - Хорошо, посмотрите на мой проект здесь: github.com/djangofan/jquery-growl-selenium-example . Если у вас есть пропускная способность для завершения этого примера, я не смог бы заставить jGrowl работать в этом тестовом проекте, хотя jQuery работает отлично.
Джангофан
1
@BradGreens В дополнение к комментарию Джангофана, смотрите мой ответ здесь: stackoverflow.com/a/24638792/730326
jmathew
9

Если вы хотите дождаться загрузки определенного элемента, вы можете использовать isDisplayed()метод для RenderedWebElement:

// Sleep until the div we want is visible or 5 seconds is over
long end = System.currentTimeMillis() + 5000;
while (System.currentTimeMillis() < end) {
    // Browsers which render content (such as Firefox and IE) return "RenderedWebElements"
    RenderedWebElement resultsDiv = (RenderedWebElement) driver.findElement(By.className("gac_m"));

    // If results have been returned, the results are displayed in a drop down.
    if (resultsDiv.isDisplayed()) {
      break;
    }
}

(Пример из 5-минутного руководства по началу работы )

Тристан
источник
4
Год спустя (текущая версия Selenium 2.23.1) RenderedWebElementв API нет. Однако isDisplayed()метод теперь доступен напрямую WebElement.
Петр Янечек
1
Опрос ужасен, когда его можно избежать.
reinierpost
8

Явное ожидание или условное ожидание в этом ожидании, пока не будет дано это условие.

WebDriverWait wait = new WebDriverWait(wb, 60);
wait.until(ExpectedConditions.elementToBeClickable(By.name("value")));

Это будет ждать каждого веб-элемента в течение 60 секунд.

Используйте неявное ожидание ожидания каждого элемента на странице до указанного времени.

driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

Это будет ждать каждого веб-элемента в течение 60 секунд.

Ануй Теотия
источник
5

Используйте неявное ожидание ожидания каждого элемента на странице до указанного времени.

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

это ожидание каждого элемента на странице в течение 30 сек.

Другое ожидание - это явное ожидание или условное ожидание в этом ожидании, пока не будет задано условие.

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

В id укажите статический идентификатор элемента, который неуверенно отображается на странице, как только страница загружается.

Кулдип Ядав
источник
4

Я удивлен, что предикаты не были первым выбором, поскольку вы, как правило, знаете, с какими элементами вы будете взаимодействовать в следующий раз на странице, которую вы ожидаете загрузить. Мой подход всегда заключался в создании предикатов / функций, таких как waitForElementByID(String id)иwaitForElemetVisibleByClass(String className) т. Д., А затем использовать и повторно использовать их везде, где они мне нужны, будь то загрузка страницы или изменение содержимого страницы, на котором я жду.

Например,

В моем тестовом классе:

driverWait.until(textIsPresent("expectedText");

В моем тестовом классе родитель:

protected Predicate<WebDriver> textIsPresent(String text){
    final String t = text;
    return new Predicate<WebDriver>(){
        public boolean apply(WebDriver driver){
            return isTextPresent(t);
        }
    };
}

protected boolean isTextPresent(String text){
    return driver.getPageSource().contains(text);
}

Несмотря на то, что это выглядит много, нужно постоянно проверять вас, и можно установить интервал между тем, как часто проверять, а также время ожидания до истечения времени ожидания. Также вы будете повторно использовать такие методы.

В этом примере родительский класс определил и инициировал WebDriver driverи WebDriverWait driverWait.

Надеюсь, это поможет.

Джек Мейсон
источник
Это помогает мне! Спасибо за этот отличный образец. Я добавляю это в мой SeleniumHelper; ср javabox
boly38
4

Лучший способ дождаться загрузки страницы при использовании привязок Java для WebDriver - это использовать шаблон проектирования Page Object с PageFactory. Это позволяет вам использовать то, AjaxElementLocatorFactoryчто нужно, просто действует как глобальное ожидание всех ваших элементов. У него есть ограничения на такие элементы, как выпадающие списки или сложные переходы JavaScript, но он значительно сократит объем необходимого кода и ускорит время тестирования. Хороший пример можно найти в этом посте. Базовое понимание Core Java предполагается.

http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html

sonhu
источник
4

Решение NodeJS:

В Nodejs вы можете получить его с помощью обещаний ...

Если вы напишите этот код, вы можете быть уверены, что страница полностью загружена, когда вы переходите к ...

driver.get('www.sidanmor.com').then(()=> {
    // here the page is fully loaded!!!
    // do your stuff...
}).catch(console.log.bind(console));

Если вы напишите этот код, вы будете перемещаться, и селен будет ждать 3 секунды ...

driver.get('www.sidanmor.com');
driver.sleep(3000);
// you can't be sure that the page is fully loaded!!!
// do your stuff... hope it will be OK...

Из документации Selenium:

this.get (url) → затем

Планирует команду для перехода к указанному URL.

Возвращает обещание, которое будет разрешено после завершения загрузки документа .

Селеновая документация (Nodejs)

sidanmor
источник
4

Вот версия Java 8 наиболее популярного в настоящее время ответа :

WebDriverWait wait = new WebDriverWait(myDriver, 15);
wait.until(webDriver -> ((JavascriptExecutor) myDriver).executeScript("return document.readyState").toString().equals("complete"));

Где myDriverнаходится WebDriverобъект (объявленный ранее).

Примечание . Помните, что этот метод ( document.readyState) проверяет только DOM.

BelovedFool
источник
4

Вызовите ниже функцию в вашем скрипте, это будет ждать, пока страница не будет загружена с использованием JavaScript

public static boolean isloadComplete(WebDriver driver)
{
    return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("loaded")
            || ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
}
Шубхам Джайн
источник
Я поменял логическое значение на void, но в Chrome не работает
nosequeweaponer
3
/**
 * Call this method before an event that will change the page.
 */
private void beforePageLoad() {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("document.mpPageReloaded='notYet';");
}

/**
 * Call this method after an event that will change the page.
 * 
 * @see #beforePageLoad
 * 
 *      Waits for the previous page to disappear.
 */
private void afterPageLoad() throws Exception {
    (new WebDriverWait(driver, 10)).until(new Predicate<WebDriver>() {

        @Override
        public boolean apply(WebDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            Object obj = js.executeScript("return document.mpPageReloaded;");
            if (obj == null) {
                return true;
            }
            String str = (String) obj;
            if (!str.equals("notYet")) {
                return true;
            }
            return false;
        }
    });
}

Вы можете перейти от документа к элементу, если изменяется только часть документа.

Эта техника была вдохновлена ​​ответом frombasic.

Марк
источник
3

SeleniumWaiter :

import com.google.common.base.Function;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;

public class SeleniumWaiter {

      private WebDriver driver;

      public SeleniumWaiter(WebDriver driver) {
           this.driver = driver;
      }

      public WebElement waitForMe(By locatorname, int timeout){
           WebDriverWait wait = new WebDriverWait(driver, timeout);
           return wait.until(SeleniumWaiter.presenceOfElementLocated(locatorname));
      }

      public static Function<WebDriver, WebElement> presenceOfElementLocated(final By locator) {
            // TODO Auto-generated method stub
            return new Function<WebDriver, WebElement>() {
                 @Override
                 public WebElement apply(WebDriver driver) {
                      return driver.findElement(locator);
                 }
            };
      }
 }

И вам это используют :

_waiter = new SeleniumWaiter(_driver);

try {
   _waiter.waitForMe(By.xpath("//..."), 10);
} 
catch (Exception e) {
   // Error
}
tux23
источник
3

Вы можете использовать существующий ниже метод для установки времени для pageeLoadTimeout в следующем примере, если загрузка страницы занимает более 20 секунд, тогда она выдаст исключение перезагрузки страницы

 WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS)
Арпан Сайни
источник
2

Вы можете явно дождаться появления элемента на веб-странице, прежде чем предпринимать какие-либо действия (например, element.click ())

driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(new ExpectedCondition<WebElement>(){
        @Override
        public WebElement apply(WebDriver d) {
        return d.findElement(By.id("myDynamicElement"));
}});

Это то, что я использовал для аналогичного сценария, и он отлично работает.

anirus
источник
я думаю, что driver.get ожидает завершения функции onload, прежде чем вернет управление к коду, если только на странице много ajax
goh
2

Мой простой способ:

long timeOut = 5000;
    long end = System.currentTimeMillis() + timeOut;

        while (System.currentTimeMillis() < end) {

            if (String.valueOf(
                    ((JavascriptExecutor) driver)
                            .executeScript("return document.readyState"))
                    .equals("complete")) {
                break;
            }
        }
RichardK
источник
2

Лучший способ, который я видел, - это использовать stalenessOfExpectedCondition, чтобы дождаться устаревания старой страницы.

Пример:

WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 10);

WebElement oldHtml = driver.findElement(By.tagName("html"));
wait.until(ExpectedConditions.stalenessOf(oldHtml));

Он будет ждать десять секунд, пока старый HTML-тег не устареет, а затем выдаст исключение, если этого не произойдет.

forresthopkinsa
источник
1
устаревание WebElement не означает, что новая страница загружена.
Кори Голдберг
Конечно, но это означает, что старая страница выгружена. По моему опыту, так же важно знать, когда старая страница была выгружена или по какой-то причине остановилась.
Форрестхопкинса
Конечно, я обычно использую stalenessOf в сочетании с другими тестами, чтобы получить полный процесс выгрузки / загрузки.
Форрестхопкинса
2

Я использую node + selenium-webdriver (сейчас это версия 3.5.0). что я делаю для этого:

var webdriver = require('selenium-webdriver'),
    driver = new webdriver.Builder().forBrowser('chrome').build();
;
driver.wait(driver.executeScript("return document.readyState").then(state => {
  return state === 'complete';
}))
yuwanlin
источник
2

Вы можете использовать ожидание. Есть в основном 2 типа ожидания в селене

  • Неявное ожидание
  • Явное ожидание

- неявное ожидание

Это очень просто, смотрите синтаксис ниже:

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

- явное ожидание

Явное ожидание или условное ожидание в этом ожидании, пока не будет выполнено заданное условие.

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

Вы можете использовать другие свойства, такие как visblityOf(),visblityOfElement()

iamsankalp89
источник
2

В моем случае я использовал следующее, чтобы узнать статус загрузки страницы. В нашем приложении присутствуют gif (ы) загрузки, и я слушаю их следующим образом, чтобы исключить нежелательное время ожидания в скрипте.

public static void processing(){ 
    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
    wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
}

Где xpath находит gif в HTML DOM. После этого Вы также можете реализовать свои методы действий. Нажмите.

public static void click(WebElement elementToBeClicked){
    WebDriverWait wait = new WebDriverWait(driver, 45);
    wait.until(ExpectedConditions.visibilityOf(element));
    wait.until(ExpectedConditions.elementToBeClickable(element)); 
    wait.ignoring(NoSuchElementException.class).ignoring(StaleElementReferenceException.class); elementToBeClicked.click(); 
 }
Praveen
источник
2

Человек все эти ответы требует слишком много кода. Это должно быть простой вещью, так как это довольно часто.

Почему бы просто не вставить какой-нибудь простой javascript с веб-драйвером и проверить. Это метод, который я использую в своем классе веб-мастеров. Javascript довольно прост, даже если вы не знаете JS.

    def js_get_page_state(self):        
    """
    Javascript for getting document.readyState
    :return: Pages state.

    More Info: https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState
    """
    ready_state = self.driver.execute_script('return document.readyState')
    if ready_state == 'loading':
        self.logger.info("Loading Page...")
    elif ready_state == 'interactive':
        self.logger.info("Page is interactive")
    elif ready_state == 'complete':
        self.logger.info("The page is fully loaded!")
    return ready_state
Брюс Уэйн
источник
1

Как заставить Selenium ждать загрузки страницы после клика, предлагает следующий интересный подход:

  1. Сохраните ссылку на WebElementсо старой страницы.
  2. Нажмите на ссылку.
  3. Продолжайте вызывать операции на WebElementпока StaleElementReferenceExceptionне брошен.

Образец кода:

WebElement link = ...;
link.click();
new WebDriverWait(webDriver, timeout).until((org.openqa.selenium.WebDriver input) ->
{
    try
    {
        link.isDisplayed();
        return false;
    }
    catch (StaleElementReferenceException unused)
    {
        return true;
    }
});
Гили
источник
Отличная идея! Я никогда не задумывался над решением этой ситуации, проверяя противоположность успешной загрузки страницы, успешной выгрузки страницы (из-за отсутствия лучшего термина). Хотя то, является ли это лучшим вариантом, зависит от того, занимает ли StaleElementReferenceException меньше времени и т. Д., Чем ожидание успешной загрузки. Тем не менее, еще один хороший способ сделать это.
Джозеф Орландо
4
Это не говорит о том, загружена ли текущая страница, а о том, выгружена ли последняя страница (в частности, один элемент) . Вам все еще нужно будет дождаться загрузки текущей страницы. Кстати, вы можете заменить свой код выше на new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(element)).
JeffC