REMARQUE: appelons «clic» est un clic de l'utilisateur final. 'js click' est un clic via JS
Pourquoi le clic "via JavaScript" fonctionne-t-il alors qu'un clic WebDriver normal ne fonctionne pas?
Il y a 2 cas pour que cela se produise:
I. Si vous utilisez PhamtomJS
C'est alors le comportement connu le plus courant de PhantomJS
. Certains éléments ne sont parfois pas cliquables, par exemple <div>
. En effet, il PhantomJS
a été conçu à l'origine pour simuler le moteur des navigateurs (comme HTML + CSS initial -> calcul CSS -> rendu). Mais cela ne signifie pas être interagi avec la manière d'un utilisateur final (voir, cliquer, faire glisser). Par conséquent, PhamtomJS
n'est que partiellement pris en charge avec l'interaction des utilisateurs finaux.
POURQUOI JS CLICK FONCTIONNE-T-IL? Quant à chaque clic, ils sont tous un clic moyen. C'est comme une arme à feu avec 1 canon et 2 déclencheurs . Un de la fenêtre, un de JS. Comme il est PhamtomJS
excellent pour simuler le moteur du navigateur, un clic JS devrait fonctionner parfaitement.
II. Le gestionnaire d'événements de "click" a pu se lier dans la mauvaise période.
Par exemple, nous avons un <div>
-> Nous faisons quelques calculs
-> puis nous lions l'événement de clic au <div>
.
-> Plus avec un mauvais codage angulaire (par exemple, ne pas gérer correctement le cycle de l'oscilloscope)
Nous pouvons aboutir au même résultat. Le clic ne fonctionnera pas, car WebdriverJS essaie de cliquer sur l'élément alors qu'il n'a pas de gestionnaire d'événements de clic.
POURQUOI JS CLICK FONCTIONNE-T-IL? Js click revient à injecter js directement dans le navigateur. Possible de 2 façons,
Le premier est via la console devtools (oui, WebdriverJS communique avec la console de devtools).
La deuxième consiste à injecter une <script>
balise directement dans le HTML.
Pour chaque navigateur, le comportement sera différent. Mais peu importe, ces méthodes sont plus compliquées que de cliquer sur le bouton. Click utilise ce qui est déjà là (les utilisateurs finaux cliquent), js click passe par la porte dérobée.
Et pour js, le clic apparaîtra comme une tâche asynchrone. Ceci est lié à un sujet un peu complexe de « tâche asynchrone du navigateur et planification des tâches CPU » (lisez-le il y a quelque temps, je ne trouve pas l'article à nouveau). Pour faire court, cela se traduira principalement par le fait que js click devra attendre un cycle de planification des tâches du processeur et il sera exécuté un peu plus lentement après la liaison de l'événement de clic.
(Vous pourriez connaître ce cas lorsque vous avez trouvé l'élément parfois cliquable, parfois non.)
Quand exactement cela se produit-il et quel est l'inconvénient de cette solution de contournement (le cas échéant)?
=> Comme mentionné ci-dessus, les deux signifient dans un seul but, mais sur l'utilisation de quelle entrée:
- Click: utilise ce qui fournit par défaut le navigateur.
- Clic JS: passe par la porte dérobée.
=> Pour les performances, c'est difficile à dire car il repose sur les navigateurs. Mais généralement:
- Cliquez: ne signifie pas plus rapide, mais seulement une position supérieure signée dans la liste de planification de la tâche d'exécution du processeur.
- Clic JS: ne veut pas dire plus lent mais seulement il s'est connecté à la dernière position de la liste de planification de la tâche CPU.
=> Inconvénients:
- Cliquez: ne semble pas avoir d'inconvénient sauf que vous utilisez PhamtomJS.
- Clic JS: très mauvais pour la santé. Vous pouvez accidentellement cliquer sur quelque chose qui ne figure pas dans la vue. Lorsque vous l'utilisez, assurez-vous que l'élément est là et disponible pour être visualisé et cliquez comme point de vue de l'utilisateur final.
PS si vous cherchez une solution.
- Vous utilisez PhantomJS? Je suggérerai plutôt d'utiliser Chrome sans tête. Oui, vous pouvez configurer Chrome sans tête sur Ubuntu. La chose fonctionne comme Chrome, mais elle n'a pas de vue et moins de buggy comme PhantomJS.
- Vous n'utilisez pas PhamtomJS mais vous rencontrez toujours des problèmes? Je suggérerai d'utiliser la condition attendue du rapporteur avec
browser.wait()
( vérifiez ceci pour plus d'informations )
(Je veux faire court, mais j'ai mal fini. Tout ce qui a trait à la théorie est compliqué à expliquer ...)