✅ Решения: ответы на вопросы самопроверки
Блок 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 — Переключение между вкладками
- Получить список всех вкладок:
tabs = driver.window_handles - Переключиться:
driver.switch_to.window(tabs[N]) - Для возврата:
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, на который нужно отпустить
Ответ 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-взаимодействие или специальные инструменты.