В процессе написания автоматических тестов я столкнулся с проблемой, когда необходимо было дождаться скрытия какого-либо элемента и далее продолжить выполнение тестов. К примеру, нажимается кнопка и сервис выполняя какие-либо действия показывает временно панель прогресса, чтобы пользователь не думал, что всё зависло. Если не поставить ожидание скрытия данной панели, то автоматические тесты попытаются продолжиться без ожидания. Что в этом случае произойдёт? Правильно, тесты будут провалены, так как остальные элементы страницы недоступны, пока поверх всего находится панель отображающая прогресс выполнения текущей операции.

В итоге нашлось простое решение, которое и предлагаю вашему вниманию. Мы создадим функцию, в которую будем передавать свойство элемента, скрытие/появление которого мы ожидаем.

Для того, чтобы корректно всё работало нам необходимо подключить следующее:

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);