В процессе написания автоматических тестов я столкнулся с проблемой, когда необходимо было дождаться скрытия какого-либо элемента и далее продолжить выполнение тестов. К примеру, нажимается кнопка и сервис выполняя какие-либо действия показывает временно панель прогресса, чтобы пользователь не думал, что всё зависло. Если не поставить ожидание скрытия данной панели, то автоматические тесты попытаются продолжиться без ожидания. Что в этом случае произойдёт? Правильно, тесты будут провалены, так как остальные элементы страницы недоступны, пока поверх всего находится панель отображающая прогресс выполнения текущей операции.
В итоге нашлось простое решение, которое и предлагаю вашему вниманию. Мы создадим функцию, в которую будем передавать свойство элемента, скрытие/появление которого мы ожидаем.
Для того, чтобы корректно всё работало нам необходимо подключить следующее:
using System; using Selenium; using OpenQA.Selenium; using OpenQA.Selenium.Support.UI;
Если вы уже пишите тесты на Selenium WebDriver, то вы знаете, что поиск элемента происходит следующим образом:
driver.FindElement (By.Id ("ТУТ ИМЯ ID ЭЛЕМЕНТА"));
Поиск можно проводить по «Id», «ClassName», «CssSelector» и т.д. В наши функции ожидания мы и будем передавать класс «By» с одним из этих элементов. Теперь рассмотрим на примерах функции ожидания скрытия появления элементов на странице.
Функция ожидания скрытия элемента на странице:
public static void WaitHideElement (By iClassName) { WebDriverWait iWait = new WebDriverWait (driver, TimeSpan.FromSeconds(30)); iWait.Until (ExpectedConditions.InvisibilityOfElementLocated (iClassName)); // iClassName: By.Id("id"), By.CssSelector("selector") и т.д. }
Функция ожидания появления элемента на странице:
public static void WaitShowElement (By iClassName) { WebDriverWait iWait = new WebDriverWait (driver, TimeSpan.FromSeconds(30)); iWait.Until (ExpectedConditions.ElementIsVisible (iClassName)); }
Как видим функции отличаются только параметрами «InvisibilityOfElementLocated» и «ElementIsVisible». В функциях прописано время ожидания 30 секунд, вы можете это время задавать самостоятельно. Функции ждут не исчезновения или появления элементов в коде страницы, а именно визуального исчезновения и появления.
Можно реализовать всё одной фукнцией введя второй передаваемый параметр отвечающий за ожидание скрытия или появения элемента, однако я разбил на две функции, чтобы было всё просто и понятно.
Теперь рассмотрим, как можно применить функции скрытия/ожидания элементов:
private void func1 () { // тут выполняется код и... WaitHideElement(By.Id ("value-id")); // ожидаем скрытия элемента с классом id="value-id" // тут выполняется код и... WaitShowElement (By.ClassName("select-element")); // ожидаем появления элемента с классом class="select-element" // тут выполняется код ... }
И ещё пара примеров, для тех, кто использует при написании автоматических тестов фреймворк «NUnit». Приведу примеры проверки видимости элементов, а не ожидания. Обязательно надо подключить «NUnit.Framework»:
using NUnit.Framework;
Проверяем, что элемент невидимый (исчез):
Assert.False (driver.FindElement (By.ClassName("select-element")).Displayed);
Проверяем, что элемент видимый:
Assert.True (driver.FindElement (By.Id("value-id")).Displayed);