Урок 7. Работа с iframe и вложенными контекстами в Selenium
В реальных проектах часто встречаются сайты, где часть контента находится во вложенных фреймах (iframe). Selenium по умолчанию работает с основным документом страницы. Если попытаться получить элемент внутри iframe, вы получите ошибку «NoSuchElementException». Поэтому важно научиться переключаться между контекстами.
Что такое iframe?
iframe — это HTML-тег, позволяющий вставлять одну веб-страницу в другую. Он создаёт отдельный контекст DOM, который не доступен напрямую из родительской страницы. Чаще всего iframe используют для виджетов, рекламы, форм оплаты или видео.
<iframe src="https://parsertools.ru/test"></iframe>
Переключение на iframe в Selenium
Чтобы работать с элементами внутри iframe, нужно сначала переключить контекст Selenium на этот фрейм:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
# Инициализация браузера
driver = webdriver.Chrome()
driver.get("https://parsertools.ru/test")
# Создаём объект WebDriverWait
wait = WebDriverWait(driver, 10)
# Находим iframe по src
iframe = driver.find_element(By.CSS_SELECTOR, "iframe[src='https://parsertools.ru']")
# Переключаемся на iframe
driver.switch_to.frame(iframe)
# Ждём появления заголовка h5 class="uagb-heading-text"> внутри iframe
heading = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "h5.uagb-heading-text")))
# Получаем текст
print(heading.text)
# Возврат в основной документ
driver.switch_to.default_content()
time.sleep(10) # небольшая пауза
# Закрытие браузера
driver.quit()
Советы при работе с iframe
- Можно переключаться на iframe по индексу:
driver.switch_to.frame(0) - Для вложенных iframe сначала переключаемся на родительский, затем на дочерний
- После работы внутри iframe всегда возвращаемся в основной документ
driver.switch_to.default_content()
Пример: форма внутри iframe
Представим сайт с формой подписки, встроенной через iframe. Ниже пример кода Selenium для ввода данных и отправки формы.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
# Настройка драйвера
driver = webdriver.Chrome()
driver.get("https://parsertools.ru/test")
wait = WebDriverWait(driver, 10)
# Ждём появления iframe
iframe = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, "iframe[src*='zakazat-parser']")
))
# Переключаемся на iframe
driver.switch_to.frame(iframe)
# Ждём появления формы
form = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, "form.wpcf7-form")
))
# Находим поля формы
name_input = driver.find_element(By.NAME, "your-name")
email_input = driver.find_element(By.NAME, "your-email")
subject_input = driver.find_element(By.NAME, "your-subject")
message_input = driver.find_element(By.NAME, "your-message")
submit_btn = driver.find_element(By.CSS_SELECTOR, "input[type='submit']")
# Заполняем поля и выводим значения
name_input.send_keys("Иван Иванов")
print("Имя:", name_input.get_attribute("value"))
email_input.send_keys("ivan@example.com")
print("Email:", email_input.get_attribute("value"))
subject_input.send_keys("Тестовая заявка")
print("Тема:", subject_input.get_attribute("value"))
message_input.send_keys("Тестовое сообщение через Selenium.")
print("Сообщение:", message_input.get_attribute("value"))
time.sleep(10)
# Отправляем форму
submit_btn.click()
print("Форма отправлена, ждём подтверждения...")
# Ждём появления сообщения об успехе
success_msg = wait.until(EC.visibility_of_element_located(
(By.CSS_SELECTOR, "div.wpcf7-response-output")
))
print("Текст подтверждения:", success_msg.text)
# Возврат в основной документ
driver.switch_to.default_content()
time.sleep(2)
driver.quit()
Заключение
Работа с iframe — важный навык для парсинга современных сайтов. Без переключения контекста Selenium не сможет найти элементы внутри фрейма. После освоения этого урока вы сможете взаимодействовать с формами, виджетами и встроенными элементами на любых страницах.
Больше уроков по парсингу на parsertools.ru/lessons.
