Селен

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

Как дождаться загрузки страницы с помощью 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.ком.

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

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

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

$ mkdir -pv селен-ожидание / драйверы

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

$ cd селен-ожидание /

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

$ virtualenv .Venv

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

$ источник .Venv / bin / активировать

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

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

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

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

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

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

из selenium import webdriver
из селена.webdriver.общий.ключи импорт Ключи
options = webdriver.ChromeOptions ()
параметры.headless = Правда
браузер = веб-драйвер.Chrome (исполняемый_путь = "./ drivers / chromedriver ", options = options)
браузер.implicitly_wait (10)
браузер.get ("https: // www.unixtimestamp.com / ")
timestamp = браузер.find_element_by_xpath ("// h3 [@ class = 'text-dangerous'] [1]")
print ('Текущая отметка времени:% s'% (отметка времени.текст.split (") [0]))
браузер.Закрыть()

Как только вы закончите, сохраните ex01.ру Скрипт 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. Как видите, метка времени находится в первом h3 элемент с именем класса текстовая опасность. Есть 2 h3 элементы с классом текстовая опасность.

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

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

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

$ python3 ex01.ру

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

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

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

из selenium import webdriver
из селена.webdriver.общий.ключи импорт Ключи
из селена.webdriver.общий.по импорту По
из селена.webdriver.служба поддержки.ui импорт WebDriverWait
из селена.webdriver.поддержка импорта ожидаемых_условий
options = webdriver.ChromeOptions ()
параметры.headless = Правда
браузер = веб-драйвер.Chrome (исполняемый_путь = "./ drivers / chromedriver ", options = options)
браузер.get ("https: // www.unixtimestamp.com / ")
пытаться:
timestamp = WebDriverWait (браузер, 10).до того как(
ожидаемые_условия.Наличие_элемента_расположено ((Автор.XPATH, "
// h3 [@ class = 'text-dangerous'] [1] "))
)
print ('Текущая отметка времени:% s'% (отметка времени.текст.split (") [0]))
наконец-то:
браузер.Закрыть()

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

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

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

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

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

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

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

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

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

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

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

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

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

$ python3 ex02.ру

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

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

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

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

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

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

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

От.Я БЫ - Выбирает элемент по ID

От.НАЗВАНИЕ - Выбирает элемент / элементы по имени.

От.НАЗВАНИЕ ТЭГА - Выбирает элемент / элементы по имени тега HTML.

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

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

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

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

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

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

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

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

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

visibility_of_element_located (локатор) -

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

присутствие_of_all_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.

Как использовать AutoKey для автоматизации игр под Linux
AutoKey - это утилита автоматизации рабочего стола для Linux и X11, запрограммированная на Python 3, GTK и Qt. Используя его функции сценариев и MACRO...
Как показать счетчик FPS в играх для Linux
Игры для Linux получили серьезный толчок, когда Valve объявила о поддержке Linux для клиента Steam и своих игр в 2012 году. С тех пор многие игры AAA ...
Как загрузить и играть в Sid Meier's Civilization VI в Linux
Введение в игру Civilization 6 - это современный подход к классической концепции, представленной в серии игр Age of Empires. Идея была довольно просто...