2013-03-07 14 views
36

Używanie selenu do testów ui w naszym projekcie. Używamy najnowszej wersji 2.30.0. Używamy przeglądarki Firefox WebDriver i używamy przeglądarki Firefox 19.0.Selenium WebDriver sporadycznie rzuca wyjątki Timeout

Ogólnie mówiąc, test ui działa lokalnie, a nawet po stronie serwera, gdy uruchamiam test ui w Visual Studio. Nasze testy ui są wykonywane nigdzie na naszym serwerze kompilacji. Korzysta z tego samego wdrożenia na tym samym serwerze, który testuję ręcznie za pomocą programu Visual Studio.

Ale sporadycznie możemy uruchomić w następnym numerze, gdy test ui pobiera wykonywane na buildserver:

Test(s) failed. OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL http://localhost:7056/hub/session/bed1d0e7-efdc-46b6-ba07-34903519c44d/element/%7B8717bb19-96c7-44d3-b0ee-d4b989ae652d%7D/click timed out after 60 seconds. 
     ----> System.Net.WebException : The operation has timed out 
     at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request) 
     at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters) 
--WebException 
    at System.Net.HttpWebRequest.GetResponse() 
    at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request) 

zasadzie kliknięcia testowe na przycisk wysyłania gdzie pole wejście zostało wypełnione pliku wcześniej. Ponieważ plik jest bardzo mały, robi się to za kilka sekund. Czasami czasami osiąga się czas 60 sekund.

Jakieś pomysły, jak wyizolować podstawowy problem? Czy może już wcześniej wpaść do tego samego problemu? Wszelkie wskazówki są mile widziane. Dzięki.

+0

Jaką przeglądarkę i jaką wersję tej przeglądarki? – Arran

+0

@Arran Dzięki za podpowiedź. Zaktualizowano pytanie. – dasheddot

+0

Po prostu ciekawy, czy stało się to bardziej od czasu aktualizacji do FF 19? – Arran

Odpowiedz

2

