Подтвердить что ты не робот

Selenium WebDriver выбрасывает исключения времени ожидания спорадически

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

Как правило, тест ui работает на локальной и даже серверной стороне, когда я запускаю ui-тест в Visual Studio. Наши тесты ui выполняются на нашем сервере сборки. Он использует одно и то же развертывание на том же сервере, который я тестирую вручную через 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 секундами иногда достигается.

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

4b9b3361

Ответ 1

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

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

Подробнее здесь.

Для тех, кто хочет сделать ту же настройку, что и я: -

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

  • В FireFoxBinary.cs:

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

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

    III. В ConsoleOuput измените "return this.stream.ReadToEnd()", чтобы "вернуть" "

  • Создайте и замените WebDriver.dll своим.

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

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

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

Надеюсь, скоро это будет исправлено.

Обновление

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

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

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

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

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

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

Это решило проблему для меня. При просмотре журнала изменений есть фиксация с 1/31/2014 для удаления перенаправления консоли:

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

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

Ответ 2

Случилось со мной в четырех разных сценариях:

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

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

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

    FfProfile.SetPreference( "dom.ipc.plugins.flash.disable-protected-mode", true);

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

    /li >
  • Причина внутреннего браузера: иногда браузер берет более одной минуты, чтобы реагировать на звонки Selenium. В таком случае установка тайм-аута команды браузера более 60 секунд может решить проблему. например:

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

Ответ 3

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

Джон

Ответ 4

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

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

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

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

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

Параметры

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

Мой код

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

Ответ 5

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

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

Ответ 6

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

  DesiredCapabilities caps = DesiredCapabilities.Firefox();   

 //set the timeout to 120 seconds
 IWebDriver driver = new RemoteWebDriver(new Uri("<app_url>"), caps, TimeSpan.FromSeconds(120));

Ответ 7

У меня была такая же проблема, но только на 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)!");
    }
}

Ответ 8

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 - это класс, содержащий встроенный драйвер