Как дождаться загрузки страницы с помощью Selenium

How Wait Page Load With Selenium



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

Причина, по которой это происходит, заключается в том, что веб-драйвер Selenium должен загрузить веб-страницу и завершить рендеринг страницы, прежде чем вы сможете что-либо с ней сделать. Раньше веб-сервер генерировал контент веб-сайта, а браузер просто загружал его и отображал. В наши дни у нас есть много одностраничных веб-приложений, которые работают немного иначе. В одностраничных веб-приложениях (SPA) веб-сервер обслуживает только коды внешнего интерфейса. После того, как код внешнего интерфейса отображается в браузере, код внешнего интерфейса использует AJAX для запроса данных API на веб-сервере. Как только интерфейс получает данные API, он отображает их в браузере. Таким образом, даже если браузер завершил загрузку и рендеринг веб-страницы, веб-страница все еще не готова. Вы должны дождаться получения данных API и их рендеринга. Итак, решение этой проблемы - дождаться появления данных, прежде чем что-либо делать с Selenium.







В Selenium есть 2 типа ожидания:
1) Неявное ожидание
2) Явное ожидание



1) Неявное ожидание: Это проще всего реализовать. Неявное ожидание указывает веб-драйверу Selenium подождать несколько секунд, пока DOM (объектная модель документа) не будет готова (веб-страница будет готова).



2) Явное ожидание: Это немного сложнее, чем неявное ожидание. В явном ожидании вы указываете веб-драйверу Selenium, чего ждать. Selenium ожидает выполнения этого конкретного условия. После его выполнения веб-драйвер Selenium будет готов принимать другие команды. Обычно явное время ожидания варьируется. Это зависит от того, насколько быстро будут выполнены условия. В худшем случае явное ожидание будет ждать столько же, сколько неявное ожидание.





В этой статье я покажу вам, как ждать (неявно и явно) загрузки страницы с помощью Selenium. Итак, приступим.

Предпосылки:

Чтобы опробовать команды и примеры из этой статьи, вы должны иметь:



1) На вашем компьютере установлен дистрибутив Linux (желательно Ubuntu).
2) Python 3 установлен на вашем компьютере.
3) PIP 3 установлен на вашем компьютере.
4) Python virtualenv пакет установлен на вашем компьютере.
5) На вашем компьютере установлены браузеры Mozilla Firefox или Google Chrome.
6) Необходимо знать, как установить драйвер Firefox Gecko или веб-драйвер Chrome.

Для выполнения требований 4, 5 и 6 прочтите мою статью Введение в Selenium с Python 3 на Linuxhint.com.

Вы можете найти множество статей по другим темам на LinuxHint.com . Обязательно ознакомьтесь с ними, если вам понадобится помощь.

Настройка каталога проекта:

Чтобы все было организовано, создайте новый каталог проекта селен-подождите / следующее:

$mkdir -pvселен-подожди/водители

Перейдите к селен-подождите / каталог проекта следующим образом:

$CDселен-подожди/

Создайте виртуальную среду Python в каталоге проекта следующим образом:

$virtualenv .venv

Активируйте виртуальную среду следующим образом:

$источник.venv/являюсь/активировать

Установите Selenium с помощью PIP3 следующим образом:

$ pip3 установить селен

Загрузите и установите все необходимые веб-драйверы в драйверы / каталог проекта. Я объяснил процесс загрузки и установки веб-драйверов в своей статье. Введение в Selenium с Python 3 . Если вам нужна помощь, ищите на LinuxHint.com для этой статьи.

Я буду использовать веб-браузер Google Chrome для демонстрации в этой статье. Итак, я буду использовать хромированная отвертка двоичный из драйверы / каталог.

Чтобы поэкспериментировать с неявным ожиданием, создайте новый скрипт Python ex01.py в каталоге вашего проекта и введите следующие строки кода в этот файл.