W moim przypadku strona po prostu nie jest w pełni załadowana. Niektóre wtyczki Facebooka wydają się ładować zbyt długo. Próbowałem uchwycić wyjątek i manipulować niepełną domeną, ale to nie dało mi żadnych rezultatów. :(

John

1

W obliczu podobnego problemu w naszym projekcie. Problemem nie miał nic wspólnego z selenem lub naszej aplikacji. Został rozrządu, bo config server build dla tego projektu miała Timeout w 5 Jednak wszystkie nasze testy nie zostały zakończone w ciągu 5 minut, dlatego kompilacja nie działa losowo z powodu problemów z przekroczeniem limitu czasu:

Wystąpił również problem z firefox-19, testy użyte do niepowodzenia losowego. 10 działało tylko dla naszych testów selenu

1

Spróbuj tego kodu:

DesiredCapabilities caps = DesiredCapabilities.Firefox(); 

//set the timeout to 120 seconds 
IWebDriver driver = new RemoteWebDriver(new Uri("<app_url>"), caps, TimeSpan.FromSeconds(120)); 
+0

Dzięki za podpowiedź, spróbuję. – dasheddot

8

Wystąpił ten sam błąd: .NET WebDriver: 2.37, FF: 25.0.1. Zauważyłem, że Firefox blokował się, dopóki nie opuściłem mojej aplikacji testowej, więc zbudowałem wersję debugową Firefoksa i odkryłem, że blokowanie nastąpiło, gdy piszę na stderr. To dało mi klucz do zmiany kodu webdrivera, aby nie przekierowywał już standardowego wyjścia i błędu, co rozwiązało mój problem. Wygląda na to, że WebDriver blokuje w jakiś sposób błąd standardowy. Z MSDN:

Synchronous read operations introduce a dependency between the caller reading from the StandardError stream and the child process writing to that stream. These dependencies can cause deadlock conditions...

Więcej informacji here.

Dla każdego, kto chce popełnić tego samego uszczypnąć robiłam: -

  1. Pobierz źródło selenu. Następnie sprawdź ten sam oddział kodu, z którego korzystasz.

  2. W FireFoxBinary.cs:

    ja. Gdziekolwiek znajdziesz RedirectStandardError = true, zmień na RedirectStandardError = false.

    ii. Gdziekolwiek znajdziesz RedirectStandardOutput = true, zmień na RedirectStandardOutput = false. (w przypadku systemu innego niż Windows istnieje również jeden w pliku wykonywalnym.cs)

    iii. W ConsoleOuput zmień 'return this.stream.ReadToEnd()', na 'return' '' '

  3. Utwórz i zastąp plik WebDriver.dll swoim.

Zastrzeżenie: To zadziałało, ale Twój problem może być inny. Ponadto, o ile mogę powiedzieć, nie ma to żadnych negatywnych skutków poza wyłączaniem wyjścia konsoli, ale mogą istnieć inne efekty uboczne, których nie jestem świadomy.

Chciałbym wiedzieć, czy ktoś inny znajdzie to samo.

Odkąd rozwiązałem mój problem, nie będę kopać głębiej. Jeśli ktokolwiek członek grupy Selenium chce więcej informacji/logów/poprawek, byłbym szczęśliwy, gdyby to zrobił.

Mam nadzieję, że wkrótce zostanie to naprawione.

Aktualizacja

Wydaje się, że Firefox V25 nie jest obecnie obsługiwana. Zobacz this comment.

Aktualizacja 25-szy Lut 2014

Zobacz this update:

Okay, this issue in general does not manifest itself in IE, or so it seems from the comments. I'd like people to try with Firefox and Chrome, and the .NET bindings 2.40.0 (will be the next release at the time of this writing) or later, and see if this is still happening.

I've seen fewer reports of this happening in Chrome since 2.35.0, so I need to know if this is still an issue with the .NET bindings and a recent chromedriver.exe.

2.40.0 may have a fix for at least one of the issues that may cause this in Firefox.

To rozwiązało problem dla mnie. Patrząc na dzienniku zmian, jest popełnić od 1/31/2014 do usunięcia rejestrowania konsola przekierowanie:

"No longer redirecting console output for Firefox in .NET bindings." 

który jest obejście użyłem tutaj. Wszystko to ma sens.

+0

W Selenium.2.43.1 nie ma parametru o nazwie RedirectStandardError w FireFoxBinary.cs. Otrzymuję ten sam błąd w Firefoksie 32 na moim serwerze kompilacji ... – demokritos

+0

@demokritos - zgodnie z ostatnią aktualizacją poprawka została umieszczona w wersji 2.40.0 i nowszej, aby usunąć przekierowanie. Problem, który pojawił się, może być spowodowany innym problemem. – acarlon

5

zdarzyło mi się w czterech różnych scenariuszy:

  1. Przyczyną było to, że uchwyt okna byłem zapytań było już zamknięte lub etapami zamknięcia. W takim przypadku lepiej sprawdzić, czy okno nadal istnieje przed wysłaniem zapytania. Jeśli chcesz uniknąć długiej limit czasu 60 sekund, należy zmienić sposób utworzyć instancję Firefox, aby zmniejszyć opóźnienie 60 sekund:

    nowy FirefoxDriver („FfBinaryPath” FfProfileInstance, TimeSpan.FromSeconds (5));

  2. Przyczyną była wtyczka Flash 'Protected Mode'. Ten scenariusz zdarzył mi się tylko w Windows 7 i 8, gdy pracowali pod Jenkinsem, czas nie występował sporadycznie. Aby go naprawić, Pobiegłem Firefox instancji selenu w trybie bezpieczeństwa błysk niepełnosprawnych:

    FfProfile.SetPreference („dom.ipc.plugins.flash.disable-trybu chronionego”, true);

  3. Inna przyczyna, także nie sporadyczna, pod Jenkinsem i związana z Flashiem, wystąpiła podczas używania Firefoksa w wersji 45. Aby rozwiązać ten problem, musiałem przejść na wersję 44 lub odinstalować Flasha.

  4. Powód przeglądarki wewnętrznej: Czasami przeglądarka potrzebuje więcej niż minutę, aby zareagować na połączenia Selenium. W takim przypadku ustawienie czasu oczekiwania przeglądarki powyżej 60 sekund może rozwiązać problem. na przykład:

    new FirefoxDriver("FfBinaryPath", FfProfileInstance, TimeSpan.FromMinutes(3));

0
public static IWebElement WaitForElementVisible(By selector, uint timeout = Config.DefaultTimeoutSec) 
    { 
     IWebDriver driver = Browser.Instance.Driver; 

     if (timeout > 0) 
     { 
      WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout)); 

      wait.Until(ExpectedConditions.ElementIsVisible(selector)); 
      return driver.FindElement(selector); 
     } 
     else 
     { 
      // Search for element without timeout 
      return driver.FindElement(selector); 
     } 
    } 

