📖 Теория: конспект продвинутого 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 его не видит.

Ключевой принцип: чтобы работать с Alert, нужно сначала переключиться на него через 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 или другие подходы.