Ожидание окон, элементов и алертов



WebDriverWait(browser).until(EC.frame_to_be_available_and_switch_to_it((locator)))

.frame_to_be_available_and_switch_to_it()

EC.frame_to_be_available_and_switch_to_it(locator) — это ожидаемое условие, которое проверяет доступность iframe на веб-странице и автоматически переключается на него.

locator: кортеж, содержащий способ поиска (например, By.ID или By.XPATH) и значение для поиска.

Зачем это нужно при парсинге?

Многие сайты используют фреймы для разделения контента или вставки контента из других источников особенно капчи. Для взаимодействия внутри такого фрейма необходимо сначала переключиться на него.

Как это работает?

Это условие осуществляет поиск фрейма по заданному локатору и, если фрейм доступен, осуществляет переключение на него.

locator = (By.ID, 'iframe_id')
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(locator))

.invisibility_of_element_located()

EC.invisibility_of_element_located(locator) — это условие проверяет, что элемент, указанный локатором, больше не видим на веб-странице.

locator: кортеж, содержащий способ поиска и значение для поиска.

Зачем это нужно при парсинге?

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

Как это работает?

Для понимания работы этого условия важно различать два состояния элемента: «не присутствует на странице» и «присутствует, но невидим». Элемент может быть частью DOM-структуры страницы, но при этом быть невидимым для пользователя из-за стилей CSS (например, из-за display: none или opacity: 0).

.invisibility_of_element()

EC.invisibility_of_element(element) — Это условие проверяет, что предоставленный элемент больше не видим на веб-странице.

element: ссылка на уже найденный элемент.

Как это работает?

Поиск Элемента: В отличие от многих других ожидаемых условий, EC.invisibility_of_element() не ищет элемент на странице. Вместо этого он ожидает, что вы уже нашли элемент и передадите его в качестве аргумента. Это означает, что элемент должен быть найден до вызова этого условия.

Проверка Видимости: Условие проверяет, видим ли элемент на странице в данный момент. Элемент считается невидимым, если он отсутствует в DOM, его ширина и высота равны 0, или у него установлен стиль display: none.

Возврат результата:

Если элемент невидим, условие возвращает True.

Если элемент видим, условие возвращает False.

# Предположим, что element — это элемент всплывающего окна, который вы нашли ранее
element = driver.find_element(By.ID, 'popup')

# Теперь вы хотите дождаться, пока всплывающее окно исчезнет
WebDriverWait(driver, 10).until(EC.invisibility_of_element(element))

.element_to_be_clickable()

EC.element_to_be_clickable(locator | element)— Это условие, предназначено для ожидания, пока элемент на веб-странице не станет видимым и доступным для клика.  Принимает либо локатор, либо объект WebElement.

locator: Кортеж, включающий в себя метод поиска элемента (ID, XPATH, CSS_SELECTOR и другие.) и значение, по которому осуществляется поиск.

element: Найденный элемент (объект WebElement).

Как это работает?

Если указан  locator , то сначала Selenium пытается найти элемент на странице, используя предоставленный locator.

После нахождения element проверяется его видимость. element считается видимым, если он присутствует в DOM (структуре документа), не скрыт CSS-стилями (например, свойством display: none; или visibility: hidden;), и имеет ненулевые размеры.

Кроме проверки видимости, также проверяется, что element активен и доступен для клика. Это означает, что он не перекрыт другими элементами и не заблокирован для взаимодействия.

Если element не найден, не видим или не доступен для клика, Selenium будет ожидать в течение заданного времени (используя WebDriverWait(driver, 10) ) до тех пор, пока условия не будут выполнены.

Как только element становится видимым и доступным для клика, он возвращается для дальнейших действий. Это может быть, например, клик по кнопке или другие взаимодействия.

# Определение локатора для кнопки
button_locator = (By.ID, 'submit_button')

# Ожидание, пока кнопка не станет доступна для клика
button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(button_locator))

# Теперь можно кликнуть по кнопке
button.click()

.staleness_of()

EC.staleness_of(element) — это ожидаемое условие, которое проверяет, стал ли element устаревшим, то есть исчез ли он с DOM-структуры страницы или был ли он перезагружен. Это условие возвращает True, если element больше не присутствует в DOM или если его состояние стало устаревшим.

element— Это элемент веб-страницы, который мы ожидаем станет устаревшим.

Как это работает?

