Selenium WebDriver lance sporadiquement des exceptions de temporisation

Utilisation du sélénium pour les tests d'interface utilisateur sur notre projet. Nous exécutons la nouvelle version 2.30.0. Nous utilisons Firefox WebDriver et exécutons Firefox 19.0.

généralement dit le test d'ui fonctionne côté local et même côté serveur quand j'exécute le test d'ui dans Visual Studio. Nos tests d'interface utilisateur sont exécutés nighlty sur notre serveur de construction. Il utilise le même déploiement sur le même serveur que je teste manuellement via Visual Studio.

mais nous rencontrons sporadiquement la question suivante lorsque le test d'interface utilisateur est exécuté sur 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)

essentiellement le test clique sur un bouton de téléchargement où le champ d'entrée a été rempli avec un fichier avant. Puisque le fichier est très faible cela se fait en quelques secondes. Néanmoins, le délai de 60 secondes est parfois atteint.

des idées pour isoler le problème sous-jacent? Ou d'exécuter quelqu'un à le même problème avant? Tous les indices sont appréciés. Grâce.

36
demandé sur dasheddot 2013-03-07 14:06:31

8 réponses

j'ai eu la même erreur: .NET WebDriver: 2.37, FF: 25.0.1. J'ai remarqué que Firefox était verrouillé jusqu'à ce que je sorte de mon application de test, donc j'ai construit la version de débogage de Firefox et j'ai trouvé que le lock-up s'est produit quand il écrivait à stderr. Cela m'a donné l'indice pour changer le code webdriver de sorte qu'il ne redirige plus standard out et erreur et cela a résolu mon problème. Il semble que le WebDriver bloque l'erreur std d'une manière ou d'une autre. À partir de MSDN:

synchrones les opérations de lecture introduisent une dépendance entre l'appelant lecture du flux StandardError et le processus de l'enfant ce cours d'eau. Ces dépendances peuvent causer des conditions d'impasse...

Plus d'info ici.

