HTTP-запрос к удаленному серверу WebDriver для URL ... истекло 60 секунд - PullRequest
0 голосов
/ 04 февраля 2019

Я использую Selenium с веб-драйвером Internet Explorer (IEDriverServer).По некоторым причинам я не могу найти кодовую базу для этого, чтобы открыть эту ошибку там.Так что, если кто-то может указать мне и в этом направлении, я был бы признателен.

Эта проблема, кажется, широко распространена во всех драйверах, что указывает на базовую проблему Selenium.Но Selenium уже отрицал 1004 *, это их проблема.В настоящее время, по-видимому, существует довольно широкий спектр хаков, которые люди использовали для преодоления текущей проблемы.

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

Я получаю следующие исключения:

Сообщение: HTTP-запросна удаленный сервер WebDriver для URL http://localhost:24478/session/07896235-84ea-465e-a361-cb0ef5885ef2/url по истечении 60 секунд.StackTrace: в OpenQA.Selenium.Remote.HttpCommandExecutor.MakeHttpRequest (HttpRequestInfo requestInfo) в OpenQA.Selenium.Remote.HttpCommandExecutor.Execute (commandToExecute.Exe.Exe.Exe.ExeE.RemoteWebDriver.Execute (String driverCommandToExecute, Dictionary`2 параметры) в OpenQA.Selenium.Remote.RemoteWebDriver.get_Url ()

и

Сообщение: HTTP-запрос ктайм-аут удаленного сервера WebDriver для URL http://localhost:24478/session/07896235-84ea-465e-a361-cb0ef5885ef2/window/rect через 60 секунд.StackTrace: в OpenQA.Selenium.Remote.HttpCommandExecutor.MakeHttpRequest (HttpRequestInfo requestInfo) в OpenQA.Selenium.Remote.HttpCommandExecutor.Execute (commandToExecute.Exe.Exe.Exe.ExeE.RemoteWebDriver.Execute (параметры String driverCommandToExecute, Dictionary`2) в OpenQA.Selenium.Remote.RemoteWindow.get_Position ()

Я получаю это при нескольких разных случайных вызовах драйвера.Например, когда я пытаюсь получить в браузере текущий URL-адрес или когда я пытаюсь щелкнуть элемент в браузере.

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

Я использую пакет Nuget Selenium.WebDriver v3.141.0 сIEDriverServer v3.8.Я откатился с v3.9 из-за другой известной проблемы с драйвером.

Кто-нибудь знает об исправлении этой проблемы или версии драйвера IE, в которой ее нет?

Это мой первый выпуск Selenium.До этого момента я использовал CodedUI, и он работал очень хорошо, но с тех пор, как Microsoft объявила, что прекращает его, я пытался вывести продукт Selenium в сеть в качестве замены.Пока что я преодолел большинство недостатков Selenium, чтобы вернуть себе функциональность, подобную CodedUI, надеюсь, это последняя оставшаяся проблема.

Вот мой основной призыв запустить драйвер:

        /*
         * Startup the correct Selenium browser driver.
         */
        _Service = InternetExplorerDriverService.CreateDefaultService(seleniumPath);

        var options = new InternetExplorerOptions()
        {
            // Mouse clicking takes a long time using NativeEvents, so trying turning it off
            EnableNativeEvents = false
        };
        _Browser = new InternetExplorerDriver((InternetExplorerDriverService)_Service, options);

        _Browser.Manage().Timeouts().PageLoad = new TimeSpan(0, 5, 0); // wait for 5 minutes

1 Ответ

0 голосов
/ 26 февраля 2019

Я создал несколько общих методов повтора.Это взломать ограничение в Selenium.Selenium имеет некоторые встроенные тайм-ауты, которые можно и нужно использовать там, где это необходимо, однако не все вызовы водителей, похоже, соответствуют этим тайм-аутам.Кроме того, не все проблемы с коммуникацией водителя являются результатом того, что Selenium отключился сам по себе после отсутствия ответа;если проблема связана с сетью или проблемами с разрешениями, то эти методы вообще не помогут.

Основные таймауты в Selenium для PageLoad, Script и ImplicitWait должны использоваться для устранения проблем тайм-аута, специфичных для этих областей.

Эти методы (модифицированные из другого источника) устраняют очень узкий набор проблем, при которых Selenium теряет соединение с веб-драйвером на полпути во время вызова, или когда время ожидания истекло, и у вас нет другого способа продления периода ожидания,Они работают, инициируя новый вызов драйвера, в некоторых случаях это может привести к многократному вызову действия в браузере, поэтому используйте их с осторожностью.

    /// <summary>
    /// These retry methods are necessary because Selenium is incapable of handling timeouts
    /// inside it's own system when it temporarily loses connection to the Driver.
    /// Called like:
    /// var return = RetryWebDriverServiceCall(f => object.method(param));
    /// var return = RetryWebDriverServiceCall(f => object.attribute);
    /// </summary>
    /// <param name="serviceMethod"></param>
    public delegate void VoidAction(params object[] oArgs);
    public void RetryWebDriverServiceCall(VoidAction serviceMethod)
    {
        for (var loop = 0; loop < 3; loop++)
        {
            try
            {
                serviceMethod();
                break;
            }
            catch (WebDriverException ex) //  (WebDriverTimeoutException ex)
            {
                if (!ex.Message.Contains("timed out after 60 seconds") || loop >= 2)
                    throw new Exception($"UI Retry #: {loop}", ex);
                System.Threading.Thread.Sleep(500);
            }
        }
    }

    public delegate T ParamsAction<T>(params object[] oArgs);
    public T RetryWebDriverServiceCall<T>(ParamsAction<T> serviceMethod)
    {
        for (var loop = 0; loop < 3; loop++)
        {
            try
            {
                return serviceMethod();
            }
            catch (WebDriverException ex)
            {
                if (!ex.Message.Contains("timed out after 60 seconds") || loop >= 2)
                    throw new Exception($"UI Retry #: {loop}", ex);
            }
        }

        throw new Exception("RetryWebDriverServiceCall failed");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...