📖 Теория: конспект продвинутого Selenium (Урок 09)
⚡ Краткий конспект
- Alert — не в DOM, работаем через
driver.switch_to.alert. Методы:.text,.accept(),.dismiss(),.send_keys(). - Вкладки/окна:
driver.window_handles— список всех;driver.switch_to.window(handle)— переключиться;driver.close()— закрыть текущую. - ActionChains: цепочка действий мыши.
.move_to_element(el)— hover;.drag_and_drop(src, tgt)— перетащить. Всегда завершать.perform(). - iframe:
driver.switch_to.frame(el)— войти;driver.switch_to.default_content()— выйти в основной контекст. - Загрузка файла: найти
<input type="file">, вызвать.send_keys(абсолютный_путь).
Alert-диалоги
Alert — это всплывающее диалоговое окно, создаваемое браузером через JavaScript (alert(), confirm(), prompt()). Оно не является частью DOM-дерева, поэтому обычный find_element его не видит.
driver.switch_to.alert.
Методы работы с Alert
| Метод | Применение | Тип диалога |
|---|---|---|
alert.text |
Получить текст сообщения | alert, confirm, prompt |
alert.accept() |
Нажать «OK» | alert, confirm, prompt |
alert.dismiss() |
Нажать «Отмена» | confirm, prompt |
alert.send_keys(text) |
Ввести текст в поле ввода | prompt |
# test_alert.py
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("URL_СТРАНИЦЫ")
# Рекомендуется дождаться alert через EC
wait = WebDriverWait(driver, 10)
alert = wait.until(EC.alert_is_present())
text = alert.text # Получить текст
print(text)
alert.accept() # Нажать OK
Вкладки и окна браузера
Selenium позволяет управлять несколькими вкладками и окнами. Каждая вкладка имеет уникальный идентификатор — window handle.
Ключевые атрибуты и методы
| Метод / Атрибут | Описание |
|---|---|
driver.window_handles |
Список идентификаторов всех открытых вкладок |
driver.current_window_handle |
Идентификатор текущей активной вкладки |
driver.switch_to.window(handle) |
Переключиться на вкладку по handle |
driver.close() |
Закрыть текущую вкладку (не весь браузер) |
driver.close() Selenium не переключается автоматически на другую вкладку. Нужно явно вызвать driver.switch_to.window(handle) на оставшуюся вкладку.
ActionChains
Класс ActionChains позволяет эмулировать сложные действия пользователя: наведение курсора, двойной клик, перетаскивание. Действия выполняются цепочкой и отправляются в браузер вызовом .perform().
# test_hover.py
from selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)
actions.move_to_element(menu_element).perform() # hover
Основные методы ActionChains
| Метод | Действие |
|---|---|
.move_to_element(el) |
Навести курсор (hover) |
.click(el) |
Клик по элементу |
.double_click(el) |
Двойной клик |
.drag_and_drop(source, target) |
Перетащить source на target |
.perform() |
Выполнить все накопленные действия |
Фреймы (iframe)
iframe — это HTML-элемент, встраивающий одну страницу внутрь другой. Элементы внутри iframe недоступны из основного контекста страницы — нужно сначала переключиться.
# test_iframe.py
from selenium.webdriver.common.by import By
# Найти iframe и переключиться
iframe = driver.find_element(By.ID, "my-iframe")
driver.switch_to.frame(iframe)
# Теперь можно искать элементы внутри iframe
element = driver.find_element(By.TAG_NAME, "p")
# Вернуться в основной контекст
driver.switch_to.default_content()
switch_to.frame(0)) или по имени/id (switch_to.frame("my-iframe")). Рекомендуется передавать WebElement для надёжности.
Загрузка файла
Если страница содержит <input type="file">, загрузка файла осуществляется методом send_keys() с передачей абсолютного пути к файлу.
# test_file_upload.py
import os
from selenium.webdriver.common.by import By
file_input = driver.find_element(By.ID, "file-upload")
# Путь должен быть абсолютным
file_path = os.path.abspath("test_data/file.txt")
file_input.send_keys(file_path)
send_keys() работает только с нативным <input type="file">. Для кастомных элементов загрузки может потребоваться JavaScript или другие подходы.