Когда вы взаимодействуете с веб-страницей, Selenium сохраняет ссылки на elementsстраницы.

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

staleness_of проверяет, действительна ли еще ссылка на element. Если element исчез из DOM или его состояние изменилось, условие возвращает True.

Это полезно для ожидания завершения каких-либо асинхронных операций на странице, которые могут приводить к изменению DOM.

# Находим элемент
element = driver.find_element(By.ID, 'some_element')

# Выполняем действие, которое приведет к обновлению элемента (например, клик по кнопке)
driver.find_element(By.ID, 'update_button').click()

# Ожидаем, пока элемент станет устаревшим
WebDriverWait(driver, 10).until(EC.staleness_of(element))

.element_to_be_selected()

EC.element_to_be_selected(element) — это ожидаемое условие в Selenium, которое проверяет, выбран ли предоставленный элемент на веб-странице. Это условие чаще всего используется для работы с элементами формы, такими как чекбоксы, радиокнопки или опции в выпадающем списке.

element: Это сам элемент, который вы хотите проверить на то, выбран он или нет.

Как это работает?

Когда вы передаете element в это условие, Selenium проверяет атрибут selected этого элемента. Если элемент выбран (то есть атрибут selected присутствует и установлен в true), условие считается выполненным.

# Находим элемент (чекбокс) на странице
element = driver.find_element(By.ID, "my_checkbox")

# Используем явное ожидание, чтобы убедиться, что чекбокс выбран
WebDriverWait(driver, 10).until(EC.element_to_be_selected(element))

.element_located_to_be_selected()

.element_located_to_be_selected(locator) — это ожидаемое условие проверяет, выбран ли элемент, определенный по локатору. Элемент может быть чекбоксом, радиокнопкой или опцией в выпадающем списке.

locator: Кортеж, содержащий два элемента: стратегию поиска элемента (By.ID, By.XPATH, и т.д.) и сам запрос для поиска.

Как это работает?

Сначала Selenium выполняет поиск элемента на странице, используя предоставленный locator.

После того, как элемент найден, Selenium проверяет его атрибут selected. Если элемент выбран (чекбокс отмечен, радиокнопка активна, опция в выпадающем списке выбрана), то условие возвращает True. В противном случае возвращается False.

Ожидание: Если элемент не выбран, Selenium будет ожидать до истечения таймаута, периодически повторяя попытки проверки. Если время ожидания истекает, и элемент так и не становится выбранным, то будет выброшено исключение TimeoutException.

# Определение локатора для чекбокса
checkbox_locator = (By.ID, 'accept_terms_checkbox')

# Ожидание, пока чекбокс не станет выбранным
WebDriverWait(driver, 10).until(EC.element_located_to_be_selected(checkbox_locator))

.element_selection_state_to_be()

EC.element_selection_state_to_be(element, is_selected) — это ожидаемое условие, которое проверяет, соответствует ли состояние выбора (выделения) элемента ожидаемому значению.

element: Это уже найденный элемент на веб-странице, состояние выбора которого вы хотите проверить. Элемент может быть чекбоксом, радио кнопкой или другим элементом формы, имеющим атрибут selected.

is_selected: Булево значение (True или False), которое указывает, ожидаете ли вы, что элемент будет выбран или нет.

На пальцах

Представьте, что вы на веб-странице с формой, и вам нужно убедиться, что определенный чекбокс отмечен, прежде чем вы продолжите выполнение вашего кода. Или наоборот, вам нужно удостовериться, что чекбокс не отмечен. Это условие как раз помогает в таких ситуациях.

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

# Предположим, у нас есть чекбокс с ID "my_checkbox"
element = driver.find_element(By.ID, 'my_checkbox')

# Мы хотим удостовериться, что чекбокс отмечен
WebDriverWait(driver, 10).until(EC.element_selection_state_to_be(element, True))

.element_located_selection_state_to_be()

 EC.element_located_selection_state_to_be(locator, is_selected)— Это ожидаемое условие, которое проверяет, находится ли элемент, определенный локатором, в определенном состоянии выбора (выбран или не выбран).

locator: Кортеж, содержащий способ поиска и значение для поиска. Например, (By.ID, ‘checkbox’).

is_selected: Булево значение, указывающее ожидаемое состояние выбора элемента. True означает, что элемент должен быть выбран, False — что не должен.

Как это работает?

Поиск Элемента: Сначала Selenium ищет element на веб-странице, используя предоставленный локатор.

