Дочекайтеся завантаження сторінки в Selenium


Відповіді:


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
це справді працює весь час? Можливо, мені щось не вистачає у вашому коді, але ви чекаєте, коли дом буде в готовому стані. Але врахуйте, що якщо ваш код виконається занадто швидко, попередня сторінка може бути ще не завантажена, і вона повернеться правдою, навіть якщо ви все ще знаходитесь на старій сторінці. Що потрібно зробити, це зачекати, коли поточна сторінка розвантажиться, а потім зателефонувати вищенаведеному коду. Спосіб виявлення завантаження сторінки - це отримання послаблення на поточній сторінці та чекання, поки воно стане несвіжим. obeythetestinggoat.com/…
Джордж

6
FYI - Навіть все вищесказане не гарантує, що сторінка повна - лише те, що дім готовий. Будь-який dojo / jquery може все-таки динамічно будувати елементи на сторінці, тому вам може знадобитися спочатку зачекати динамічні елементи, перш ніж взаємодіяти з ними.
Джордж

3
Майте на увазі, що цей метод перевіряє лише DOM. Якщо ви використовуєте Ajax або AngularJS, це не працюватиме, оскільки будуть деякі асинхронні дзвінки, які не вдасться визначити документом.readyState.
Homewrecker

3
Це код C #. Це не працює з Java, і питання про Java .
Кінгамер

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.
Себі

Від doc ..і метод блокується до повного завантаження ...
xyz

2
@Karna: Так, теоретично це слід завжди, а на практиці це робило більшість часу. Використовуючи Selenium в той час, підкреслювалося, що бували випадки, коли думка, що сторінка закінчується завантаженням, але ні. Я не використовував селен останнім часом багато, так що це може бути, а може і досі не бути таким.
Пол Хедфілд

3
Я погоджуюсь: особливо драйвер Internet Explorer баггі і повертає контроль негайно в деяких випадках, хоча сторінка все ще завантажується. Це мій випадок, я додав функцію очікування JavascriptExecutor, чекаючи, коли document.readyState буде "завершеним". Зважаючи на те, що в обидва кінці від селену до браузера, стан гонки, напевно, погіршується, і це "завжди" працює для мене. Після "click ()", коли очікую завантаження сторінки, я явно чекаю (використовуючи WebDriverWait) готового стану. ]
dmansfield

22

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

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {
    @driver.execute_script("return document.readyState;") == "complete" 
}

17
Еквівалент Python: WebDriverWait (драйвер, 10) .until (lambda d: d.execute_script ('return document.readyState') == 'завершено')
blize

2
Python використовує наведений вище код, але не забувайте про цей рядок .. | з
selenium.webdriver.support.ui

У мене виникла проблема при натисканні на елемент, коли сторінка не була завантажена повністю. У Python я спробував time.sleep (30). Це спрацювало. Це завжди буде чекати максимум 30 секунд. Потім я спробував наступний код, і він зараз більш ефективний, швидше. WebDriverWait (драйвер, 10) .until (lambda d: driver.find_element_by_xpath ("// div [. = 'Administration']"). Click ())
Riaz Ladhani

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");
        }
    });
}

Дякую за ці поради. Я додаю його у свій 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__))

Далі, рішення покладається на те, що селен записує (внутрішній) ідентифікаційний номер для всіх елементів на сторінці, включаючи верхній рівень <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)

Щоб отримати більше пітонічних, багаторазових помічників, ви можете створити контекстний менеджер:

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()

Я вважаю, що це куленепробивна! Що ти думаєш?

Більше інформації в публікації блогу тут


Я читаю вашу веб-сторінку, перш ніж знову шукати конкретніше код java, який реалізує ваше рішення. Нічого поки що ...
andrew lorien

11

Ви також можете використовувати клас: ExpectedConditions явно чекати, коли елемент з’явиться на веб-сторінці, перш ніж вжити будь-яких дій, подальших дій

Ви можете використовувати ExpectedConditionsклас, щоб визначити, чи видно елемент:

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

Перегляньте ExpectedConditions class Javadocсписок усіх умов, які ви можете перевірити.


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 після події завантаження після того, як все ініціалізується, і перевірити та дочекатися цієї змінної JS у Selenium.


Це просто, якщо сайт ваш, щоб змінити!
reinierpost

Так, просто використовуйте JavascriptExecutor для виконання jQuery.js і тоді у вас є доступ до подій завантаження jQuery. Це рідкісний випадок, коли це необхідно. Стандартний Webdriver має достатню потужність, щоб зробити 98% належного очікування.
djangofan

@djangofan було б дивним, щоб побачити приклад цього ... Я передовий хлопець, тому не знаю, де або як використовується JavascriptExecutor.
BradGreens

@BradGreens - Добре, дивіться на мій проект тут: github.com/djangofan/jquery-growl-selenium-example . Якщо у вас є пропускна здатність для завершення цього прикладу, я не міг змусити jGrowl працювати в цьому тестовому проекті, хоча jQuery працює добре.
djangofan

1
@BradGreens На додаток до коментар djangofan бачать мою відповідь тут: 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 - це використовувати шаблон дизайну Об'єкт сторінки разом із PageFactory. Це дозволяє вам використовувати те, AjaxElementLocatorFactoryщо, якщо говорити, просто виступає як глобальне очікування всіх ваших елементів. У нього є обмеження щодо таких елементів, як спадні скриньки або складні переходи JavaScript, але це різко зменшить кількість необхідного коду та пришвидшить тестові часи. Хороший приклад можна знайти в цьому пості. Передбачається базове розуміння Core Java.

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


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...

З документації Селен:

this.get (url) → Thenable

Запланує команду для переходу до вказаної URL-адреси.

Повертає обіцянку , що буде вирішена , коли документ має закінчену навантаження .

Документація селену (Nodejs)


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.


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");
}

Я змінив булеву інформацію на недійсну, але не працює в 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;
        }
    });
}

Ви можете перейти з документа на елемент, якщо змінюється лише частина документа.

Цей прийом був натхненний відповіддю з тих пір.


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
}

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"));
}});

Це те, що я використовував для аналогічного сценарію, і це прекрасно працює.


Я думаю, що driver.get чекає завершення функції завантаження, перш ніж повернути контроль до коду, якщо на сторінці немає багато 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;
            }
        }

2

Найкращий спосіб, який я бачив, - це використовувати stalenessOfочікуваний стан, щоб дочекатися, коли стара сторінка стане черствою.

Приклад:

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

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

Він зачекає десять секунд, коли старий тег HTML стане несвіжим, а потім викине виняток, якщо цього не відбудеться.


1
затишшя WebElement не передбачає завантаження нової сторінки.
Корі Голдберг

Звичайно, але це означає, що стару сторінку закінчено вивантажувати. На мій досвід, так само важливо знати, коли стару сторінку розвантажували чи вона з якоїсь причини зупинялася.
forresthopkinsa

Звичайно, я зазвичай використовую stalenessOf спільно з іншими тестами, щоб отримати повний процес вивантаження / завантаження.
forresthopkinsa

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';
}))

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()



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(); 
 }

2

Людина на всі ці відповіді вимагає занадто багато коду. Це має бути проста річ, оскільки її досить поширене.

Чому б просто не ввести якийсь простий javascript з webdriver і перевірити. Це метод, який я використовую в своєму класі веб-шрифтів. 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.