8 votes

JavaScript peut-il parler à Selenium 2 ?

Je sais que je peux faire en sorte que le webdriver de Selenium 2 exécute JavaScript et obtienne des valeurs de retour, mais il se passe tellement de choses asynchrones que j'aimerais que JavaScript parle à Selenium plutôt que l'inverse. J'ai fait quelques recherches et je n'ai rien trouvé de tel. Est-ce que les gens utilisent généralement implicitly_wait ? Cela semble voué à l'échec puisqu'il n'est pas possible de tout chronométrer ? Un exemple parfait serait de faire savoir à Selenium quand un XHR s'est terminé ou une animation asynchrone avec un temps d'exécution indéterminé.

Est-ce possible ? Nous utilisons Selenium 2 avec Python sur Saucelabs.

8voto

JimEvans Points 9709

Vous devriez examiner la méthode execute_async_script() (JavascriptExecutor.executeAsyncScript en Java, IJavaScriptExecutor.ExecuteAsyncScript() en .NET), qui vous permet d'attendre une fonction de rappel. La fonction de rappel est automatiquement ajoutée à la méthode arguments dans votre fonction JavaScript. Donc, en supposant que vous avez déjà une fonction JavaScript sur la page qui attend jusqu'à la condition que vous voulez, vous pourriez faire quelque chose comme ce qui suit (le code Java ci-dessous, le code C# et Python devrait être similaire) :

String script = "var callback = arguments[arguments.length - 1];"
    + "callback(myJavaScriptFunctionThatWaitsUntilReady());";

driver.manage().timeouts().setScriptTimeout(15, TimeUnit.SECONDS);
((JavascriptExecutor)driver).executeAsyncScript(script);

Il est possible d'être encore plus astucieux et de passer la fonction de rappel directement à un événement qui renvoie les données appropriées. Vous pouvez trouver plus d'informations sur la fonction executeAsyncScript() dans le projet JavaDocs Vous pouvez trouver un exemple de code pour cela dans l'arbre source du projet. Il existe un excellent exemple d'attente de la fin d'un XHR dans les tests de la page ce fichier .

Si cela n'est pas encore disponible dans la version des liaisons Python disponibles pour SauceLabs, je m'attends à ce que cela soit disponible d'ici peu. Certes, dans un sens, cela revient à pousser le "poll for desired state" de votre scénario de test vers JavaScript, mais cela rendrait votre test plus lisible.

3voto

Ardesco Points 2169

Théoriquement, c'est possible, mais je vous le déconseille.

La solution consisterait probablement à exécuter un programme jQuery sur le site, qui mettrait une variable à true lorsque le traitement JavaScript est terminé.

Configurer Selenium pour qu'il boucle sur un getEval jusqu'à ce que cette variable devienne vraie, puis faire quelque chose dans Selenium.

Cela répondrait à vos exigences, mais c'est une très mauvaise idée. Si, pour une raison quelconque, votre jQuery ne met pas la variable trigger à true (ou tout autre état que vous attendez), Selenium restera là indéfiniment. Vous pourriez mettre un délai d'attente très long, mais alors quelle serait la différence en demandant simplement à Selenium de faire un getEval et d'attendre qu'un élément spécifique apparaisse ?

On dirait que vous essayez d'imaginer une solution trop complexe qui vous causera plus de problèmes à l'avenir et qui ne vous apportera que très peu d'avantages supplémentaires.

2voto

oif_vet Points 196

Je ne veux pas être trop direct, mais si vous voulez que votre application parle à votre responsable des tests, vous vous y prenez mal.

Si vous devez attendre la fin d'un XHR, vous pouvez essayer d'afficher une aiguille, puis vérifier que l'aiguille a disparu pour indiquer que la demande a abouti.

En ce qui concerne l'animation, lorsque l'animation est terminée, son rappel pourrait peut-être ajouter une classe indiquant que l'animation est terminée, puis vous pourriez tester l'existence de cette classe.

0voto

Tester l'animation avec le sélénium, c'est ouvrir une boîte de Pandore. Les tests peuvent être assez fragiles et provoquer de nombreux faux positifs.

Le problème est de faire que les appels sont asynchrones, et difficile de suivre le comportement et le changement d'état de la page.

D'après mon expérience, l'appel asynchrone peut être si rapide que le spinner n'est jamais affiché, et l'état de la page peut sauter un état entièrement (que Selenium peut détecter).

Attendre la transition de l'état de la page peut rendre les tests moins fragiles, mais les faux positifs ne peuvent pas être entièrement éliminés.

Je recommande les tests manuels pour l'animation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X