9
votes

JavaScript peut-il parler à Selenium 2?

Je sais que je peux obtenir le webDriver de Selenium 2 pour exécuter JavaScript et obtenir des valeurs de retour, mais tellement de choses asynchrones se produisent, je voudrais que JavaScript puisse parler au sélénium au lieu de l'inverse. J'ai fait des recherches et je n'ai rien trouvé de tel. Les gens utilisent-ils généralement généralement implicitly_wait ? Cela semble susceptible d'échouer car il n'est pas possible de tout faire? Parfait exemple serait de laisser Selenium savoir quand un XHR est terminé ou une animation asynchrone avec du temps d'exécution indéterminé.

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


0 commentaires

4 Réponses :


2
votes

Ne pas être trop émoussé, mais si vous voulez que votre application parle à votre coureur de test, vous le faites mal.

Si vous devez attendre qu'un XHR se termine, vous pouvez essayer d'afficher une spinner puis de tester que la fileuse a disparu pour indiquer une demande réussie.

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


10 commentaires

Dans les deux cas, vous ignorez la partie de synchronisation. JavaScript est asynchrone. Je ne demande pas comment faire vérifier les choses de sélénium, je demande comment dire quand vérifier. Une question que vous n'avez pas répondu. Étant donné que JavaScript est asynchrone le meilleur moment est que JavaScript est prêt et que seul JavaScript sait quand c'est. Un crochet est le meilleur moyen de le faire. Alors y a-t-il?


D'après mon expérience avec Selenium 1 et 2, votre test déclenche un appel asynchrone dans votre application. Ensuite, vous utilisez une commande wait_for pour attendre qu'un élément existe (ou n'existe pas). Si vous écrivez votre application pour attendre que le sélénium existe, alors je pense que vous approchez du problème de manière incorrecte. Votre application ne devrait pas se soucier de sélénium ou de tout autre cadre de test à ce sujet. Cela vous permet d'échanger des tests de test à l'avenir si quelque chose vaut mieux sort.


C'est peut-être une meilleure réponse: vous dites à Selenium de vérifier immédiatement après avoir déclenché une action asynchrone. Le sélénium attendra ensuite une période de temps pour que cette condition existe. Si cela n'existe pas dans le délai imparti, il est supposé que l'action a échoué pour que le test soit échoué.


Je cherche la même fonctionnalité. Mon idée serait d'avoir le JavaScript à soulever un événement lors de sa fin et d'écouter un tel événement en sélénium, éventuellement via un JavaScript démarré par WebDriver. Comme mon expérience avec JavaScript est limitée, je ne suis pas sûr que cela soit réalisable. Le mécanisme d'événement éviterait le problème de dépendance durement, mais il faudrait bien entendu le JavaScript original de fournir l'événement qui pourrait signifier changer le code.


@Oif_vet Appels de fonction asynchrone comme XMLHTTTPQUESTS Retour immédiatement ... Les effets sont asynchrones, vous fournissez des rappels qui sont appelés à une heure ultérieure. Le sélénium n'attendra pas. JavaScript doit dire à Selenium quand c'est prêt.


Je ne pense pas que tu me compare. Je comprends que le script exécute et retourne immédiatement. Ce que vous devez tester pour tester est un indicateur visuel que la demande asynchrone est terminée. Ceci est généralement fait en affichant un graphique de fileur qui indique à l'utilisateur que quelque chose se passe. En sélénium, vous testeriez que le fileur n'est plus visible.


Découvrez les documents: SELENIUM.GOOGLECODE.COM/SVN/TRUNK /docs/api/rb/index.html et cliquez sur "Liste de la méthode" et recherchez "Attendre". Vous verrez plusieurs méthodes différentes qui diront que Selenium quoi d'attendre (y compris wait_for_ajax, bien que j'ai eu des problèmes avec cela personnellement)


Non tu ne me comprends pas. Je n'ai pas de problème de déterminer si le script a échoué ou non. J'ai du mal à comprendre quand vérifier.