Pour tous ceux qui veulent faire la même tweak que j'ai fait: -

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

  2. In FireFoxBinary.cs:

    j'. Partout où vous les trouverez RedirectStandardError = true, passez à RedirectStandardError = false.

    ii. Partout où vous les trouverez RedirectStandardOutput = true, passez à RedirectStandardOutput = false. (pour les non-Windows, il y en a aussi un dans L'exécutable.cs)

    iii. Dans ConsoleOuput, le changement de " retour cette.flux.ReadToEnd ()', " renvoyer ""'

  3. construire et remplacer WebDriver.dll avec la vôtre.

Avertissement: Cela a fonctionné pour moi, mais votre question pourrait être différent. Aussi loin que je peux dire, c' n'a aucun effet indésirable autre 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.

depuis que j'ai résolu mon problème, je ne creuserai pas plus. Si quelqu'un d'un membre du groupe sélénium veut plus d'info / logs / tweaks je serais heureux de le faire.

espérons que cela sera réparé bientôt.

mise à Jour

Il semble que Firefox v25 n'est pas actuellement supporté. Voir commentaire.

mettre à Jour le 25 Février 2014

Voir cette mise à jour:

d'Accord, cette question en général ne se manifeste pas dans IE, ou alors il semble d'après les commentaires. J'aimerais que les gens essayent avec Firefox et Chrome, et les fixations .net 2.40.0 (seront la prochaine version temps de cette Écriture) ou plus tard, et voir si ce est encore happening.

J'ai vu moins de rapports de ce qui se passe dans Chrome depuis 2.35.0, donc je besoin de savoir si c'est toujours un problème avec les fixations .NET et un chromedriver récent.EXE.

2.40.0 peut avoir un correctif pour au moins un des problèmes qui peuvent causer cela dans Firefox.

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

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

Qui est la solution de contournement que j'ai utilisé ici. Donc, tout fait sens.

8
répondu acarlon 2014-02-26 21:51:54

m'est Arrivé dans les quatre scénarios:

  1. la cause en était que la poignée de fenêtre que j'interrogeais était déjà fermée ou en phase de fermeture. Si c'est le cas, il vaut mieux vérifier que la fenêtre encore exister avant l'interrogation. Si vous voulez éviter la longue période d'attente de 60 secondes, vous devriez changer la façon dont vous créez L'instance Firefox pour diminuer le délai de 60 secondes:

    nouveau conducteur de Firefox ("FfBinaryPath", FfProfileInstance, TimeSpan.Fromsecondes (5));

  2. la cause était le plugin flash 'Mode protégé'. Ce scénario m'est arrivé seulement sous windows 7 et 8 quand ils ont couru sous Jenkins job, le temps mort ne s'est pas produit sporadiquement. Afin de le corriger, J'ai lancé mon instance Firefox selenium avec le mode flash security désactivé:

    FfProfile.SetPreference ("dom.de la cib.greffon.Flash.désactiver-mode protégé", true);

  3. une autre cause, également Non sporadique, sous Jenkins et lié à Flash, est arrivé lors de L'utilisation de Firefox version 45. Afin de résoudre ce problème, j'ai dû passer à la version 44 ou désinstaller Flash.

  4. navigateur Interne raison: Parfois, le navigateur prend plus d'une minute pour réagir Sélénium appels. Dans ce cas, le réglage de la commande timeout du navigateur au-dessus de 60 secondes peut résoudre le problème. par exemple:

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

5
répondu Nir 2017-05-08 06:38:43

j'ai eu la même erreur avec le chronométrage. J'utilisais le IEDriverServer (64bit) et sur les longues commandes sendKey, il y avait un temps mort.

la raison étant que le délai par défaut semble être de 60 secondes.

ce qui a corrigé mon problème est que j'ai instancié le pilote avec une méthode qui vous permet d'entrer dans l'emplacement du serveur Iedriversers, les options pour le pilote et la valeur de timeout.

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

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

Paramètres

  1. Internetexplorerdriverserververdirectory:
    • Type: System.Chaîne
    • le chemin complet vers le répertoire contenant IEDriverServer.exe
  2. options
    • Type : OpenQA.Sélénium.IE.InternetExplorerOptions
    • Le InternetExplorerOptions utilisé pour initialiser le pilote
  3. commandTimeout
    • Type: System.TimeSpan
    • le temps maximum 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));
3
répondu tanz 2016-11-29 00:20:56

Dans mon cas, la page n'est tout simplement pas entièrement chargé. Certains plugin facebook semble se charger trop longtemps. J'ai essayé d'attraper l'exception et de manipuler le dom inachevé, mais cela ne m'a pas donné de résultats. : (

John

2
répondu Iwan1993 2013-07-16 13:45:35

nous avons fait face à un problème similaire sur notre projet. Le problème n'a rien à voir avec le sélénium ou notre application. C'était le chronométrage parce que la configuration du serveur de compilation pour ce projet était censée s'arrêter en 5 minutes. Mais tous nos tests n'étaient pas terminés en 5 minutes, donc la construction a échoué à cause de problèmes de temps d'arrêt au hasard.

nous avons également eu un problème avec firefox-19, les tests utilisés pour échouer au hasard. D'une façon ou d'une autre, firefox-10 n'a fonctionné que pour nos tests de sélénium.

1
répondu Infant Dev 2013-07-22 11:56:36

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
répondu 9ikhan 2013-09-06 11:23:56

j'ai eu le même problème, mais seulement sur Firefox pilote. Il s'avère que cela pourrait être lié au fait que vous utilisez la méthode de navigation du pilote et qu'il essaie d'interagir trop rapidement avec la page. L'appel de code ci-dessous aidez-moi à Naviguer (je recommande aussi à l'utiliser avant de FindElement en tant que bien):

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
répondu Rain9333 2017-03-17 15:12:52
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 prévenir un tel élément non trouvé échecs et il fonctionne comme un charme.

Il y a aussi une Version différente si l'Élément peut être, mais ne doit pas être visible.

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

modifier: navigateur.Instance.Le pilote est une classe contenant la instanciées pilote

0
répondu Dominik Lemberger 2016-03-03 12:59:30