Помилка селену - час очікування HTTP-запиту до віддаленого WebDriver закінчився через 60 секунд


85

Я використовую селен протягом декількох місяців, який ми використовуємо для автоматизації деяких наших внутрішніх процесів тестування. Сценарії проходять нормально. Нещодавно я оновив веб-драйвер 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 продовжувати. Тут є ряд пропозицій, включаючи зміну джерела webdriver? Я хотів би не йти цим шляхом, якщо це можливо, якщо хтось інший може запропонувати будь-які пропозиції.


У нас була однакова проблема в декількох незалежних проектах, які використовують цю установку, і досі не маємо жодного способу вирішення цієї проблеми. Найкращим варіантом було перейти на старіші версії збірок WebDriver та Firefox. Ми також не знаємо, чи спричинена така поведінка WebDriver або Firefox.
Dio F

Відповіді:


23

У мене була подібна проблема з використанням драйвера Chrome (v2.23) / запуску тестів через TeamCity. Я зміг виправити проблему, додавши прапорець "no-sandbox" до параметрів Chrome:

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

Я не впевнений, чи існує подібний варіант для драйвера FF. Наскільки я розумію, проблема пов’язана з тим, що TeamCity запускає Selenium під обліковим записом SYSTEM.


це також вирішить мою проблему. Я не міг більше проводити тести на хром через місяці, коли їх не пробував. Спасибі combatc2
Етьєн,

1
Мій код працював нормально у хості env, який розміщений у IIS, і раптово зупинився, але все ще працював у моїх модульних тестах. Додавши цей рядок, він знову запрацював у службі IIS env. Дякую!
Легенди

1
Я визнав це як var options = new ChromeOptions(); options.AddArgument("--no-sandbox");Робота зараз у версії C # Webdriver 3.14.
moto_geek

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

Запустіть свій браузер, використовуючи наведені вище рядки коду. У мене це спрацювало.


Виправлено і для нас. При запуску базового сценарію, який щойно створив драйвер FF, і нічого іншого, 60-секундний тайм-аут працював 100% часу. Під час запуску нашого ресурсного сценарію, який відкриває підключення до баз даних / читає / пише / робить набагато більше безпосередньо перед відкриттям FF, час очікування 60 може спричинити помилки ~ 50% часу. Збільшення часу очікування до 3 хвилин вирішило проблему. Здається, Webdriver просто потрібно трохи більше часу, щоб двигун прогрівся.
KayakinKoder

13

Я вперше зіткнувся з цією проблемою кілька місяців тому (також за click()командою), і з тих пір вона є проблемою для мене. Здається, це якась проблема із прив’язками .NET Selenium. Цей допис у блозі хлопця, який працює над драйвером IE, корисний для пояснення того, що відбувається:

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

На жаль, реального вирішення цієї проблеми, схоже, не існує. Щоразу, коли це питання піднімається перед розробниками Selenium ( див. Тут ), це типова відповідь :

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

Якщо ви можете подати послідовно відтворюваний тестовий випадок, це може бути дуже корисним для того, щоб полагодити цю помилку назавжди.

Тим не менш, можливо, ви можете тим часом спробувати цей обхідний шлях. Якщо кнопка HTML, яку ви намагаєтесь мати, click()має onclickатрибут, який містить Javascript, розгляньте можливість використання JavascriptExecutor для безпосереднього виконання цього коду, а не виклику click()команди. Я виявив, що виконання onclickJavascript безпосередньо дозволяє пройти деякі мої тести.


9

Була така сама проблема з 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));

Я, швидше за все, помиляюся тут, але, здається, останній рядок там не матиме ефекту. PageLoad - це сам по собі TimeSpan, а .Add on TimeSpan - це чиста функція, яка не змінює PageLoad; вона просто повертає новий TimeSpan, який відкидається.
Джейсон Річі,

3

У моєму випадку, тип моєї кнопки це submitНЕ buttonя змінити , Clickщоб Sumbitпотім кожен добре працювати. Щось як нижче,

від driver.FindElement(By.Id("btnLogin")).Click();

до driver.FindElement(By.Id("btnLogin")).Submit();

До речі, мене спробували отримати всі відповіді в цій публікації, але мені це не підходить.


3

Отримав подібне питання. Спробуйте встановити більше часу в конструкторі драйвера - додайте наприклад.

var timespan = TimeSpan.FromMinutes(3);

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

