Как заставить Selenium 2.0 ждать загрузки страницы?
java
selenium
webdriver
selenium-webdriver
Картик Кумар
источник
источник
Ответы:
Вы также можете проверить загруженную страницу, используя следующий код
источник
Используйте класс WebDriverWait
Также смотрите здесь
Вы можете ожидать показать какой-то элемент. что-то вроде в C #:
источник
Если вы установите неявное ожидание драйвера, а затем вызовите
findElement
метод для элемента, который, как вы ожидаете, будет на загруженной странице, WebDriver будет запрашивать этот элемент, пока не найдет элемент или не достигнет значения времени ожидания.источник: неявный-ждет
источник
В целом, в Selenium 2.0 веб-драйвер должен возвращать управление вызывающему коду только после того, как определит, что страница загружена. Если это не так, вы можете позвонить
waitforelemement
, который циклически повторяет вызовfindelement
до тех пор, пока он не будет найден или не истечет время ожидания (можно установить время ожидания).источник
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.
JavascriptExecutor
, чтобы document.readyState было «завершено». Я полагаю, что из-за обратной поездки от селена к браузеру состояние гонки смягчается, и это «всегда» работает для меня. После «click ()», когда я ожидаю загрузки страницы, я явно жду (используя WebDriverWait) состояние готовности. ]Реализация Ruby:
источник
Вы можете удалить
System.out
строку. Это добавлено для целей отладки.источник
Все эти решения подходят для конкретных случаев, но они страдают по крайней мере от одной из пары возможных проблем:
Они не достаточно универсальны - они хотят, чтобы вы знали заранее, что для страницы, на которую вы переходите, будут выполняться некоторые конкретные условия (например, будет отображаться какой-то элемент)
Они открыты для состояния гонки, когда вы используете элемент, который фактически присутствует на старой странице, а также на новой странице.
Вот моя попытка общего решения, которое позволяет избежать этой проблемы (в Python):
Во-первых, общая функция ожидания (используйте WebDriverWait, если хотите, я нахожу их безобразными):
Далее, решение опирается на тот факт, что селен записывает (внутренний) id-номер для всех элементов на странице, включая
<html>
элемент верхнего уровня . Когда страница обновляется или загружается, она получает новый HTML-элемент с новым идентификатором.Итак, если вы хотите нажать на ссылку с текстом «моя ссылка», например:
Для большего Pythonic, многоразового, универсального помощника, вы можете сделать контекстный менеджер:
И тогда вы можете использовать его практически для любого взаимодействия с селеном:
Я считаю, что это пуленепробиваемый! Что вы думаете?
Более подробная информация в блоге об этом здесь
источник
Вы также можете использовать класс:
ExpectedConditions
для явного ожидания появления элемента на веб-странице, прежде чем предпринимать какие-либо действия.Вы можете использовать
ExpectedConditions
класс, чтобы определить, является ли элемент видимым:Смотрите
ExpectedConditions class Javadoc
список всех условий, которые вы можете проверить.источник
Ответ Имрана перефразирован для Java 7:
источник
Похоже, это серьезное ограничение WebDriver. Очевидно, что ожидание элемента не подразумевает загрузку страницы, в частности, DOM может быть полностью собран (состояние готовности), при этом JS все еще выполняется, а CSS и изображения все еще загружаются.
Я считаю, что самое простое решение - установить переменную JS для события onload после того, как все будет инициализировано, а также проверить и дождаться этой переменной JS в Selenium.
источник
Если вы хотите дождаться загрузки определенного элемента, вы можете использовать
isDisplayed()
метод дляRenderedWebElement
:(Пример из 5-минутного руководства по началу работы )
источник
RenderedWebElement
в API нет. ОднакоisDisplayed()
метод теперь доступен напрямуюWebElement
.Явное ожидание или условное ожидание в этом ожидании, пока не будет дано это условие.
Это будет ждать каждого веб-элемента в течение 60 секунд.
Используйте неявное ожидание ожидания каждого элемента на странице до указанного времени.
Это будет ждать каждого веб-элемента в течение 60 секунд.
источник
Используйте неявное ожидание ожидания каждого элемента на странице до указанного времени.
это ожидание каждого элемента на странице в течение 30 сек.
Другое ожидание - это явное ожидание или условное ожидание в этом ожидании, пока не будет задано условие.
В id укажите статический идентификатор элемента, который неуверенно отображается на странице, как только страница загружается.
источник
Я удивлен, что предикаты не были первым выбором, поскольку вы, как правило, знаете, с какими элементами вы будете взаимодействовать в следующий раз на странице, которую вы ожидаете загрузить. Мой подход всегда заключался в создании предикатов / функций, таких как
waitForElementByID(String id)
иwaitForElemetVisibleByClass(String className)
т. Д., А затем использовать и повторно использовать их везде, где они мне нужны, будь то загрузка страницы или изменение содержимого страницы, на котором я жду.Например,
В моем тестовом классе:
В моем тестовом классе родитель:
Несмотря на то, что это выглядит много, нужно постоянно проверять вас, и можно установить интервал между тем, как часто проверять, а также время ожидания до истечения времени ожидания. Также вы будете повторно использовать такие методы.
В этом примере родительский класс определил и инициировал
WebDriver driver
иWebDriverWait driverWait
.Надеюсь, это поможет.
источник
Лучший способ дождаться загрузки страницы при использовании привязок Java для WebDriver - это использовать шаблон проектирования Page Object с PageFactory. Это позволяет вам использовать то,
AjaxElementLocatorFactory
что нужно, просто действует как глобальное ожидание всех ваших элементов. У него есть ограничения на такие элементы, как выпадающие списки или сложные переходы JavaScript, но он значительно сократит объем необходимого кода и ускорит время тестирования. Хороший пример можно найти в этом посте. Базовое понимание Core Java предполагается.http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html
источник
Решение NodeJS:
В Nodejs вы можете получить его с помощью обещаний ...
Если вы напишите этот код, вы можете быть уверены, что страница полностью загружена, когда вы переходите к ...
Если вы напишите этот код, вы будете перемещаться, и селен будет ждать 3 секунды ...
Из документации Selenium:
this.get (url) → затем
Планирует команду для перехода к указанному URL.
Возвращает обещание, которое будет разрешено после завершения загрузки документа .
Селеновая документация (Nodejs)
источник
Вот версия Java 8 наиболее популярного в настоящее время ответа :
Где
myDriver
находитсяWebDriver
объект (объявленный ранее).Примечание . Помните, что этот метод (
document.readyState
) проверяет только DOM.источник
Вызовите ниже функцию в вашем скрипте, это будет ждать, пока страница не будет загружена с использованием JavaScript
источник
Вы можете перейти от документа к элементу, если изменяется только часть документа.
Эта техника была вдохновлена ответом frombasic.
источник
SeleniumWaiter :
И вам это используют :
источник
Вы можете использовать существующий ниже метод для установки времени для pageeLoadTimeout в следующем примере, если загрузка страницы занимает более 20 секунд, тогда она выдаст исключение перезагрузки страницы
источник
Вы можете явно дождаться появления элемента на веб-странице, прежде чем предпринимать какие-либо действия (например, element.click ())
Это то, что я использовал для аналогичного сценария, и он отлично работает.
источник
Мой простой способ:
источник
Лучший способ, который я видел, - это использовать
stalenessOf
ExpectedCondition, чтобы дождаться устаревания старой страницы.Пример:
Он будет ждать десять секунд, пока старый HTML-тег не устареет, а затем выдаст исключение, если этого не произойдет.
источник
Я использую node + selenium-webdriver (сейчас это версия 3.5.0). что я делаю для этого:
источник
Вы можете использовать ожидание. Есть в основном 2 типа ожидания в селене
- неявное ожидание
Это очень просто, смотрите синтаксис ниже:
- явное ожидание
Явное ожидание или условное ожидание в этом ожидании, пока не будет выполнено заданное условие.
Вы можете использовать другие свойства, такие как
visblityOf()
,visblityOfElement()
источник
Если кто-то использует селенид:
Дополнительные условия можно найти здесь: http://selenide.org/javadoc/3.0/com/codeborne/selenide/Condition.html
источник
В моем случае я использовал следующее, чтобы узнать статус загрузки страницы. В нашем приложении присутствуют gif (ы) загрузки, и я слушаю их следующим образом, чтобы исключить нежелательное время ожидания в скрипте.
Где xpath находит gif в HTML DOM. После этого Вы также можете реализовать свои методы действий. Нажмите.
источник
Человек все эти ответы требует слишком много кода. Это должно быть простой вещью, так как это довольно часто.
Почему бы просто не вставить какой-нибудь простой javascript с веб-драйвером и проверить. Это метод, который я использую в своем классе веб-мастеров. Javascript довольно прост, даже если вы не знаете JS.
источник
Как заставить Selenium ждать загрузки страницы после клика, предлагает следующий интересный подход:
WebElement
со старой страницы.WebElement
покаStaleElementReferenceException
не брошен.Образец кода:
источник
new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(element))
.