web-dev-qa-db-fra.com

Selenium WebDriver lève les exceptions de délai d'expiration de manière sporadique

Utilisation de Selenium pour les tests d’interface utilisateur sur notre projet. Nous utilisons la dernière version 2.30.0 . Nous utilisons Firefox WebDriver et exécutons Firefox 19.0.

En règle générale, le test de l'interface utilisateur fonctionne au niveau local et même du serveur lorsque j'exécute le test de l'interface utilisateur dans Visual Studio. Nos tests d’interface utilisateur sont exécutés de manière proche sur notre serveur de compilation. Il utilise le même déploiement sur le même serveur que j'ai testé manuellement via Visual Studio.

Mais sporadiquement, nous rencontrons le problème suivant lorsque le test de l'interface utilisateur est exécuté sur le serveur de génération: 

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)

Fondamentalement, le test clique sur un bouton de téléchargement où le champ de saisie a déjà été rempli avec un fichier. Comme le fichier est très petit, cela se fait en quelques secondes ..__ Néanmoins, le délai d'attente de 60 secondes est parfois atteint.

Des idées pour isoler le problème sous-jacent? Ou est-ce que vous avez déjà rencontré le même problème avant?? .Un indice apprécié. Merci.

36
dasheddot

J'ai la même erreur: .NET WebDriver: 2.37, FF: 25.0.1. J'ai remarqué que Firefox était en train de se verrouiller jusqu'à ce que je quitte mon application de test. J'ai donc construit la version de débogage de Firefox et constaté que le verrouillage s'était produit au moment où il écrivait dans stderr. Cela m’a donné l’idée de changer le code de WebDriver afin qu’il ne redirige plus les erreurs standard et les erreurs, ce qui a résolu mon problème. Il semble que WebDriver bloque d’une manière ou d’une autre l’erreur std. De MSDN:

Les opérations de lecture synchrone introduisent une dépendance entre l'appelant lecture à partir du flux StandardError et du processus enfant écrivant dans ce flux. Ces dépendances peuvent provoquer des conditions de blocage ...

Plus d'infos ici .

Pour ceux qui veulent faire le même Tweak, j'ai fait: -

  1. Obtenez la source de sélénium. Ensuite, vérifiez la même branche de code que vous utilisez. 

  2. Dans FireFoxBinary.cs: 

    je. Où que vous trouviez RedirectStandardError = true, changez pour RedirectStandardError = false.

    ii. Où que vous trouviez RedirectStandardOutput = true, changez pour RedirectStandardOutput = false. (pour les non-Windows, il en existe aussi un dans Executable.cs)

    iii. Dans ConsoleOuput, remplacez 'return this.stream.ReadToEnd ()' par 'return ""'

  3. Construisez et remplacez WebDriver.dll par le vôtre.

Avertissement: Cela a fonctionné pour moi, mais votre problème pourrait être différent. Aussi, autant que je sache, cela n’a pas d’effets néfastes autres que la désactivation de la sortie de la console, mais il peut y avoir d’autres effets secondaires que je ne connais pas. 

Je serais intéressé de savoir si quelqu'un d'autre trouve la même chose. 

Depuis que j'ai résolu mon problème, je ne vais pas creuser davantage. Si quelqu'un d'un membre du groupe Selenium veut plus d'informations/journaux/modifications, je serais heureux de le faire. 

Espérons que cela sera bientôt résolu. 

Mettre à jour

Il semble que Firefox v25 ne soit actuellement pas pris en charge. Voir ce commentaire

Mise à jour du 25 février 2014

Voir cette mise à jour

D'accord, cette question en général ne se manifeste pas dans IE, ou du moins semble des commentaires. J'aimerais que les gens essayent avec Firefox et Chrome et les liaisons .NET 2.40.0 (sera la prochaine version au moment de la rédaction de cet article) ou une version ultérieure, et vérifiez si cela se produit toujours.

Depuis la version 2.35.0, moins de rapports font état de ce phénomène dans Chrome, donc je besoin de savoir s’il ya toujours un problème avec les liaisons .NET et un chromedriver.exe récent.

2.40.0 peut avoir un correctif pour au moins un des problèmes pouvant être à l'origine de ce problème dans Firefox.

Cela a résolu le problème pour moi. Dans le journal des modifications, il existe un commit du 31/01/2014 pour supprimer la redirection de journalisation de la console: 

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

Quelle est la solution de contournement que j'ai utilisé ici. Donc, tout a du sens.

8
acarlon

J'ai eu la même erreur avec le chronométrage. J'utilisais le serveur IEDriverServer (64 bits) et les commandes sendKey longues expiraient. 

La raison en est que le délai d'attente par défaut semble être de 60 secondes. 

Ce qui a résolu mon problème, c'est que j'ai instancié le pilote avec une méthode vous permettant de saisir l'emplacement du serveur IEDriverServer, les options du pilote ET la valeur du délai d'attente.

Lien vers la documentation: http://seleniumhq.github.io/Selenium/docs/api/dotnet/

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

Paramètres 

  1. InternetExplorerDriverServerDirectory:
    • Type: System.String
    • Le chemin complet du répertoire contenant IEDriverServer.exe
  2. options
    • Type: OpenQA.Selenium.IE.InternetExplorerOptions
    • InternetExplorerOptions utilisé pour initialiser le pilote
  3. commandTimeout
    • Type: System.TimeSpan
    • La durée maximale d'attente pour chaque commande

Mon code

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

Dans mon cas, la page n'est tout simplement pas complètement chargée. Certains plugins facebook semblent charger trop longtemps. J'ai essayé de capturer l'exception et de manipuler le dom incomplet, mais cela ne m'a donné aucun résultat. :(

John

3
Iwan1993

J'ai eu le même problème aussi, mais seulement sur le pilote Firefox. Il se peut que cela soit lié à l'utilisation de la méthode du pilote et à une interaction trop rapide avec la page. Appeler le code ci-dessous corrige le problème pour moi dans Naviguer (je recommande également de l'utiliser avant FindElement également):

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

Nous avons rencontré un problème similaire sur notre projet. Le problème n'avait rien à voir avec Selenium ou notre application. Le délai d'expiration était écoulé, car la configuration du serveur de génération de ce projet était censée expirer dans 5 minutes. Mais tous nos tests n’étaient pas terminés dans les 5 minutes, la construction échouait à cause de problèmes de timeout aléatoires.

De plus, nous avons eu un problème avec firefox-19, les tests échouaient habituellement de manière aléatoire. D'une certaine manière, firefox-10 n'a fonctionné que pour nos tests de sélénium.

1
Infant Dev

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

Nous l'utilisons pour éviter les défaillances de ce type Element et cela fonctionne comme un charme.

Il existe également une version différente si l'élément peut être présent, mais ne doit pas nécessairement être visible.

Il suffit d'utiliser ExpectedConditions.ElementExists(selector) au lieu de ExpectedContitions.ElementIsVisible(selector)

edit: Browser.Instance.Driver est une classe contenant le pilote instancié

0