Урок 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.