HTTP-запрос к удаленному серверу WebDriver для тайм-аута URL при параллельном запуске тестов в разных браузерах

В течение нескольких месяцев я боролся с широко распространенным "HTTP-запросом к удаленному серверу WebDriver для URL-адреса... время ожидания истекло x секунд", пытаясь запустить тесты для двух браузеров одновременно (Chrome и IE), тратя часы на время пролистывания стека и результаты поиска, чтобы найти решение.

Мое поведение, как и у других до меня, варьируется в зависимости от времени ожидания при нажатии кнопки или при попытке получить URL, и я увеличил загрузку страницы и неявное время ожидания до 600 секунд в различных случаях, вставляя ожидания перед элементом, после url вызывается до вызова url, после вызова конструктора драйвера и в качестве параметра при вызове объекта драйвера.

Я попытался включить сценарии javascript exectutor (предоставленные из ответов в предыдущих публикациях SO по этому вопросу), которые проверяют состояние готовности загрузки страницы перед завершением действия, но безуспешно.

Я попытался обновить все свои Chrome и IE, Selen Web и драйверы поддержки до последних совместимых версий, вручную вызывая двоичный файл для последней совместимой исполняемой программы браузера, а также пытаясь выполнить откат до предыдущих версий, когда люди сообщали об успехе (Chrome v48, chromedriver 2.22.0.0, webdriver 2.53.1). Я попытался добавить "no-sandbox" в качестве опции chrome, чтобы все зоны безопасности IE имели одинаковый уровень защиты.

Я исследовал, использует ли моя страница сценарии AJAX, и попытался использовать решения, предоставленные в различных потоках, для размещения любого динамического контента.

При запуске IE или Chrome по отдельности, вне параллельного запроса, проблем с тайм-аутом не наблюдается. Эта проблема, в частности, возникает, когда chrome инициализирует свой удаленный экземпляр WebDriver. Я также пытался использовать 32-битные и 64-битные версии драйверов Chrome / ie.

Я вытащил информацию из многих тем и страниц, но это одни из самых актуальных.

Ошибка Selenium - истек тайм-аут HTTP-запроса к удаленному WebDriver через 60 секунд

https://sqa.stackexchange.com/questions/13326/the-http-request-to-the-remote-webdriver-server-timed-out-after-60-seconds

https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/5441

https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/5071

Ошибка Selenium - истек тайм-аут HTTP-запроса к удаленному WebDriver через 60 секунд

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

Вот пример вывода:

System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
  ----> System.AggregateException : One or more errors occurred.
  ----> OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL http://localhost:52240/session/a969dbe2-3b0c-461f-a979-21bafec0dd8e/element/7005aeab-ff31-454a-8f78-0a39ad861695/click timed out after 120 seconds.
  ----> System.Net.WebException : The request was aborted: The operation has timed out.

Я вызываю драйверы из списка дел, где они позже добавляются в параллельный запрос:

 private static IWebDriver DefineDriver(Browser supportedbrowsers)
        {
            var baseDriverPath = ConfigurationManager.AppSettings["BaseDriverPath"].ToString();
            var ieDriverFolder = ConfigurationManager.AppSettings["IeDriverFolder"].ToString();
            var chromeDriverFolder = ConfigurationManager.AppSettings["ChromeDriverFolder"].ToString();
            ChromeOptions chromeoptions = new ChromeOptions();
            chromeoptions.BinaryLocation = @"C:\WebDrivers\Binary\chrome32_49.0.2623.75\chrome.exe";
            chromeoptions.AddArgument("no-sandbox");
            InternetExplorerOptions ieoptions = new InternetExplorerOptions();
            ieoptions.IntroduceInstabilityByIgnoringProtectedModeSettings = false;


            IWebDriver driver = null;
            switch (supportedbrowsers)
            {
                case Browser.Chrome:
                    driver = new ChromeDriver(Path.Combine(baseDriverPath, chromeDriverFolder), chromeoptions, TimeSpan.FromMinutes(5));
                    break;
                case Browser.InternetExplorer:                
                    driver = new InternetExplorerDriver(Path.Combine(baseDriverPath, ieDriverFolder), ieoptions, TimeSpan.FromMinutes(5));
                    break;
                default:
                    driver = new ChromeDriver(Path.Combine(baseDriverPath, chromeDriverFolder), chromeoptions, TimeSpan.FromMinutes(5));
                    break;
            }

            driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(120));
            driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromMinutes(10));
            driver.Manage().Timeouts().SetScriptTimeout(TimeSpan.FromMinutes(10));

            driver.Manage().Window.Maximize();

            return driver;
        }

В моем тестовом коде я просто запускаю страницу, перехожу на другую локальную страницу и затем пытаюсь нажать кнопку, которая сразу же видна на странице.

Я попытался обернуть команду click для кнопки в триггере try, добавил явное ожидание с ожидаемыми условиями (отображено, включено, isclickable), использовал режим ожидания потока, который все работал, как и ожидалось, при запуске одного браузера.

Например, я вызываю кнопку через:

 public void SelectAddWorkWorkPageButton()
    {
        WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10));
        wait.Until(ExpectedConditions.ElementToBeClickable(addNewWorkItemWorkPageBtn));
        addNewWorkItemWorkPageBtn.Click();
    }

Который находит следующий элемент:

//Create New Button
        [FindsBy(How = How.Id, Using = "btnWorkDefinitionCreateNewWorkDefinition")]
        public IWebElement addNewWorkItemWorkPageBtn { get; set; }

И это HTML:

<i id="btnWorkDefinitionCreateNewWorkDefinition" title="Add work" class="fa fa-plus-circle cursorPointer crudIcon" style="font-size: 20px;margin:0;padding-left:15px" ng-click="AddNewWorkDefinition()" role="button" tabindex="0"></i>

В качестве отдельного примечания относительно тайм-аутов при обновлении до последних версий WebDriver я также обновил тайм-ауты до их нового формата:

    //driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(120);
    //driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(120);
    //driver.Manage().Timeouts().AsynchronousJavaScript = TimeSpan.FromSeconds(120);

Похоже, что эта проблема существовала в сообществе еще с 2012 года, и, по моему мнению, никогда не была изолированной и четко идентифицированной, и люди все еще сообщали об этом в мае этого года.

Ошибка Selenium - истек тайм-аут HTTP-запроса к удаленному WebDriver через 60 секунд

1 ответ

После попытки еще нескольких обходных путей, включая использование Protractor для учета кода AngularJS, я, наконец, изолировал причину сообщения об исключении "HTTP-запрос к удаленному серверу WebDriver для URL" до конкретной проблемы при индивидуальном запуске IEDriver. или параллельно с приложением в тесте.

Похоже, что приложение использовало соединение SignalR для обработки определенных процессов, и это приводит к истечению времени ожидания действий IEDriver (например, события щелчка), потому что соединение SignalR никогда не завершится, и, следовательно, IEDriver не сможет определить, что страница закончил загрузку, прежде чем он мог выполнить другое действие.

Когда тип соединения SignalR был обновлен для использования "длинного опроса", это полностью решило проблему тайм-аута IEDriver.

Более подробные объяснения доступны в этих сообщениях, и большая заслуга принадлежит тем, кто внес свой вклад, я бы никогда не догадался, что SignalR была причиной в противном случае: https://github.com/SignalR/SignalR/issues/293

SignalR с веб-сокетами

C# транспортир AngularJS IEDriverServer Click() Исключение "Превышено время ожидания загрузки страницы"

Благодарю.

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