Błąd selenu - Żądanie HTTP do zdalnego WebDriver przekroczyło limit czasu po 60 sekundach

85

Używam Selenium od wielu miesięcy, którego używamy do automatyzacji niektórych naszych wewnętrznych procesów testowych. Skrypty przeszły pomyślnie. Niedawno zaktualizowałem webdriver do C # 2.40.0 przy użyciu FF 27.01 i teraz nasze skrypty zawodzą w losowych miejscach z następującym błędem.

[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)

Ostatni błąd, który udało mi się wyśledzić w jednej linii kodu:

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

Irytujące jest to, że próba rozwiązania problemu okazuje się trudna, tak jakbym uruchomił test na mojej lokalnej maszynie, a debugowanie kończy się pomyślnie. Dodatkowo, jeśli uruchomię go za pośrednictwem NUNIT runner na maszynie budującej, uruchamiam test, również kończy się pomyślnie. Wydaje się, że zawodzi tylko jako część naszego automatycznego procesu uruchamiania kompilacji podczas korzystania z Teamcity. Jak powiedziałem, działało to dobrze od miesięcy, a jedyną rzeczą, która się zmieniła, jest zestaw selenowy webdriver.

Doświadczyłem tego problemu już wcześniej, podczas debugowania, a gdy wywołano Click()wiersz kodu, Firefox zawiesił się i tylko zatrzymanie testu umożliwiło kontynuację programu. Jest tu kilka sugestii, w tym modyfikacja źródła webdriver? Chciałbym nie podążać tą drogą, jeśli to możliwe, jeśli ktoś inny może zaproponować jakieś sugestie.

Nathan
źródło
Mieliśmy dokładnie ten sam problem w kilku niezależnych projektach korzystających z tej konfiguracji i nadal nie mamy rozwiązania tego problemu. Naszym najlepszym rozwiązaniem było przejście na starszą wersję zestawów WebDriver i Firefox. Nie wiemy również, czy przyczyną tego zachowania jest WebDriver czy Firefox.
Dio F

Odpowiedzi:

23

Miałem podobny problem ze sterownikiem Chrome (v2.23) / testowaniem przez TeamCity. Udało mi się rozwiązać ten problem, dodając flagę „brak piaskownicy” do opcji Chrome:

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

Nie jestem pewien, czy istnieje podobna opcja dla sterownika FF. Z tego co rozumiem, problem ma coś wspólnego z TeamCity prowadzącym Selenium w ramach konta SYSTEM.

Combatc2
źródło
to rozwiązuje również mój problem. Nie mogłem już uruchomić testów Chrome po miesiącach ich niepróbowania. Dzięki Combatc2
Etienne
1
Mój kod działał poprawnie w środowisku env hostowanym przez IIS i nagle się zatrzymał, ale nadal działał w moich testach jednostkowych. Dodanie tej linii sprawiło, że działał ponownie w środowisku IIS. Dzięki!
Legends,
1
Uważam, że var options = new ChromeOptions(); options.AddArgument("--no-sandbox");działa teraz w C # wersji Webdriver 3.14.
moto_geek
20
new FirefoxDriver(new FirefoxBinary(),new FirefoxProfile(),TimeSpan.FromSeconds(180));

Uruchom przeglądarkę, korzystając z powyższych linii kodu. U mnie to zadziałało.

user2298124
źródło
Naprawiono również dla nas. Podczas uruchamiania podstawowego skryptu, który właśnie utworzył sterownik FF i nic więcej, 60-sekundowy limit czasu działał w 100% przypadków. Podczas uruchamiania naszego skryptu z dużą ilością zasobów, który otwiera połączenia z bazami danych / odczytuje / zapisuje / robi znacznie więcej bezpośrednio przed otwarciem FF, przekroczenie limitu czasu 60 spowodowałoby awarie ~ 50% przypadków. Wydłużenie limitu czasu do 3 minut rozwiązało problem. Wygląda na to, że Webdriver potrzebuje trochę więcej czasu na rozgrzanie silnika.
KayakinKoder
13

Po raz pierwszy zetknąłem się z tym problemem kilka miesięcy temu (również na click()polecenie) i od tego czasu jest to dla mnie problem. Wydaje się, że jest to jakiś problem z powiązaniami .NET Selenium. Ten post na blogu autorstwa faceta, który pracuje nad sterownikiem IE, jest pomocny w wyjaśnianiu, co się dzieje:

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

Niestety wydaje się, że nie ma prawdziwego rozwiązania tego problemu. Ilekroć ten problem został podniesiony do programistów Selenium ( patrz tutaj ), jest to typowa odpowiedź :

