Почему в тестовом классе c # время ожидания Selenium больше не истекает? - PullRequest
1 голос
/ 14 июня 2019

У меня есть небольшой метод расширения, чтобы найти элемент с помощью WebDriverWait

public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
    {
        if (timeoutInSeconds > 0)
        {
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
            return wait.Until(drv => drv.FindElement(by));
        }

        return driver.FindElement(by);
    }

Ранее оно работало надежно, но больше не работает правильно. Проблема в том, что тайм-аут больше не применяется. Он будет выглядеть неопределенно, по крайней мере, до истечения времени ожидания вызова веб-драйвера. Это тестовая программа на C #, а драйвер - это драйвер chrome. Обычно он вызывается с помощью find by XPath, но мы используем и другие типы find. Например

var element = webDriver.FindElement(By.XPath(@"//h1[@class='m-t30'][contains(.,'My Profile')]"), 15);

Любая идея, почему это сейчас не удается>

1 Ответ

1 голос
/ 15 июня 2019

Хорошо, ваша проблема связана со смешением Explicit и Implicit Подождите.

Позвольте мне объяснить. Implicit wait приводит к тому, что действия Selenium, например Click или SendKeys, ожидают определенное время. Например, 300 секунд.

public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
    {
        if (timeoutInSeconds > 0)
        {
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
            return wait.Until(drv => drv.FindElement(by));
        }

        return driver.FindElement(by);
    }

Учитывая ваш код, строка

return wait.Until(drv => drv.FindElement(by));

вызывает проблему.

wait.Until запускается первым и пытается вызвать метод findElement. Затем наступает Implicit ожидание, и Selenium ждет 300 секунд, пока действие findElement не будет выполнено. Explicit wait не считает его 300 секунд. Смешивание обоих привело к непредсказуемым результатам согласно комментариям в библиотеке Selenium.

По моему опыту это выглядит так: псевдокод:

for (int i = 500ms; i < timeoutInSeconds; i+=500ms) {
    Thread.Sleep(300*1000) //300 seconds
    Driver.FindElement();

}

Вот как в основном это лечится. Неявное ожидание приводит к остановке потока, поэтому таймер в явном ожидании игнорируется для данного Thread.Sleep ();

В вашем случае вы использовали 15 секунд Explicit ожидания и 300 секунд Implicit ожидания. Пул по умолчанию каждые 500 миллисекунд.

Как правило, ваше ожидание будет работать во время: 15 * 2 // сколько раз вызывается метод FindElement Умножьте его на количество секунд в каждом неявном вызове ожидания из элемента поиска: 30 * 300 секунд. Это дает 9000, что дает 150 минут. Это более 2 часов. Вот почему ваш код застрял, а время ожидания Selenium истекло.

Надеюсь, я вам все правильно объяснил.

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