@apphacker Non, je pense que vous êtes celui qui ne comprend pas - la réponse est que vous ne pouvez pas dire à Selenium quand vérifier; Cela va vérifier tout de suite. Ce que vous pouvez faire, c'est mettre quelque chose d'avant que cela puisse vérifier jusqu'à ce qu'il soit temps de tester le succès de ce que vous êtes vraiment intéressé. Fournir une invite visuelle à votre utilisateur serait la meilleure façon de le faire, car Aide également votre utilisateur à voir que le site Web fait quelque chose. Votre invite visuelle est contrôlée par votre JavaScript, effectuant la fonction que vous vouliez.


Je suis à peu près sûr que je comprends ce que vous dites tous les deux et que vous sautez tous les deux sautant sur le "Comment savoir quand vérifier" ce que je veux savoir.



3
votes

théoriquement c'est possible, mais je vous conseillerais contre.

La solution aurait probablement des jQuery exécutant sur le site qui définit une variable à vrai lorsque le traitement JavaScript est terminé.

Définir le sélénium jusqu'à boucle à travers un getval jusqu'à ce que cette variable devienne vraie, puis faire quelque chose en sélénium.

Cela répondrait à vos besoins, mais c'est une très mauvaise idée. Si, pour une raison quelconque, votre jQuery ne définit pas la variable de déclenchement à la vraie (ou à l'autre état que vous attendez) sélénium y restera indéfiniment. Vous pourriez mettre un délai très long, mais alors quels seraient les différents en obtenant juste sélénium pour faire un getval et attendre qu'un élément spécifique apparaisse?

On dirait que vous essayez de surentirez votre solution et que vous vous ferez plus de douleur à l'avenir très peu d'avantages supplémentaires.


3 commentaires

Vous suggérez de voter avec sélénium qui n'est pas la même chose. Je me demandais si Selenium avait des crochets qu'il a écouté qu'il a ajouté au site. Je suis émerveillé ça ne le fait pas. Même Flash a ceci dans Flash Externals.


Le sélénium ne modifie pas le site, il regarde simplement le DOM et le HTML. La seule façon de faire ce que vous voulez faire est de manipuler le DOM d'une manière ou d'une autre, puis de l'obtention de sélénium pour vérifier le DOM pour votre changement. Vous ne pouvez pas conduire sélénium de votre site web.


Vous ne pouvez pas conduire sélénium de votre site web. C'est ma réponse alors. Cela devrait faire cela à mon avis, mais pas. Merci!



8
votes

Vous devez rechercher la méthode exécutant_async_script () (JavascriptExecutive.executeasyncscript en java, ijavascriptexecutive.executeasyncscript () dans .net), ce qui vous permet d'attendre une fonction de rappel. La fonction de rappel est automatiquement ajoutée au tableau Arguments dans votre fonction JavaScript. Ainsi, en supposant que vous avez déjà une fonction JavaScript déjà sur la page qui attend que la condition que vous souhaitiez, vous pouvez faire quelque chose comme ce qui suit (le code Java ci-dessous, C # et le code Python doit être similaire): XXX P> Il pourrait être possible d'être encore plus intelligent 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 , et peut trouver un exemple de code pour cela dans l'arborescence source du projet. Il y a un excellent exemple d'attente d'un XHR à compléter dans les tests de Ce fichier .

Si cela n'est pas encore disponible dans la version des liaisons Python disponibles pour une utilisation avec des saucelles, je m'attendrais à ce qu'il soit disponible avant longtemps. Certes, dans un sens, cela pousse le "sondage à l'état souhaité" de votre cas de test dans JavaScript, mais cela rendrait votre test plus lisible.


0 commentaires

1
votes

Les tests animations avec sélénium ouvrent une boîte de vers. Les tests peuvent être assez fragiles et causer de nombreux faux positifs.

Le problème est de le faire que les appels sont asynchrones et difficiles à suivre le comportement et à la modification de l'état de la page.

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

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

Je recommande des tests manuels pour l'animation.


0 commentaires