# Что такое iframe и как с ним работать в Selenium?

#### 🔹 Что такое iframe?

`<iframe>` (**inline frame**) — это HTML-элемент, который встраивает одну веб-страницу внутрь другой.\
Пример:

```html
<html>
  <body>
    <h1>Главная страница</h1>
    <iframe src="https://example.com" id="frame1"></iframe>
  </body>
</html>
```

👉 Всё, что внутри `<iframe> ... </iframe>`, **не является частью основного DOM**, а отдельным документом.\
Поэтому Selenium **не может напрямую работать** с элементами внутри `iframe`, пока мы в него не переключимся.

***

#### 🔹 Работа с iframe в Selenium

Чтобы взаимодействовать с элементами внутри `iframe`, нужно явно переключить контекст.

**✅ Переключение в iframe:**

```python
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://example.com")

# По индексу (0 = первый iframe на странице)
driver.switch_to.frame(0)

# По имени или id
driver.switch_to.frame("frame1")

# По веб-элементу
iframe = driver.find_element("id", "frame1")
driver.switch_to.frame(iframe)
```

**✅ Возврат в основной документ:**

```python
driver.switch_to.default_content()
```

**✅ Переключение на родительский iframe:**

```python
driver.switch_to.parent_frame()
```

***

#### 🔹 Пример: работа с формой внутри iframe

```python
# Переходим в iframe
driver.switch_to.frame("frame1")

# Находим поле ввода внутри iframe
input_box = driver.find_element("name", "username")
input_box.send_keys("test_user")

# Возвращаемся в основной DOM
driver.switch_to.default_content()
```

***

#### ⚠️ Важные моменты:

* Если не переключиться в `iframe`, Selenium выдаст ошибку `NoSuchElementException`.
* Иногда iframe динамически подгружается → нужно использовать **Explicit Wait**.
* Если iframe вложенные, нужно переходить последовательно: `frame1 → frame2 → ...`.
