Selenium - время ожидания проверки отсутствия элемента слишком велико - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть явное время ожидания для веб-драйвера:

WebDriverWait wait = new WebDriverWait(_driver, new TimeSpan(0, 0, 8));

И у меня есть ситуация, когда элемент загрузчика блокирует кнопку, поэтому я жду, пока элемент загрузчика исчезнет:

wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.InvisibilityOfElementLocated(By.XPath(".//*[contains(@class, 'block-ui-wrapper')]")));
btnMenuAdministration.Click();

Проблема в том, что элемент загрузчика присутствует только в течение 1 или 2 секунд, и тест все еще ждет полные 8 секунд, прежде чем нажать кнопку.Я пытался использовать ElementToBeClickable, но получаю исключение, что кнопка не активна.

Есть предложения?

1 Ответ

0 голосов
/ 11 марта 2019
        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 "Find".Когда вы держите руку Selenium, нет проблем с поиском элементов.

https://gist.github.com/tsibiski/04410e9646ee9ced9f3794266d6c5a82

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...