Проверка Состояния Выбора: Затем ожидаемое условие проверяет, находится ли найденный element в ожидаемом состоянии выбора. Состояние выбора может быть True (элемент должен быть выбран) или False (элемент не должен быть выбран).

Возврат Результата: Если состояние элемента соответствует ожидаемому, условие возвращает True, и программа может продолжить выполнение. Если состояние не соответствует ожидаемому, то будет подождать до истечения времени ожидания, и в случае неудачи выбросится исключение TimeoutException.

locator = (By.ID, 'my_checkbox')
expected_state = True  # Ожидаем, что чекбокс будет отмечен

# Ожидаем, пока чекбокс не окажется в ожидаемом состоянии
WebDriverWait(driver, 10).until(EC.element_located_selection_state_to_be(locator, expected_state))

.number_of_windows_to_be()

EC.number_of_windows_to_be(num_windows)— Условие ожидания, которое проверяет, равно ли текущее количество открытых окон в браузере заданному числу.

Как это работает?

Подсчет Окон: Selenium поддерживает взаимодействие с несколькими окнами браузера. Когда вы взаимодействуете с веб-страницей, могут открываться новые вкладки или окна. Selenium может отслеживать все открытые окна и вкладки.

Получение Списка Дескрипторов: Selenium предоставляет функцию для получения списка всех текущих дескрипторов окон. Дескриптор окна – это уникальный идентификатор, который представляет собой строку.

Проверка Количества Окон: EC.number_of_windows_to_be берет это количество открытых окон (по сути, длину списка дескрипторов) и сравнивает его с числом, которое вы передали в качестве параметра num_windows.

Ожидание Состояния: Если текущее количество открытых окон соответствует ожидаемому, условие возвращает True, что означает успешное выполнение ожидания. Если количество окон не соответствует ожидаемому, условие продолжает ждать до истечения тайм-аута, и только после этого возвращает False.

# Предполагаем, что изначально открыто одно окно
num_windows_before = len(driver.window_handles)

# Выполняем действие, которое должно открыть новое окно
driver.find_element(By.ID, 'some_link').click()

# Ожидаем, пока не откроется новое окно
WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(num_windows_before + 1))

# Теперь можно безопасно переключиться на новое окно и продолжить тест
new_window_handle = [handle for handle in driver.window_handles if handle != driver.current_window_handle][0]
driver.switch_to.window(new_window_handle)

.new_window_is_opened()

EC.new_window_is_opened(current_handles)— Это ожидаемое условие, которое проверяет, было ли открыто новое окно или вкладка браузера.

current_handles: список строк, представляющих собой уникальные идентификаторы уже открытых окон/вкладок браузера.

Зачем это нужно?

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

Как это работает?

Когда вы вызываете это условие, Selenium сравнивает текущий список открытых окон/вкладок с предоставленным списком current_handles. Если количество окон/вкладок увеличилось, и появился хотя бы один новый уникальный идентификатор, условие считается выполненным.

# Получаем список текущих открытых окон/вкладок
current_handles = driver.window_handles

# Выполняем действие, которое должно открыть новое окно/вкладку
driver.find_element(By.ID, 'open_new_window_button').click()

# Ждем открытия нового окна/вкладки
WebDriverWait(driver, 10).until(EC.new_window_is_opened(current_handles))

# Получаем новый список окон/вкладок
new_handles = driver.window_handles

# Находим идентификатор нового окна/вкладки
new_window = [handle for handle in new_handles if handle not in current_handles][0]

# Переключаемся на новое окно/вкладку
driver.switch_to.window(new_window)

EC.alert_is_present()

EC.alert_is_present()— Является ожидаемым условием и предназначена для проверки наличия всплывающего окна предупреждения (alert) на веб-странице.

Как это работает?

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

Когда вызывается EC.alert_is_present(), WebDriver пытается найти всплывающее окно предупреждения на текущей веб-странице.

Если всплывающее окно найдено, функция возвращает объект Alert, представляющий это всплывающее окно. Это позволяет вам взаимодействовать с всплывающим окном, например, принимать его, отклонять или извлекать из него текст.

Если всплывающее окно не найдено, функция выбрасывает исключение NoAlertPresentException.

# Используем явное ожидание для проверки наличия всплывающего окна предупреждения
alert = WebDriverWait(driver, 10).until(EC.alert_is_present())

# После этого можно взаимодействовать с всплывающим окном
text = alert.text
alert.accept()


Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: