Selenium WebDriver время от времени вызывает исключения Timeout

Использование селена для тестов пользовательского интерфейса в нашем проекте. Мы используем самую последнюю версию 2.30.0. Мы используем Firefox WebDriver и работаем с Firefox 19.0.

Вообще говоря, тест пользовательского интерфейса работает локально и даже на стороне сервера, когда я запускаю тест пользовательского интерфейса в Visual Studio. Наши тесты пользовательского интерфейса исполняются на нашем сервере сборки. Он использует то же самое развертывание на том же сервере, который я тестирую вручную через Visual Studio.

Но время от времени мы сталкиваемся с следующей проблемой, когда ui-тест выполняется на buildserver:

Test(s) failed. OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL http://localhost:7056/hub/session/bed1d0e7-efdc-46b6-ba07-34903519c44d/element/%7B8717bb19-96c7-44d3-b0ee-d4b989ae652d%7D/click timed out after 60 seconds.
      ----> System.Net.WebException : The operation has timed out
       at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)
       at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
--WebException
   at System.Net.HttpWebRequest.GetResponse()
   at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)

В основном тест нажимает на кнопку загрузки, где поле ввода ранее было заполнено файлом. Так как файл очень маленький, это делается за несколько секунд. Тем не менее тайм-аут 60 секунд достигается иногда.

Любые идеи, как изолировать основной вопрос? Или кто-нибудь сталкивался с той же проблемой раньше? Любые намеки приветствуются. Благодарю.

8 ответов

Я получил эту же ошибку: .NET WebDriver: 2.37, FF: 25.0.1. Я заметил, что Firefox блокировался до тех пор, пока я не вышел из моего тестового приложения, поэтому я создал отладочную версию Firefox и обнаружил, что блокировка произошла, когда он записывал в stderr. Это дало мне ключ к изменению кода веб-драйвера, чтобы он больше не перенаправлял стандартные ошибки и ошибки, и это решило мою проблему. Кажется, что WebDriver каким-то образом блокирует ошибку std. Из MSDN:

Синхронные операции чтения вводят зависимость между чтением вызывающей стороны из потока StandardError и дочерним процессом, записывающим в этот поток. Эти зависимости могут вызвать тупиковые условия...

Больше информации здесь.

Для тех, кто хочет сделать то же самое, я сделал:

  1. Получить источник Селен. Затем проверьте ту же ветвь кода, которую вы используете.

  2. В FireFoxBinary.cs:

    я. Где бы вы ни находились RedirectStandardError = trueизменить на RedirectStandardError = false,

    II. Где бы вы ни находились RedirectStandardOutput = trueизменить на RedirectStandardOutput = false, (для не-Windows, есть также один в Executable.cs)

    III. В ConsoleOuput измените значение "return this.stream.ReadToEnd()" на значение "return"

  3. Создайте и замените WebDriver.dll на ваш.

Отказ от ответственности: это сработало для меня, но ваша проблема может быть другой. Также, насколько я могу судить, это не имеет никаких негативных последствий, кроме отключения вывода на консоль, но могут быть и другие побочные эффекты, о которых я не знаю.

Мне было бы интересно узнать, если кто-то еще найдет то же самое.

Поскольку я решил свою проблему, я не буду копать глубже. Если кто-то из членов группы Selenium хочет получить больше информации / журналов / настроек, я был бы рад сделать это.

Надеюсь, это скоро исправят.

Обновить

Похоже, что Firefox v25 в настоящее время не поддерживается. Смотрите этот комментарий.

Обновление 25 февраля 2014

Смотрите это обновление:

Ладно, эта проблема в целом не проявляется в IE, или так кажется из комментариев. Я бы хотел, чтобы люди попробовали использовать Firefox и Chrome, а также привязки.NET 2.40.0 (будут следующим выпуском на момент написания этой статьи) или более позднюю версию, чтобы узнать, происходит ли это по-прежнему.

Начиная с версии 2.35.0, я видел меньше сообщений об этом в Chrome, поэтому мне нужно знать, по-прежнему ли это связано с привязками.NET и недавним chromedriver.exe.

2.40.0 может иметь исправление по крайней мере для одной из проблем, которые могут вызвать это в Firefox.

Это решило проблему для меня. Глядя на журнал изменений, от 31.01.2014 есть коммит для удаления перенаправления журнала консоли:

"No longer redirecting console output for Firefox in .NET bindings."

Какой обходной путь я использовал здесь. Итак, все это имеет смысл.

Произошло со мной в четырех разных сценариях:

  1. Причина была в том, что дескриптор окна, к которому я обращался, был уже закрыт или находится в стадии закрытия. Если дело обстоит именно так, лучше проверить, что окно все еще существует, прежде чем запрашивать его. Если вы хотите избежать длительного периода ожидания 60 секунд, вы должны изменить способ создания экземпляра Firefox, чтобы уменьшить задержку 60 секунд:

    новый FirefoxDriver("FfBinaryPath", FfProfileInstance, TimeSpan.FromSeconds(5));

  2. Причиной стал плагин вспышки "Защищенный режим". Этот сценарий произошел со мной только под Windows 7 и 8, когда они работали под заданием Дженкинса, таймаут не происходил время от времени. Чтобы это исправить, я запустил мой экземпляр Firefox selenium с отключенным режимом безопасности Flash:

    FfProfile.SetPreference ("dom.ipc.plugins.flash.disable-protected-mode", правда);

  3. Другая причина, также не спорадическая, под Jenkins и связанная с Flash, произошла при использовании Firefox версии 45. Чтобы решить эту проблему, мне пришлось перейти на версию 44 или альтернативно удалить Flash.

  4. Причина внутреннего браузера: иногда браузеру требуется более одной минуты, чтобы отреагировать на вызовы Selenium. В этом случае установка времени ожидания команды браузера выше 60 секунд может решить проблему. например:

    new FirefoxDriver("FfBinaryPath", FfProfileInstance, TimeSpan.FromMinutes(3));

У меня была такая же ошибка с тайм-аутом. Я использовал IEDriverServer (64 бита), и для длинных команд sendKey время ожидания истекло.

Причина в том, что время ожидания по умолчанию составляет 60 секунд.

Что исправило мою проблему, так это то, что я создал экземпляр драйвера с помощью метода, который позволяет вам указать местоположение IEDriverServer, параметры драйвера и значение времени ожидания.

Ссылка на документацию: http://seleniumhq.github.io/selenium/docs/api/dotnet/

public InternetExplorerDriver(
    string internetExplorerDriverServerDirectory,
    InternetExplorerOptions options,
    TimeSpan commandTimeout
)

параметры

  1. InternetExplorerDriverServerDirectory:
    • Тип: System.String
    • Полный путь к каталогу, содержащему IEDriverServer.exe
  2. опции
    • Тип: OpenQA.Selenium.IE.InternetExplorerOptions
    • InternetExplorerOptions, используемый для инициализации драйвера
  3. CommandTimeout
    • Тип: System.TimeSpan
    • Максимальное количество времени ожидания для каждой команды

Мой код

InternetExplorerOptions options = new InternetExplorerOptions();
        IWebDriver driver = new InternetExplorerDriver("C:/Users/jeff/AppData/Local/Microsoft/WindowsApps", options, TimeSpan.FromSeconds(120));

В моем случае страница просто не полностью загружена. Некоторые плагин Facebook, кажется, загружается слишком долго. Я пытался поймать исключение и манипулировать незавершенным домом, но это не дало мне никаких результатов.:(

Джон

У меня была такая же проблема, но только на драйвере Firefox. Оказывается, это может быть связано с тем, что вы используете метод Navigate драйвера, и он пытается слишком быстро взаимодействовать со страницей. Вызов кода ниже исправляет это для меня в Navigate (я также рекомендую использовать его до FindElement):

public void VerifyPageIsLoaded()
{
    var pageLoaded = false;

    for (var i = 0; i < DefaultTimeout.Timeout.Seconds; i++)
    {
        Thread.Sleep(1000);

        if (WebDriver.ExecuteJavaScript<string>("return document.readyState").Equals("complete"))
        //jQuery.active might cause problems on some browser or browserstack so I commented it out
        //&& WebDriver.ExecuteJavaScript<bool>("return jQuery.active == 0").Equals(true))
        {
            pageLoaded = true;
            break;
        }

        Thread.Sleep(1000);
    }

    if (!pageLoaded)
    {
        throw new Exception("Page was not with complete state)!");
    }
}

Мы столкнулись с аналогичной проблемой в нашем проекте. Проблема не имела ничего общего с Selenium или нашим приложением. Время истекло, потому что конфигурация сервера сборки для этого проекта должна была завершиться через 5 минут. Но все наши тесты не были завершены в течение 5 минут, поэтому сборка была неудачной из-за случайных проблем.

Также у нас была проблема с Firefox-19, тесты использовались случайно. Каким-то образом Firefox-10 работал только для наших тестов селена.

Попробуйте этот код:

  DesiredCapabilities caps = DesiredCapabilities.Firefox();   

 //set the timeout to 120 seconds
 IWebDriver driver = new RemoteWebDriver(new Uri("<app_url>"), caps, TimeSpan.FromSeconds(120));
public static IWebElement WaitForElementVisible(By selector, uint timeout = Config.DefaultTimeoutSec)
    {
        IWebDriver driver = Browser.Instance.Driver;

        if (timeout > 0)
        {
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout));

            wait.Until(ExpectedConditions.ElementIsVisible(selector));
            return driver.FindElement(selector);
        }
        else
        {
            // Search for element without timeout 
            return driver.FindElement(selector);
        }
    }

Мы используем это для предотвращения сбоев в элементе, и он работает как шарм.

Существует также другая версия, если элемент может быть там, но не должен быть видимым.

Просто используйте ExpectedConditions.ElementExists(selector) вместо ExpectedContitions.ElementIsVisible(selector)

edit: Browser.Instance.Driver это класс, содержащий экземпляр драйвера

Другие вопросы по тегам