Привіт, bewu, це буде у форматі, наведеному нижче? driver.Manage (). Тайм-аути (). ImplicitlyWait (TimeSpan.FromSeconds (5));
Натан

4
Ні, не це очікування ImplicitlyWait пов’язане з пошуком елементів. Вам потрібно змінити тайм-аут драйвера за замовчуванням (60 секунд), коли він чекає продовження запиту (якщо я не помиляюся). У будь-якому випадку вам доведеться знайти рядок, де ви встановите конструктор драйвера FF і додасте туди більше атрибутів або зміните час очікування. Щось на кшталт:driver = new FirefoxDriver(new FirefoxBinary(), new FirefoxProfile(path to your profile), TimeSpan.FromMinutes(3));
Барт Войтала

2
для ChromeDriver це могло б виглядатиdriver = new ChromeDriver(service, chromeDriverOptions, TimeSpan.FromMinutes(3));
redwards510

2

Я думаю, ця проблема виникає при спробі отримати доступ до об'єкта веб-драйвера після

1) вікно закрито, і ви ще не перейшли на батьківський

2) ви перейшли на вікно, яке не було повністю готовим і оновилося з моменту переключення

очікуючи, що windowhandles.countте, що ви очікуєте, не враховує вміст сторінки, а також document.ready. Я все ще шукаю рішення цієї проблеми


2

У моєму випадку це тому, що я видалив папку оновлення chrome. Після перевстановлення chrome він працює нормально.


1

Проблема полягає в тому, що оцінка Click()часу очікування на вашу середовище збірки .. ви можете захотіти розібратися в тому, що відбувається далі Click().

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


Привіт, опція повторити спробу не працює, оскільки браузер просто блокується. Тільки зупинка тесту дозволяє браузеру продовжувати.
Натан

1

У моєму випадку я виявив, що ця помилка трапляється на сервері побудови наших команд. Тести працювали на наших локальних розробницьких машинах.

Проблема полягала в тому, що цільовий веб-сайт був неправильно налаштований на сервері збірки, тому він не зміг правильно відкрити браузер.

Ми використовували драйвер chrome, але я не впевнений, що це має значення.


1

У моєму випадку проблема полягала в SendKeys () та віддаленому робочому столі . Опублікувавши обхідний шлях, який я маю на сьогодні

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

Як обхідний шлях, я увійшов через vSphere Console замість RDP, а потім навіть після закриття vSphere тест більше не провалювався. Це обхідний шлях, але я повинен бути обережним, щоб ніколи не входити через RDP і завжди адмініструвати лише через vSphere Console.



0

new FirefoxDriver(binary, profile, timeSpan)Вже застаріли.

Тепер ви можете використовувати new FirefoxDriver(FirefoxDriverService.CreateDefaultService(), FirefoxOptions options, TimeSpan commandTimeout)замість цього.

Є також new FirefoxDriver(string geckoDriverDirectory, FirefoxOptions options, TimeSpan commandTimeout)і він працює. Але це недокументовано, і вам потрібно вказати вручну, geckoDriverDirectoryхоча це вже є Path.


0

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


0

Арррх! Сьогодні зіткнулися з цим на macOS, і проблема була настільки простою, як спливаюче вікно із пропозицією встановити нову версію Appium відображалося на віддаленому сервері побудови CI.

Просто VNC'ing до нього і натиснувши кнопку " Встановити пізніше " це виправило.


0

У моєму випадку жоден з наведених вище відповідей повністю не вирішив мою проблему. У підсумку я використав режим ( 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 хромедрівера та ~ 50 хрому).

Тож десь я прочитав, що після утилізації драйвера мені слід почекати кілька секунд перед початком наступного тесту, тому я додав наступний рядок, щоб розпорядитися методом:

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

З цією модифікацією сну я більше не отримую помилку тайм-ауту, і немає без необхідності відкритих процесів chromedriver.exe та chrome.exe.

Сподіваюся, я допомагав тому, хто бореться із цим питанням стільки часу, скільки й я.


0

Я мав такий самий виняток, коли намагався запустити безголовий ChromeDriver із запланованим завданням на сервері Windows (без нагляду). Що вирішило для мене, це запустити завдання як користувач " Адміністратори " (зверніть увагу на S в кінці). Те, що я також зробив (я не знаю, чи це стосується), вибирається на вкладці "Будь-яке підключення" на вкладці "Умови".


-1

Для 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.