Potrzebujemy powtarzalnego scenariusza, który musi zawierać przykładową stronę lub link do strony w witrynie publicznej, na której można odtworzyć problem.

Jeśli jesteś w stanie przesłać konsekwentnie odtwarzalny przypadek testowy, może to być bardzo pomocne w usunięciu tego błędu na dobre.

To powiedziawszy, być może w międzyczasie możesz wypróbować to obejście. Jeśli przycisk HTML, który próbujesz click()użyć, ma onclickatrybut, który zawiera JavaScript, rozważ użycie JavascriptExecutor do bezpośredniego wykonania tego kodu, zamiast wywoływania click()polecenia. Zauważyłem, że onclickbezpośrednie wykonanie skryptu JavaScript pozwala niektórym z moich testów przejść.

Daniel Charles
źródło
9

Miał ten sam problem z Firefoksem. Przerzuciłem się na Chrome z opcjami i od tego czasu wszystko jest w porządku.

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));
Lawal
źródło
Prawdopodobnie się mylę, ale wydaje się, że ostatnia linijka nie przyniesie żadnego efektu. PageLoad to sam TimeSpan, a .Add on TimeSpan to czysta funkcja, która nie modyfikuje PageLoad, po prostu zwraca nowy TimeSpan, który jest odrzucany.
Jason Ritchie
3

W moim przypadku, typ Mój przycisk jest submitnie buttoni zmianę Clickdo Sumbitówczesnego każdego dobrego czynu. Coś jak poniżej,

z driver.FindElement(By.Id("btnLogin")).Click();

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

BTW, wypróbowałem wszystkie odpowiedzi w tym poście, ale nie działają dla mnie.

MichaelMao
źródło
3

Mam podobny problem. Spróbuj ustawić więcej czasu w konstruktorze sterownika - dodaj np.

var timespan = TimeSpan.FromMinutes(3);

var driver = new FirefoxDriver(binary, profile, timeSpan);
Bart Wojtala
źródło
Cześć, bewu, czy to byłoby w formacie takim jak poniżej? driver.Manage (). Timeouts (). ImplicitlyWait (TimeSpan.FromSeconds (5));
Nathan
4
Nie, nie to czekanie ImplicitlyWait wiąże się ze znajdowaniem elementów. Musisz zmienić domyślny (60 sekund) limit czasu sterownika, kiedy oczekuje na kontynuację żądania (jeśli się nie mylę). W każdym razie musisz znaleźć linię, w której ustawiasz konstruktor sterownika FF i dodajesz tam więcej atrybutów lub zmieniasz limit czasu. Coś jak:driver = new FirefoxDriver(new FirefoxBinary(), new FirefoxProfile(path to your profile), TimeSpan.FromMinutes(3));
Bart Wojtala
2
dla ChromeDriver wyglądałoby to takdriver = new ChromeDriver(service, chromeDriverOptions, TimeSpan.FromMinutes(3));
redwards510
2

Myślę, że ten problem występuje, gdy próbujesz uzyskać dostęp do obiektu sterownika sieciowego po

1) okno zostało zamknięte, a Ty nie przełączyłeś się na rodzica

2) przełączyłeś się na okno, które nie było jeszcze gotowe i zostało zaktualizowane od czasu przełączenia

czekanie, windowhandles.countaż będzie to, czego się spodziewasz, nie bierze pod uwagę zawartości strony ani document.ready. Wciąż szukam rozwiązania tego problemu

wstążka
źródło
2

W moim przypadku to dlatego, że usunąłem folder aktualizacji chrome. Po ponownej instalacji chrome działa dobrze.

gary.zhang
źródło
1

Problem polega na tym, że ocena limitów Click()czasu w środowisku kompilacji ... możesz chcieć zagłębić się w to, co się dzieje Click().

Spróbuj także dodać Retrys, Click()ponieważ czasami oceny zajmują więcej czasu w zależności od szybkości sieci itp

kawałek
źródło
Cześć, opcja ponowienia nie zadziała, ponieważ przeglądarka po prostu się blokuje. Dopiero zatrzymanie testu umożliwia kontynuację przeglądarki.
Nathan
1

W moim przypadku znalazłem ten błąd na serwerze kompilacji naszych zespołów. Testy zadziałały na naszych lokalnych maszynach deweloperskich.

Problem polegał na tym, że docelowa witryna internetowa nie była poprawnie skonfigurowana na serwerze kompilacji, więc nie mogła poprawnie otworzyć przeglądarki.

