public static void WaitUntil(this IWebDriver driver, Func<bool> Condition, float timeout = 10f)
{
float timer = timeout;
while (!Condition.Invoke() && timer > 0f) {
System.Threading.Thread.Sleep(500);
timer -= 0.5f;
}
System.Threading.Thread.Sleep(500);
}
driver.WaitUntil(() => driver.FindElements(By.XPath(".//*[contains(@class, 'block-ui-wrapper')]").Length == 0);
У меня есть класс расширений, где я выполняю несколько пользовательских операций Selenium. Я считаю, что неявное ожидание доставляет мне больше хлопот, чем оно того стоит. И я нахожу, что явное ожидание селена может стать немного многословным, и оно не охватывает всего, что мне нужно от него в моей среде, поэтому я сделал большое количество расширений. Вот один из них. Обратите внимание, я использую FindElements для приведенного выше примера, потому что я не хочу, чтобы исключение выдается, если ничего не найдено. Это должно работать для вас.
Примечание. Вам нужно поместить это в статический класс, чтобы он был функциональным. Будьте осторожны при расширении существующих классов, подобных этому, в логике, так как это может запутать других, когда они пытаются определить, где определены методы.
Вот мой полный файл расширений через Github. Я обертываю почти все функции Selenium. Я хорошо разбираюсь в Javascript, потому что JQuery на 100% надежен в поиске элементов, тогда как функция поиска Selenium имеет некоторые проблемы внутри таких вещей, как IFrames. Кроме того, JQuery имеет чрезвычайно надежный и супер-читабельный способ запроса элементов в DOM с использованием любого количества локаторов, будь то ID, класс, текст, псевдо-селекторы и т. Д .; все в одной строке запроса! (Отсутствие поддержки псевдо-селектора в Selenium css-селекторе может быть ограничением). Вот почему я использую его. Он гораздо более читабелен, чем xpath, проще в написании и на 100% надежен при правильном написании. Если у вас нет JQuery на тестируемых страницах, вы можете просто внедрить скрипт JQuery при каждой загрузке новой страницы.
Итак, я использую JQuery, чтобы найти и сгенерировать явный XPath для нужного элемента на странице, а затем передаю точный XPath логике Selenium «Поиск». Когда вы держите руку Selenium, нет проблем с поиском элементов.
https://gist.github.com/tsibiski/04410e9646ee9ced9f3794266d6c5a82
ПРИМЕЧАНИЕ: Вы можете комбинировать это с приведенной выше логикой щелчков, чтобы расширять щелчки и всегда ждать, пока объект, который вы пытаетесь щелкнуть, готов к щелчку. С моими расширениями вы можете ждать абсолютно любого условия, о котором только можете подумать, стихов с конкретными сценариями в явном ожидании и, конечно, общего ожидания в неявных.
Обратите внимание, как в моих методах расширения я расширяю Element.Click () в Element.ReliableClick (). Это не только обрабатывает труднее найти элементы, но и ждет, прежде чем нажать. Кроме того, вы можете сделать ряд вещей в этой абстрактной функции расширения, например, настраиваемые отчеты.