it-swarm.com.de

Selenium WebDriver löst sporadisch Timeout-Ausnahmen aus

Verwendung von Selenium für Ui-Tests in unserem Projekt. Wir verwenden die neueste Version 2.30.0 . Wir verwenden Firefox WebDriver und Firefox 19.0.

Allgemein gesagt, der UI-Test funktioniert lokal und sogar serverseitig, wenn ich den UI-Test in Visual Studio ausführen. Unsere UI-Tests werden sofort auf unserem Build-Server ausgeführt. Es verwendet dieselbe Bereitstellung auf demselben Server, den ich manuell über Visual Studio teste.

Sporadisch stoßen wir jedoch auf folgendes Problem, wenn der UI-Test auf Buildserver ausgeführt wird: 

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)

Grundsätzlich klickt der Test auf eine Upload-Schaltfläche, bei der das Eingabefeld zuvor mit einer Datei gefüllt wurde. Da die Datei sehr klein ist, wird dies in wenigen Sekunden erledigt. Trotzdem wird manchmal ein Timeout von 60 Sekunden erreicht.

Irgendwelche Ideen, wie man das zugrunde liegende Problem isolieren kann? Oder führen Sie schon einmal jemanden in dieselbe Ausgabe ein? Irgendwelche Hinweise gewürdigt. Vielen Dank.

36
dasheddot

Ich habe den gleichen Fehler erhalten: .NET WebDriver: 2.37, FF: 25.0.1. Ich bemerkte, dass Firefox bis zum Beenden meiner Testanwendung blockiert war. Daher baute ich die Debug-Version von Firefox und stellte fest, dass das Sperren beim Schreiben an stderr vorlag. Dies gab mir den Hinweis, den Web-Treiber-Code so zu ändern, dass Standard und Fehler nicht mehr umgeleitet werden und das Problem dadurch gelöst wurde. Es scheint, dass der WebDriver den std-Fehler auf irgendeine Weise blockiert. Von MSDN:

Synchrone Leseoperationen führen zu einer Abhängigkeit zwischen dem Aufrufer Lesen aus dem StandardError-Stream und Schreiben des untergeordneten Prozesses in dieser Strom Diese Abhängigkeiten können Deadlock-Bedingungen verursachen ...

Mehr Infos hier .

Für jeden, der den gleichen Tweak machen möchte, habe ich: -

  1. Besorgen Sie sich die Selenquelle. Dann checken Sie den gleichen Code-Zweig aus, den Sie verwenden. 

  2. In FireFoxBinary.cs: 

    ich. Wo immer Sie RedirectStandardError = true finden, wechseln Sie zu RedirectStandardError = false.

    ii. Wo immer Sie RedirectStandardOutput = true finden, wechseln Sie zu RedirectStandardOutput = false. (für Nicht-Windows gibt es auch eine in Executable.cs)

    iii. Ändern Sie in ConsoleOuput "return this.stream.ReadToEnd ()" in "return" "".

  3. Erstellen Sie und ersetzen Sie WebDriver.dll durch Ihre.

Haftungsausschluss: Das hat für mich funktioniert, aber Ihr Thema könnte anders sein. Soweit ich das beurteilen kann, hat dies keine nachteiligen Auswirkungen außer der Deaktivierung der Konsolenausgabe, es können jedoch andere Nebenwirkungen auftreten, die mir nicht bewusst sind. 

Ich würde gerne wissen, ob jemand anderes das Gleiche findet. 

Da ich mein Problem gelöst habe, werde ich nicht tiefer graben. Wenn ein Mitglied der Selenium-Gruppe mehr Info/Logs/Tweaks möchte, würde ich das gerne tun. 

Hoffentlich wird dies bald behoben. 

Update

Es scheint, dass Firefox v25 derzeit nicht unterstützt wird. Siehe diesen Kommentar

Update 25. Februar 2014

Siehe dieses Update

Okay, dieses Problem manifestiert sich im Allgemeinen nicht im IE oder so scheint aus den Kommentaren. Ich möchte, dass die Leute es mit Firefox und .__ versuchen. Chrome und die .NET-Bindungen 2.40.0 (wird die nächste Version zum Zeitpunkt dieses Schreibens sein) oder später, und prüfen, ob dies noch geschieht.

Ich habe seit 2.35.0 weniger Berichte darüber in Chrome gesehen, daher habe ich müssen Sie wissen, ob dies immer noch ein Problem mit den .NET-Bindungen und einem .__ ist. kürzlich chromedriver.exe.

2.40.0 enthält möglicherweise ein Update für mindestens eines der Probleme, das dies in Firefox verursachen kann.

Dies hat das Problem für mich gelöst. Wenn Sie das Änderungsprotokoll betrachten, gibt es ab dem 31.01.2014 ein Commit, um die Umleitung der Konsolenprotokollierung zu entfernen: 

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

Welches ist die Problemumgehung, die ich hier verwendet habe. Alles macht also Sinn.

8
acarlon