Używamy tego celu zapobieżenia taki element nie znaleziono awarie i działa jak czar.

Istnieje również inna wersja, jeśli element może tam być, ale nie musi być widoczny.

Wystarczy użyć ExpectedConditions.ElementExists(selector) zamiast ExpectedContitions.ElementIsVisible(selector)

edit: Browser.Instance.Driver jest klasa zawierająca instancja sterownika

2

Miałem ten sam błąd z limitu czasu. Używałem IEDriverServer (64-bitowego), a przy długich poleceniach sendKey upłynął limit czasu.

Powodem jest to, że domyślny limit czasu wynosi 60 sekund.

Naprawiono problem polegający na tym, że zainicjowałem sterownik za pomocą metody umożliwiającej wprowadzenie położenia serwera IEDriverServer, opcji sterownika i wartości limitu czasu.

Link do dokumentacji: http://seleniumhq.github.io/selenium/docs/api/dotnet/

public InternetExplorerDriver(
    string internetExplorerDriverServerDirectory, 
    InternetExplorerOptions options, 
    TimeSpan commandTimeout 
) 

Parametry

  1. InternetExplorerDriverServerDirectory:
    • Typ: System.String
    • pełną ścieżkę do katalogu zawierającego IEDriverServer.exe
  2. opcje
    • Typ: OpenQA.Selenium.IE.InternetExplorerOptions
    • The InternetExplorerOptions używany do inicjacji kierowcy
  3. commandTimeout
    • Typ: System.TimeSpan
    • Maksymalny czas oczekiwania na każdym poleceniu

Mój kod

InternetExplorerOptions options = new InternetExplorerOptions(); 
     IWebDriver driver = new InternetExplorerDriver("C:/Users/jeff/AppData/Local/Microsoft/WindowsApps", options, TimeSpan.FromSeconds(120)); 
+0

Co to jest IEDriverServer.exe btw i gdzie możemy go pobrać? Ale w moim przypadku jest Firefox. Dzięki –

1

miałem ten sam problem, jak dobrze, ale tylko na Firefox kierowca.Okazuje się, że może się to wiązać z korzystaniem ze sterownika Nawiguj metodą i próbuje zbyt szybko wchodzić w interakcje ze stroną. Wywołanie poniżej kodu naprawię go w Navigate (polecam również użyć go przed FindElement):

public void VerifyPageIsLoaded() 
{ 
    var pageLoaded = false; 

    for (var i = 0; i < DefaultTimeout.Timeout.Seconds; i++) 
    { 
     Thread.Sleep(1000); 

     if (WebDriver.ExecuteJavaScript<string>("return document.readyState").Equals("complete")) 
     //jQuery.active might cause problems on some browser or browserstack so I commented it out 
     //&& WebDriver.ExecuteJavaScript<bool>("return jQuery.active == 0").Equals(true)) 
     { 
      pageLoaded = true; 
      break; 
     } 

     Thread.Sleep(1000); 
    } 

    if (!pageLoaded) 
    { 
     throw new Exception("Page was not with complete state)!"); 
    } 
} 
Powiązane problemy