изселенИмпортироватьwebdriver
изселен.webdriver.общий.ключи ИмпортироватьКлючи
параметрызнак равноwebdriver.ChromeOptions()
параметры.Обезглавленный знак равно Правда
браузерзнак равноwebdriver.Хром(исполняемый_путьзнак равно'./drivers/chromedriver',параметрызнак равнопараметры)
браузер.implicitly_wait(10)
браузер.получать(https://www.unixtimestamp.com/)
отметка временизнак равнобраузер.find_element_by_xpath('// h3 [@] [1]')
Распечатать('Текущая отметка времени:% s'%(отметка времени.текст.расколоть('')[0]))
браузер.близко()

Как только вы закончите, сохраните ex01.py Скрипт Python.

Строки 1 и 2 импортируют все необходимые компоненты Selenium.

Строка 4 создает объект параметров Chrome.

Строка 5 включает безголовый режим для веб-драйвера Chrome.

Строка 7 создает объект браузера Chrome с помощью хромированная отвертка двоичный из драйверы / каталог.

Строка 8 используется для указания Selenium неявно ждать 10 секунд с помощью implicitly_wait () браузерный метод.

Строка 10 загружает в браузер www.unixtimestamp.com.

Строка 12 находит элемент отметки времени с помощью селектора XPath. // h3 [@ class = ’text-dangerous’] [1] и хранит его в отметка времени Переменная.

Я получил селектор XPath из Chrome Developer Tool. Как видите, метка времени находится в первом h3 элемент с именем класса текстовая опасность . Есть 2 h3 элементы с классом текстовая опасность .

Строка 13 печатает только метку времени из элемента, который я выбрал с помощью селектора XPath и сохранен в отметка времени Переменная.

Строка 14 закрывает браузер.

Когда вы закончите, запустите скрипт Python. ex01.py следующее:

$ python3 ex01.ру

Как видите, текущая временная метка извлекается с unixtimestamp.com и печатается на консоли.

Работа с явным ожиданием:

Чтобы поэкспериментировать с явным ожиданием, создайте новый скрипт Python ex02.py в каталоге вашего проекта и введите следующие строки кода в этот файл.

изселенИмпортироватьwebdriver
изселен.webdriver.общий.ключи ИмпортироватьКлючи
изселен.webdriver.общий.к ИмпортироватьК
изселен.webdriver.служба поддержки.лук ИмпортироватьWebDriverWait
изселен.webdriver.служба поддержки Импортироватьожидаемые_условия
параметрызнак равноwebdriver.ChromeOptions()
параметры.Обезглавленный знак равно Правда
браузерзнак равноwebdriver.Хром(исполняемый_путьзнак равно'./drivers/chromedriver',параметрызнак равнопараметры)
браузер.получать(https://www.unixtimestamp.com/)
пытаться:
отметка временизнак равноWebDriverWait(браузер, 10).до(
ожидаемые_условия.присутствие_оф_элемента_расположено((К.XPATH, '
// h3 [@] [1] '
))
)
Распечатать('Текущая отметка времени:% s'%(отметка времени.текст.расколоть('')[0]))
наконец:
браузер.близко()

Как только вы закончите, сохраните ex02.py Скрипт Python.

Строка 1-5 импортирует все необходимые компоненты из библиотеки Selenium.

Строка 7 создает объект параметров Chrome.

Строка 8 включает безголовый режим для веб-драйвера Chrome.

Строка 10 создает объект браузера Chrome с помощью хромированная отвертка двоичный из драйверы / каталог.

Строка 12 загружает в браузер www.unixtimestamp.com.

Явное ожидание реализовано в блоке try-finally (строки 14-20).

Строка 15-17 использует создает WebDriverWait () объект. Первый аргумент WebDriverWait () - объект браузера, а второй аргумент - это максимально допустимое время (наихудший сценарий) для выполнения условия, которое в данном случае составляет 10 секунд.

в до() блокировать, ожидаемое_условиеs.presence_of_element_located () используется, чтобы убедиться, что элемент присутствует, прежде чем пытаться выбрать элемент. Здесь, Автор: XPATH используется, чтобы сказать присутствие_оф_элемента_расположено () что мы использовали селектор XPath для выбора элемента. Селектор XPath // h3 [@ class = ’text-dangerous’] [1] .

Как только элемент найден, он сохраняется в отметка времени Переменная.

Строка 18 печатает только метку времени выбранного элемента.

Наконец, строка 19-20 закрывает браузер.

Когда вы закончите, запустите ex02.py Скрипт Python следующим образом:

$ python3 ex02.ру

Как видите, текущая временная метка с unixtimestamp.com печатается на консоли.

Выбор элементов в явном ожидании:

В предыдущем разделе я использовал Автор: XPATH для выбора элемента с помощью селектора XPath. Вы также можете выбрать элементы с помощью идентификатора, имени тега, имени класса CSS, селектора CSS и т. Д.

Поддерживаемые методы выбора приведены ниже:

Автор: XPATH - Выбирает элемент / элементы с помощью селектора XPath.

Автор: CLASS_NAME - Выбирает элемент / элементы, используя имя класса CSS.

Автор: CSS_SELECTOR - Выбирает элемент / элементы с помощью селектора CSS.

Автор: ID - Выбирает элемент по ID

По имени - Выбирает элемент / элементы по имени.

Автор :.TAG_NAME - Выбирает элемент / элементы по имени тега HTML.

Автор: LINK_TEXT - Выбирает элемент / элементы по тексту ссылки к (привязка) HTML-тег.

Автор: PARTIAL_LINK_TEXT - Выбирает элемент / элементы по частичному тексту ссылки к (привязка) HTML-тег.

Для получения дополнительной информации о них посетите Страница документации Python Selenium API .

Ожидаемые условия при явном ожидании:

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

Есть и другие ожидаемые_условия вы можете использовать как явное условие ожидания. Некоторые из них:

title_is (заголовок) - проверяет, является ли заголовок страницы заглавие .

title_contains (частичное_заголовок) - проверяет, содержит ли заголовок страницы часть заголовка partial_title .

visibility_of (элемент) - проверяет, есть ли элемент отображается на странице, то есть элемент имеет ширину и высоту больше 0.

visibility_of_element_located (локатор) -

присутствие_оф_элемента_расположено (локатор) - Убедитесь, что элемент расположен (возле локатор ) присутствует на странице. В локатор кортеж из (Автор, селектор), как я показал в явном примере ожидания.

присутствие_оф_все_элемент_расположено () - Убедитесь, что все элементы совпадают с локатор присутствует на странице. В локатор это (Автор, селектор) кортеж.

text_to_be_present_in_element (локатор, текст) - Проверяет, есть ли текст присутствует в элементе, расположенном рядом с локатор . В локатор это (Автор, селектор) кортеж.

element_to_be_clickable (локатор) - Проверяет, находится ли элемент рядом с локатор отображается и кликабельно. В локатор это (Автор, селектор) кортеж.

element_to_be_selected (локатор) - Проверяет, находится ли элемент рядом с локатор выбрано. В локатор это (Автор, селектор) кортеж.

alert_is_present () - ожидайте, что на странице появится диалоговое окно с предупреждением.

Есть еще много ожидаемые_условия доступны для использования. Для получения дополнительной информации о них посетите Страница документации Python Selenium API .

Заключение:

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

Для получения дополнительной информации о ожиданиях Selenium посетите официальная библиотека Selenium Python ждет страницы документации .