Ist mir in vier verschiedenen Szenarien passiert:

  1. Die Ursache war, dass das von mir abgefragte Fenster-Handle bereits geschlossen war oder sich in einem geschlossenen Stadium befand. In diesem Fall sollten Sie überprüfen, ob das Fenster noch vorhanden ist, bevor Sie es abfragen. Wenn Sie das lange Zeitlimit von 60 Sekunden vermeiden möchten, sollten Sie die Art und Weise, wie Sie die Firefox-Instanz erstellen, ändern, um die Verzögerung von 60 Sekunden zu verringern:

    neuer FirefoxDriver ("FfBinaryPath", FfProfileInstance, TimeSpan.FromSeconds (5));

  2. Ursache war das Flash-Plugin 'Protected Mode'. Dieses Szenario passierte mir nur unter Windows 7 und 8, als sie unter Jenkins Job liefen, das Timeout trat nicht sporadisch auf. Um das Problem zu beheben, habe ich meine Firefox-Selenium-Instanz mit deaktiviertem Flash-Sicherheitsmodus ausgeführt:

    FfProfile.SetPreference ("dom.ipc.plugins.flash.disable-protected-mode", true);

  3. Eine andere Ursache, auch nicht sporadisch, unter Jenkins und im Zusammenhang mit Flash, trat bei der Verwendung von Firefox Version 45 auf. Um dieses Problem zu beheben, musste ich ein Downgrade auf Version 44 durchführen oder Flash alternativ deinstallieren.

  4. Interner Browser-Grund: Manchmal benötigt der Browser mehr als eine Minute, um auf Selenium-Anrufe zu reagieren. In diesem Fall können Sie das Problem beheben, indem Sie das Zeitlimit für den Browserbefehl auf über 60 Sekunden einstellen. zum Beispiel:

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

6
Nir

Ich hatte den gleichen Fehler beim Zeitlimit. Ich habe den IEDriverServer (64bit) verwendet und bei langen sendKey-Befehlen würde es zu einem Timeout kommen. 

Der Grund ist, dass das Standard-Timeout scheinbar 60 Sekunden beträgt. 

Mein Problem wurde behoben: Ich habe den Treiber mit einer Methode instanziiert, mit der Sie am Speicherort des IEDriverServers die Optionen für den Treiber UND den Timeoutwert eingeben können.

Link zur Dokumentation: http://seleniumhq.github.io/Selenium/docs/api/dotnet/

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

Parameter 

  1. InternetExplorerDriverServerDirectory:
    • Geben Sie Folgendes ein: System.String
    • Der vollständige Pfad zu dem Verzeichnis, das IEDriverServer.exe enthält
  2. Optionen
    • Geben Sie Folgendes ein: OpenQA.Selenium.IE.InternetExplorerOptions
    • Die für die Initialisierung des Treibers verwendeten InternetExplorerOptions
  3. commandTimeout
    • Geben Sie Folgendes ein: System.TimeSpan
    • Die maximale Wartezeit für jeden Befehl

Mein Code

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

In meinem Fall ist die Seite einfach nicht vollständig geladen. Einige Facebook-Plugins scheinen zu lange zu laden. Ich habe versucht, die Ausnahme einzufangen und den unvollständigen Dom zu manipulieren, aber dies brachte mir keine Ergebnisse. :(

John

3
Iwan1993

Ich hatte das gleiche Problem, aber nur für Firefox-Treiber. Es stellte sich heraus, dass dies möglicherweise mit der Treiber-Navigate-Methode zusammenhängt und sie versucht, zu schnell mit der Seite zu interagieren. Wenn Sie den folgenden Code aufrufen, beheben Sie ihn für Navigate (ich empfehle ihn auch vor FindElement zu verwenden):

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)!");
    }
}
1
Rain9333

Bei unserem Projekt waren wir mit einem ähnlichen Problem konfrontiert. Das Problem hatte nichts mit Selenium oder unserer App zu tun. Es war eine Zeitüberschreitung, da die Build-Server-Konfiguration für dieses Projekt in 5 Minuten abgelaufen sein sollte. Aber alle unsere Tests wurden nicht innerhalb von 5 Minuten abgeschlossen. Daher schlug der Build aufgrund von zufälligen Timeout-Problemen fehl.

Auch wir hatten ein Problem mit Firefox-19, die Tests fielen zufällig aus. Irgendwie funktionierte Firefox-10 nur für unsere Selenium-Tests.

1
Infant Dev

Versuchen Sie diesen Code: 

  DesiredCapabilities caps = DesiredCapabilities.Firefox();   

 //set the timeout to 120 seconds
 IWebDriver driver = new RemoteWebDriver(new Uri("<app_url>"), caps, TimeSpan.FromSeconds(120));
1
9ikhan
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);
        }
    }

Wir verwenden dies, um solche nicht gefundenen Fehler zu verhindern und es wirkt wie ein Zauber.

Es gibt auch eine andere Version, wenn das Element vorhanden sein kann, aber nicht sichtbar sein muss.

Verwenden Sie einfach ExpectedConditions.ElementExists(selector) anstelle von ExpectedContitions.ElementIsVisible(selector)

edit: Browser.Instance.Driver ist eine Klasse, die den instanzierten Treiber enthält

0