# Что такое 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` → если проект простой и динамики мало.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kaze.gitbook.io/qa-theory/teoriya-avtomatizirovannogo-testirovaniya/selenium/chto-takoe-selenium-waits-kakie-est-i-chem-otlichayutsya.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
