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

Я использую Selenium в течение нескольких месяцев, которые мы используем для автоматизации некоторых наших внутренних процессов тестирования. Сценарии проходили нормально. Я недавно обновился до веб-драйвера C# 2.40.0 с использованием FF 27.01, и наши скрипты теперь не работают в случайных местах со следующей ошибкой.

[Portal.SmokeTest.SmokeRunTest.Booking] TearDown method failed. OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL htt(p)://localhost:7055/hub/session/56e99e88-ba17-4d12-bef1-c6a6367ccc2f/element timed out after 60 seconds.
  ----> System.Net.WebException : The operation has timed out
TearDown : OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL htt(p)://localhost:7055/hub/session/56e99e88-ba17-4d12-bef1-c6a6367ccc2f/window timed out after 60 seconds.
  ----> System.Net.WebException : The operation has timed out
[09:01:20]
[Portal.SmokeTest.SmokeRunTest.Booking] TearDown method failed. OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL htt(p)://localhost:7055/hub/session/56e99e88-ba17-4d12-bef1-c6a6367ccc2f/element timed out after 60 seconds.
  ----> System.Net.WebException : The operation has timed out
TearDown : OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL htt(p)://localhost:7055/hub/session/56e99e88-ba17-4d12-bef1-c6a6367ccc2f/window timed out after 60 seconds.
  ----> System.Net.WebException : The operation has timed out
   at OpenQA.Selenium.Support.UI.DefaultWait`1.PropagateExceptionIfNotIgnored(Exception e)
   at OpenQA.Selenium.Support.UI.DefaultWait`1.Until[TResult](Func`2 condition)
   at Portal.Test.Helpers.Process_Bookings.OpenBookings.SelectBooking(String bookingnumber)
   at Portal.SmokeTest.SmokeRunTest.Booking() in d:\TeamCityAgent\work\dac1dcea7f2e80df\SmokeTests\SmokeRunTest.cs:line 68
--WebException
   at System.Net.HttpWebRequest.GetResponse()
   at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)
--TearDown
   at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)
   at OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(Command commandToExecute)
   at OpenQA.Selenium.Firefox.Internal.ExtensionConnection.Execute(Command commandToExecute)
   at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
   at OpenQA.Selenium.Remote.RemoteWebDriver.Close()
   at Portal.Test.Helpers.Setup.CloseWebdriver()
   at Portal.SmokeTest.SmokeRunTest.TearDown() in d:\TeamCityAgent\work\dac1dcea7f2e80df\SmokeTests\SmokeRunTest.cs:line 162
--WebException
   at System.Net.HttpWebRequest.GetResponse()
   at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)

Последняя ошибка, которую мне удалось отследить до одной строки кода:

_setup.driver.FindElement(By.XPath("//button[@class='buttonSmall lockBookingButton']")).Click();

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

Я сталкивался с этой проблемой раньше, пока в отладке, и когда Click() Строка кода была вызвана, Firefox оказался заблокированным, и только остановка теста позволила бы Firefox продолжить. Есть несколько предложений, в том числе изменение источника веб-драйвера? Я хотел бы не идти по этому пути, если это возможно, если кто-то еще может предложить какие-либо предложения.

21 ответ

У меня была похожая проблема с использованием драйвера Chrome (v2.23) / при выполнении тестов через TeamCity. Мне удалось решить эту проблему, добавив флаг "без песочницы" в параметры Chrome:

var options = new ChromeOptions();
options.AddArgument("no-sandbox");

Я не уверен, есть ли подобная опция для драйвера FF. Из того, что я понимаю, проблема связана с тем, что TeamCity работает под управлением Selenium под учетной записью SYSTEM.

new FirefoxDriver(new FirefoxBinary(),new FirefoxProfile(),TimeSpan.FromSeconds(180));

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

Я впервые столкнулся с этой проблемой несколько месяцев назад (также на click() команда), и это было проблемой для меня с тех пор. Кажется, это какая-то проблема с привязками.NET Selenium. Этот пост, написанный парнем, который работает над драйвером IE, помогает объяснить, что происходит:

http://jimevansmusic.blogspot.com/2012/11/net-bindings-whaddaymean-no-response.html

К сожалению, кажется, нет реального решения этой проблемы. Всякий раз, когда эта проблема поднимается до разработчиков Selenium ( см. Здесь), это типичный ответ:

Нам нужен воспроизводимый сценарий, который должен включать образец страницы или ссылку на страницу общедоступного сайта, где можно воспроизвести проблему.

Если вы можете отправить последовательно воспроизводимый контрольный пример, это может быть очень полезно для исправления этой ошибки.

Тем не менее, возможно, вы можете попробовать этот обходной путь в то же время. Если кнопка HTML, которую вы пытаетесь click() имеет onclick атрибут, который содержит Javascript, рассмотрите возможность использования JavascriptExecutor для непосредственного выполнения этого кода вместо вызова click() команда. Я обнаружил, что выполнение onclick Javascript позволяет напрямую проходить некоторые из моих тестов.

Была такая же проблема с Firefox. Я переключился на Chrome с опциями, и с тех пор все в порядке.

ChromeOptions options = new ChromeOptions();
 options.AddArgument("no-sandbox");

 ChromeDriver driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), options, TimeSpan.FromMinutes(3));
 driver.Manage().Timeouts().PageLoad.Add(System.TimeSpan.FromSeconds(30));

В моем случае ни один из приведенных выше ответов не решил мою проблему полностью. В итоге я использовал (no-sandbox), соединение с увеличенным периодом ожидания (driver = new RemoteWebDriver(new Uri("http://localhost:4444/wd/hub"), capability, TimeSpan.FromMinutes(3));) и таймаут загрузки страницы (driver.Manage().Timeouts().PageLoad.Add(System.TimeSpan.FromSeconds(30));) так что теперь мой код выглядит так:

    public IWebDriver GetRemoteChromeDriver(string downloadPath)
    {
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.AddArguments(
            "start-maximized",
            "enable-automation",
            "--headless",
            "--no-sandbox", //this is the relevant other arguments came from solving other issues
            "--disable-infobars",
            "--disable-dev-shm-usage",
            "--disable-browser-side-navigation",
            "--disable-gpu",
            "--ignore-certificate-errors");
        capability = chromeOptions.ToCapabilities();

        SetRemoteWebDriver();
        SetImplicitlyWait();
        Thread.Sleep(TimeSpan.FromSeconds(2));
        return driver;
    }
    
    private void SetImplicitlyWait()
    {
        driver.Manage().Timeouts().PageLoad.Add(TimeSpan.FromSeconds(30));
    }


    private void SetRemoteWebDriver()
    {
        driver = new RemoteWebDriver(new Uri("http://localhost:4444/wd/hub"), capability, TimeSpan.FromMinutes(3));
    }

Но, как я уже упоминал, ни один из вышеперечисленных методов не решил мою проблему, я постоянно получал ошибку, и были активны несколько процессов chromedriver.exe и chrome.exe (~10 из chromedriver и ~50 из chrome).

Итак, где-то я читал, что после удаления драйвера мне следует подождать несколько секунд, прежде чем начинать следующий тест, поэтому я добавил следующую строку для удаления метода:

    driver?.Quit();
    driver?.Dispose();
    Thread.Sleep(3000);

С этой модификацией сна я больше не получаю ошибку тайм-аута, и нет ненужных открытых процессов chromedriver.exe и chrome.exe.

Надеюсь, я так долго помогал кому-то, кто борется с этой проблемой.

В моем случае тип моей кнопки submit не button и я меняю Click в Sumbit тогда каждая работа хороша. Что-то вроде ниже,

от driver.FindElement(By.Id("btnLogin")).Click();

в driver.FindElement(By.Id("btnLogin")).Submit();

Кстати, я попробовал все ответы в этом посте, но не работает для меня.

Получил похожую проблему. Попробуйте установить больше времени в конструкторе драйвера - добавьте, например.

var timespan = TimeSpan.FromMinutes(3);

var driver = new FirefoxDriver(binary, profile, timeSpan);

В моем случае это потому, что я удалил папку обновления Chrome. После переустановки хрома работает нормально.

Я думаю, что эта проблема возникает, когда вы пытаетесь получить доступ к объекту веб-драйвера после

1) окно закрылось и вы еще не переключились на родительский

2) вы переключились на окно, которое было не совсем готово и было обновлено с момента переключения

в ожидании windowhandles.count чтобы быть тем, что вы ожидаете, не учитывает содержание страницы, как и document.ready. Я все еще ищу решение этой проблемы

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

Проблема заключалась в том, что целевой сервер не был правильно настроен на сервере сборки, поэтому он не мог правильно открыть браузер.

Мы использовали хромированный драйвер, но я не уверен, что это имеет значение.

У меня было такое же исключение при попытке запустить ChromeDriver без головы с запланированной задачей на сервере Windows (без присмотра). Для меня это решило запуск задачи от имени пользователя "Администраторы" (обратите внимание на букву S в конце). То, что я тоже сделал (не знаю, актуально ли это), выбрал "Любое соединение" на вкладке "Условия" задачи.

Я получал эту проблему. Я забыл обновить пакет nuget Selenium.WebDriver.ChromeDriver, чтобы он соответствовал версии Chrome, которую я использовал. Как только я это сделал, проблема была решена.

Проблема в том, что оценка Click() время в вашей сборке ENV.. вы можете копаться в том, что происходит на Click(),

Кроме того, попробуйте добавить Retrys для Click() потому что иногда оценки занимают больше времени в зависимости от скорости сети и т. д.

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

В моем случае проблема была с SendKeys() и удаленным рабочим столом. Размещать обходной путь у меня так далеко:

У меня был тест Selenium, который проваливался при выполнении задания Jenkins на узле, размещенном в vSphere и администрируемом через RDP. После некоторого устранения неполадок выяснилось, что это успешно, если удаленный рабочий стол подключен и сфокусирован, но терпит неудачу за исключением того, что удаленный рабочий стол отключен или даже свернут.

В качестве обходного пути я вошел в систему через vSphere Console вместо RDP, а затем даже после закрытия vSphere тест больше не проходил. Это обходной путь, но я должен быть осторожным, никогда не входить через RDP и всегда администрировать только через vSphere Console.

А-а-а! Столкнулся с этим в macOS сегодня, и проблема была очень простой - всплывающее окно с предложением установить новую версию Appium отображалось на удаленном сервере сборки CI.

Просто подключившись к нему с помощью VNC и нажав "Установить позже", он исправился.

Я опубликовал в канале selenium slack информацию о том, как работает тайм-аут, который мы передаем для конструктора Chromedriver, и получил этот ответ (C#). «Тайм-аут, который вы можете установить в конструкторе драйвера, — это «тайм-аут команды», который, по сути, является тайм-аутом чтения для http-клиента. HTTP-клиент ничего не знает о том, что делает драйвер.

Если страница никогда не загружается, а время ожидания команды меньше, чем время ожидания загрузки страницы, вы получите сообщение об ошибке «Время ожидания HTTP-запроса к удаленному серверу WebDriver истекло».

Если время ожидания команды больше, чем время ожидания загрузки страницы, драйвер ответит клиенту с ошибкой времени ожидания, а Selenium сообщит о полученном драйвером сообщении».

Меня вполне устраивает изменение Selenium.WebDriver.ChromeDriver с 2.40.0 на 2.27.0

new FirefoxDriver(binary, profile, timeSpan) был устаревшим

Теперь вы можете использовать new FirefoxDriver(FirefoxDriverService.CreateDefaultService(), FirefoxOptions options, TimeSpan commandTimeout) вместо.

Также есть new FirefoxDriver(string geckoDriverDirectory, FirefoxOptions options, TimeSpan commandTimeout) и это работает. Но это недокументировано, и вам нужно указать вручную geckoDriverDirectory хотя он уже в Path,

Я также вижу эту проблему при запуске своих тестов, поэтому искал «почему» и «как исправить».

Моя первоначальная мысль (после просмотра сбоев скриншотов и сообщения о тайм-ауте) заключалась в том, что производительность веб-сайта, должно быть, ухудшилась, и что веб-сайту требуется больше времени, чтобы делать некоторые вещи, которые вызывают проблему.

Я нашел много решений (которые я планирую опробовать), ОДНАКО, похоже, что большинство решений указывает на то, что производительность веб-сайта (время реакции) снизилась. Если вам нужно изменить ожидание на 30 секунд, чтобы подождать 3 минуты, это правда, что это позволит пройти тест ... но не означает ли это, что нам нужно ждать около 3 минут, чтобы веб-сайт что-то сделал?

Вопрос: Можно ли в 90% случаев списать это сообщение об ошибке на счет снижения производительности веб-сайта? Я читал некоторые сайты, упомянутые выше, и похоже, что проблема также может быть в том, что хромированный драйвер вызывает задержки (возможно, не имеет ничего общего с проблемами приложения). Кто-нибудь доводит эту проблему до сведения своей команды разработчиков приложений, или вы просто меняете время ожидания и не отчитываетесь?

Для ChromDriver у меня работает следующее:

string chromeDriverDirectory = "C:\\temp\\2.37";
 var options = new ChromeOptions();
 options.AddArgument("-no-sandbox");
 driver = new ChromeDriver(chromeDriverDirectory, options, 
 TimeSpan.FromMinutes(2));

Селен версия 3.11, ChromeDriver 2.37

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