✅ Решения: ответы на вопросы самопроверки

← К оглавлению урока

Блок 1: Alert

Ответ 1.1 — Что такое Alert

Alert — всплывающее диалоговое окно, создаваемое браузером через JavaScript (alert(), confirm(), prompt()). Оно не является частью DOM-дерева страницы, поэтому find_element его не видит. Для взаимодействия нужно переключить контекст: driver.switch_to.alert.

Ответ 1.2 — Код для работы с Alert

# Переключиться, получить текст, принять
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
alert = wait.until(EC.alert_is_present())  # Дождаться Alert
print(alert.text)                           # Получить текст
alert.accept()                              # Нажать OK

Ответ 1.3 — accept() vs dismiss()

Метод Действие Тип диалога
accept()Нажать OK / Подтвердитьalert, confirm, prompt
dismiss()Нажать Отмена / Отклонитьconfirm, prompt (для alert действует как accept)

Ответ 1.4 — Ввод текста в prompt

# Ввод текста в prompt()-диалог
alert = wait.until(EC.alert_is_present())
alert.send_keys("Мой текст")  # Только для prompt()
alert.accept()                 # Подтвердить ввод

Блок 2: Вкладки и окна

Ответ 2.1 — Переключение между вкладками

  1. Получить список всех вкладок: tabs = driver.window_handles
  2. Переключиться: driver.switch_to.window(tabs[N])
  3. Для возврата: driver.switch_to.window(tabs[0])

Ответ 2.2 — window_handles vs current_window_handle

  • driver.window_handles — возвращает список идентификаторов всех открытых вкладок/окон (например, ['CDwindow-123', 'CDwindow-456']).
  • driver.current_window_handle — возвращает строку — идентификатор текущей активной вкладки.

Ответ 2.3 — Последствия close() без switch_to

После driver.close() Selenium не переключается автоматически на другую вкладку. При следующем обращении к драйверу (например, driver.find_element()) будет выброшено исключение NoSuchWindowException. Всегда после close() вызывайте driver.switch_to.window(remaining_handle).

Блок 3: ActionChains

Ответ 3.1 — drag_and_drop()

drag_and_drop(source, target) эмулирует перетаскивание:
  • source — WebElement, который нужно захватить и перетащить
  • target — WebElement, на который нужно отпустить
Метод выполняет: mousedown на source → перемещение к target → mouseup на target.

Ответ 3.2 — Hover + клик по подменю

# Hover на элемент меню, затем клик по подпункту
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By

menu = driver.find_element(By.ID, "menu")
actions = ActionChains(driver)
actions.move_to_element(menu).perform()  # Навести курсор

# После hover появляется подменю — кликнуть по нему
item = driver.find_element(By.ID, "item-1")
item.click()

Ответ 3.3 — Зачем perform()

.perform() — обязателен. ActionChains только накапливает действия в очередь. Без .perform() ни одно действие не будет выполнено. Это специфика паттерна «цепочка команд»: сначала строим список — потом запускаем.

Блок 4: iframe

Ответ 4.1 — Переключение в iframe

iframe — это отдельный HTML-документ, встроенный в страницу. Selenium работает в контексте одного документа. Без переключения элементы внутри iframe невидимы (выброс NoSuchElementException).
iframe = driver.find_element(By.ID, "my-iframe")
driver.switch_to.frame(iframe)
# Теперь можно искать элементы внутри iframe

Ответ 4.2 — Выход из iframe

# Вернуться в основной контекст (корень страницы)
driver.switch_to.default_content()

# Перейти на уровень выше (при вложенных iframe)
driver.switch_to.parent_frame()

Блок 5: Загрузка файла

Ответ 5.1 — Загрузка файла

# Загрузка файла — нужен абсолютный путь
import os
from selenium.webdriver.common.by import By

file_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']")
file_path = os.path.abspath("test_data/sample.txt")  # Абсолютный путь
file_input.send_keys(file_path)
Абсолютный путь обязателен, потому что браузер и Selenium могут работать с разными рабочими директориями. Относительный путь приведёт к ошибке «файл не найден».

Ответ 5.2 — Ограничение send_keys для файлов

send_keys(path) работает только с нативным <input type="file">. Кастомные кнопки загрузки (реализованные через <div>, <button> или стилизованные с помощью CSS) не поддерживают этот метод. В таких случаях требуются обходные пути — JavaScript-взаимодействие или специальные инструменты.