В чем разница между явным и неявным ожиданием и как они работают в тестовых фреймворках?
Что проверяют
Понимаете ли вы, откуда берутся нестабильные тесты и чем управляемое ожидание лучше паузы. Следом почти всегда просят объяснить, почему нельзя смешивать оба вида ожиданий и как с этим обходятся Playwright и Cypress.
Как отвечать
В Selenium это два разных механизма:
- неявное ожидание: глобальная настройка драйвера,
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10)). Действует на каждыйfindElementиfindElements: драйвер повторяет поиск, пока элемент не появится в DOM или не выйдет время. Ждёт только присутствия, видимость и кликабельность не проверяет; - явное ожидание:
new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.elementToBeClickable(locator)). Ждёт конкретного условия на конкретном шаге, по умолчанию опрашивает раз в 500 мс и до таймаута игнорируетNoSuchElementException; FluentWait: явное ожидание с настраиваемым интервалом опроса и списком игнорируемых исключений.
Рабочая практика: неявное ожидание оставить нулевым, а явные вынести в методы Page Object. Документация Selenium прямо предупреждает, что при смешивании итоговое время ожидания становится непредсказуемым.
В Playwright отдельные ожидания почти не пишут: перед кликом или вводом он сам проверяет, что элемент видим, стабилен и доступен, а expect(locator).toBeVisible() повторяет проверку до таймаута, по умолчанию 5 секунд. В Cypress похожая механика повторов, команды по умолчанию ждут 4 секунды.
Где спотыкаются
Называют Thread.sleep ожиданием. Это жёсткая пауза: на быстром стенде тест тратит время впустую, на медленном всё равно падает.
Ставят неявное ожидание в 10 секунд и проверяют отсутствие элемента через findElements. Каждая такая проверка ждёт все 10 секунд, и прогон заметно растягивается.
Пишут код из старых статей: new WebDriverWait(driver, 10) и implicitlyWait(10, TimeUnit.SECONDS). В Selenium 4 это устаревшие сигнатуры, таймауты передаются через Duration.