> For the complete documentation index, see [llms.txt](https://kaze.gitbook.io/qa-theory/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/selenium/chto-takoe-selenium-waits-kakie-est-i-chem-otlichayutsya.md).

# Что такое Selenium Waits? Какие есть и чем отличаются?

***

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

Это механизмы ожидания, которые Selenium использует, чтобы дождаться доступности элемента или события перед выполнением следующего шага.\
Без них тест может упасть с ошибкой `NoSuchElementException` или `ElementNotInteractableException`.

***

### 🔹 Виды ожиданий в Selenium (Python)

#### 1. **Implicit Wait (Неявное ожидание)**

* Устанавливается один раз для всего драйвера.
* Selenium при поиске элемента будет пытаться его найти **в течение заданного времени**, проверяя каждые несколько миллисекунд.
* Если элемент найден раньше — идём дальше.
* Работает для всех элементов.

📌 Пример:

```python
from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)  # ждать до 10 секунд

driver.get("https://example.com")
element = driver.find_element("id", "username")  # будет ждать появления до 10 сек.
```

✅ Плюсы: просто, минимум кода.\
❌ Минусы: применяется ко всем элементам, не всегда гибко.

***

#### 2. **Explicit Wait (Явное ожидание)**

* Более **гибкий** подход.
* Ждём конкретное условие для конкретного элемента.
* Используем `WebDriverWait` + `expected_conditions`.

📌 Пример:

```python
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver.get("https://example.com")

# Ждать максимум 15 сек, пока кнопка не станет кликабельной
button = WebDriverWait(driver, 15).until(
    EC.element_to_be_clickable((By.ID, "submit"))
)
button.click()
```

✅ Плюсы: гибкость, можно ждать конкретные состояния (видимость, кликабельность, исчезновение).\
❌ Минусы: больше кода, чем implicit wait.

***

#### 3. **Fluent Wait (Расширенное явное ожидание)**

* Это разновидность `Explicit Wait`.
* Позволяет задать:
  * максимальное время ожидания,
  * частоту опроса (polling),
  * список игнорируемых исключений.

📌 Пример:

```python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException

wait = WebDriverWait(driver, 20, poll_frequency=2, ignored_exceptions=[NoSuchElementException])

element = wait.until(
    EC.presence_of_element_located((By.ID, "dynamic_element"))
)
print(element.text)
```

✅ Плюсы: настраиваемый, можно игнорировать ошибки.\
❌ Минусы: сложнее в использовании.

***

### 🔹 Разница между ними

| Вид ожидания | Применение                                                        | Время ожидания      | Где задаётся                                             |
| ------------ | ----------------------------------------------------------------- | ------------------- | -------------------------------------------------------- |
| **Implicit** | Для всех элементов                                                | Один раз на драйвер | `driver.implicitly_wait()`                               |
| **Explicit** | Для конкретного элемента                                          | При вызове          | `WebDriverWait + until()`                                |
| **Fluent**   | То же, что explicit, но с гибкой настройкой (polling, исключения) | При вызове          | `WebDriverWait(..., poll_frequency, ignored_exceptions)` |

***

👉 Обычно в проектах **не смешивают implicit и explicit waits** (это может вызывать непредсказуемые задержки).\
На практике:

* `Explicit` и `Fluent` → для **динамических элементов**.
* `Implicit` → если проект простой и динамики мало.
