Python: Selenium
Теория: Работа с окнами и фреймами
Переключение между окнами
При клике на ссылку или кнопку сайт может открыть новое окно или вкладку. Для человека это естественно: браузер просто добавляет новую вкладку в интерфейсе. Но для Selenium каждое окно — отдельная сессия взаимодействия, и тест работает только с одним активным окном за раз. Если не переключиться, драйвер «не видит» элементы в новой вкладке и выдаёт ошибку NoSuchElementException.
Каждое окно в браузере имеет уникальный идентификатор, называемый window handle. Список всех активных окон можно получить свойством driver.window_handles, а текущее — через driver.current_window_handle.
Пример переключения:
Selenium всегда должен знать, с каким окном работает. После закрытия вкладки контекст нужно вернуть в существующее окно, иначе дальнейшие команды вызовут NoSuchWindowException. В проектах с множеством pop-up окон часто добавляют вспомогательную функцию, которая переключает по имени или индексу нужной вкладки.
Работа с alert'ами
Alert — это системное модальное окно, созданное браузером, а не DOM. Оно блокирует страницу до тех пор, пока пользователь не выберет действие. Selenium не может взаимодействовать с другими элементами, пока alert не будет закрыт.
Для работы с ним используется специальный объект:
У alert'а есть три стандартных метода:
.accept()— нажимает “OK”;.dismiss()— нажимает “Cancel”;.send_keys("текст")— вводит текст, если alert содержит поле ввода (prompt).
Пример на реальной тестовой странице:
Если alert не обработать, Selenium выбросит UnhandledAlertException при попытке кликнуть или найти элемент на странице. Поэтому любая страница, где ожидается alert, должна иметь явную обработку сразу после действия, которое его вызывает.
Работа с фреймами
Фрейм (iframe) — это встроенное окно, содержащее другую HTML-страницу. С точки зрения браузера, каждый фрейм — отдельный документ. Selenium по умолчанию «видит» только основной документ, и если попытаться найти элемент внутри iframe без переключения, тест упадёт с NoSuchElementException.
Чтобы попасть внутрь фрейма, нужно явно переключить контекст:
Фрейм можно выбрать по индексу, имени или найденному элементу. После завершения работы нужно вернуться обратно командой driver.switch_to.default_content().
Пример редактирования текста в фрейме TinyMCE:
Если фреймы вложенные, можно использовать switch_to.parent_frame(), чтобы подняться на уровень выше, не возвращаясь к корню.
Когда страница динамически подгружает iframe, Selenium может не успеть переключиться, и появится ошибка NoSuchFrameException. В таких случаях лучше дождаться фрейма через ожидание:
Команда не просто ждёт появления фрейма, но и сразу переключает контекст, как только он доступен.
Объединим всё
Такой тест поочередно показывает, как Selenium управляет контекстом: переключает окна, обрабатывает системные алерты и работает с вложенными страницами внутри фреймов.


