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.
Odpowiedzi:
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.
źródło
var options = new ChromeOptions(); options.AddArgument("--no-sandbox");
działa teraz w C # wersji Webdriver 3.14.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.
źródło
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ź :
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ć, maonclick
atrybut, który zawiera JavaScript, rozważ użycie JavascriptExecutor do bezpośredniego wykonania tego kodu, zamiast wywoływaniaclick()
polecenia. Zauważyłem, żeonclick
bezpośrednie wykonanie skryptu JavaScript pozwala niektórym z moich testów przejść.źródło
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));
źródło
W moim przypadku, typ Mój przycisk jest
submit
niebutton
i zmianęClick
doSumbit
ó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.
źródło
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);
źródło
driver = new FirefoxDriver(new FirefoxBinary(), new FirefoxProfile(path to your profile), TimeSpan.FromMinutes(3));
driver = new ChromeDriver(service, chromeDriverOptions, TimeSpan.FromMinutes(3));
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.count
aż będzie to, czego się spodziewasz, nie bierze pod uwagę zawartości strony ani document.ready. Wciąż szukam rozwiązania tego problemuźródło
W moim przypadku to dlatego, że usunąłem folder aktualizacji chrome. Po ponownej instalacji chrome działa dobrze.
źródło
Problem polega na tym, że ocena limitów
Click()
czasu w środowisku kompilacji ... możesz chcieć zagłębić się w to, co się dziejeClick()
.Spróbuj także dodać Retrys,
Click()
ponieważ czasami oceny zajmują więcej czasu w zależności od szybkości sieci itpźródło
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.
źródło
W moim przypadku problem dotyczył SendKeys () i Pulpitu zdalnego . Publikowanie obejścia, które mam do tej pory:
źródło
zmiana Selenium.WebDriver.ChromeDriver z 2.40.0 na 2.27.0 jest dla mnie w porządku
źródło
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ć,geckoDriverDirectory
nawet jeśli jest już wPath
.źródło
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.
źródło
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.
źródło
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-sandbox
trybu ( ), 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.
źródło
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".
źródło
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
źródło