Używaliśmy sterownika Chrome, ale nie jestem pewien, czy to ma znaczenie.

Sean Tomlins
źródło
1

W moim przypadku problem dotyczył SendKeys () i Pulpitu zdalnego . Publikowanie obejścia, które mam do tej pory:

Miałem test Selenium, który zakończył się niepowodzeniem po uruchomieniu jako część zadania Jenkinsa na węźle hostowanym w vSphere i administrowanym przez RDP. Po kilku rozwiązaniach okazało się, że powiedzie się, jeśli Pulpit zdalny jest podłączony i skoncentrowany, ale kończy się niepowodzeniem z wyjątkiem odłączenia lub nawet zminimalizowania Pulpitu zdalnego.

Aby obejść ten problem, zalogowałem się przez vSphere Console zamiast RDP i nawet po zamknięciu vSphere test już nie zawiódł. Jest to obejście, ale musiałbym uważać, aby nigdy nie logować się przez RDP i zawsze administrować tylko za pośrednictwem konsoli vSphere.

sashoalm
źródło
0

zmiana Selenium.WebDriver.ChromeDriver z 2.40.0 na 2.27.0 jest dla mnie w porządku

john liao
źródło
0

new FirefoxDriver(binary, profile, timeSpan)Był przestarzały.

Możesz teraz użyć new FirefoxDriver(FirefoxDriverService.CreateDefaultService(), FirefoxOptions options, TimeSpan commandTimeout)zamiast tego.

Jest też new FirefoxDriver(string geckoDriverDirectory, FirefoxOptions options, TimeSpan commandTimeout)i działa. Ale to nie jest udokumentowane i musisz ręcznie określić, geckoDriverDirectorynawet jeśli jest już w Path.

imba-tjd
źródło
0

Mieliśmy ten sam problem. W naszym przypadku przeglądarka została zablokowana przez wyskakujące okienko logowania (uwierzytelnianie Windows), więc nie wracało po 60 sekundach. Dodanie odpowiednich praw dostępu do konta Windows, na którym Chrome działał, rozwiązało problem.

Rogier van het Schip
źródło
0

Arrrgh! Zmierzyłem się z tym dzisiaj na macOS, a problem był tak prosty - wyskakujące okienko sugerujące zainstalowanie nowej wersji Appium było wyświetlane na zdalnym serwerze kompilacji CI.

Po prostu VNC i kliknięcie „ Zainstaluj później ” naprawiło to.

RAM237
źródło
0

W moim przypadku żadna z powyższych odpowiedzi nie rozwiązała całkowicie mojego problemu. Skończyło się na tym, że korzystałem z no-sandboxtrybu ( ), połączenia z wydłużonym limitem czasu ( driver = new RemoteWebDriver(new Uri("http://localhost:4444/wd/hub"), capability, TimeSpan.FromMinutes(3));) i limitu czasu ładowania strony ( driver.Manage().Timeouts().PageLoad.Add(System.TimeSpan.FromSeconds(30));), więc teraz mój kod wygląda następująco:

    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));
    }

Ale jak wspomniałem, żadna z powyższych metod nie rozwiązała mojego problemu, ciągle otrzymywałem błąd, a wiele procesów chromedriver.exe i chrome.exe było aktywnych (~ 10 z chromedriver i ~ 50 z chrome).

Czyli gdzieś wyczytałem, że po pozbyciu się sterownika powinienem odczekać kilka sekund przed rozpoczęciem kolejnego testu, więc dodałem następującą linijkę do metody dispose:

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

Dzięki tej modyfikacji trybu uśpienia nie pojawia się już błąd przekroczenia limitu czasu i nie ma niepotrzebnie otwieranych procesów chromedriver.exe i chrome.exe.

Mam nadzieję, że pomogłem komuś, kto boryka się z tym problemem tak długo, jak ja.

turanszkik
źródło
0

Miałem ten sam wyjątek, gdy próbowałem uruchomić bezgłowy sterownik ChromeDriver z zaplanowanym zadaniem na serwerze Windows (nienadzorowany). Rozwiązaniem dla mnie było uruchomienie zadania jako użytkownik „ Administratorzy ” (zwróć uwagę na S na końcu). To co też zrobiłem (nie wiem czy to istotne) to zaznaczenie "Dowolne połączenie" z zakładki zadania "Warunki".

SubqueryCrunch
źródło
-1

W przypadku ChromDriver poniżej działało dla mnie:

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

Selenium w wersji 3.11, ChromeDriver 2.37

R2D2
źródło