Зачем нам ожидания в Selenium?
Много веб-приложений разработано с использованием Ajax, Javascript и других популярных инструментов. А это значит, что в то время когда происходит процесс загрузки страницы, элементы, с которыми мы хотим взаимодействовать, могут загружаться (отображаться на странице) через разные промежутки времени.
Это не только затрудняет идентификацию элемента, но также, если WebDriver не находит элемент, мы видим исключение «NoSuchElementException», что приводит к остановке нашего теста.
Также очень часто наш скрипт выполняется намного быстрее реакции приложения на команды, поэтому необходимо дожидаться определенного состояния приложения для дальнейшего с ним взаимодействия.
Используя Waits (ожидания), мы можем решить эту проблему.
Ожидания бывают:
- Implicit Waits
- Explicit Waits
Неявные ожидания – Implicit Waits – изменяют конфигурацию экземпляра IWebDriver таким образом, чтобы он делал многократные попытки поиска элемента на странице в течении заданного периода времени, и только после этого WebDriver бросит NoSuchElementException.
Для реализации этого решения необходимо экземпляру нашего IWebDriver установить значение ImplicitWait:
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
Обычно их настраиваются сразу после создания экземпляра IWebDriver и действуют в течении всей жизни этого экземпляра, хотя переопределить их можно в любой момент. Также сюда же можно отнести ожидание загрузки страницы:
driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(120);
Явные ожидания – Explicit Waits – используется для ожидания выполнения каких-то конкретных условий. Чаще всего определенного состояния элемента, например, пока он появится.
Для работы с данным видом ожиданий нам нужно будет создать экземпляр класса WebDriverWait и установить NuGet пакет “Selenium.Support” для того, чтобы мы могли использовать вспомогательный статический класс ExpectedConditions:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(25)); wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("XPath locator")));