NOTE : appelons "clic" le clic de l'utilisateur final. js click' est un clic via JS.
Pourquoi le fait de cliquer "via JavaScript" fonctionne-t-il alors qu'un clic WebDriver normal ne fonctionne pas ?
Il y a deux cas pour que cela se produise :
I. Si vous utilisez PhamtomJS
Alors c'est le comportement le plus communément connu de PhantomJS
. Certains éléments ne sont parfois pas cliquables, par exemple <div>
. Cela s'explique par le fait que PhantomJS
a été conçu à l'origine pour simuler le moteur des navigateurs (comme le HTML initial + CSS -> calcul CSS -> rendu). Mais il n'est pas destiné à être utilisé par l'utilisateur final (visualisation, clic, glissement). C'est pourquoi PhamtomJS
n'est que partiellement prise en charge par l'interaction des utilisateurs finaux.
POURQUOI LE CLIC JS FONCTIONNE-T-IL ? Quant aux deux clics, ils sont tous des clics moyens. C'est comme un pistolet avec 1 baril y 2 déclencheurs . Un de la fenêtre d'observation, un de JS. Depuis PhamtomJS
très bien pour simuler le moteur du navigateur, un clic JS devrait fonctionner parfaitement.
II. Le gestionnaire d'événement de "click" s'est lié à la mauvaise période.
Par exemple, nous avons obtenu un <div>
-
-> Nous faisons des calculs
-
-> puis nous lions l'événement du clic à l'objet <div>
.
-
-> Plus avec un mauvais codage d'angular (par exemple, ne pas gérer correctement le cycle de la portée).
Nous risquons de nous retrouver avec le 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énement de clic.
POURQUOI LE CLIC JS FONCTIONNE-T-IL ? Js click revient à injecter du js directement dans le navigateur. C'est possible de 2 façons,
Poing est par la console de devtools (oui, WebdriverJS communique avec la console de devtools).
Deuxièmement est d'injecter un <script>
directement dans le code HTML.
Pour chaque navigateur, le comportement sera différent. Mais quoi qu'il en soit, ces méthodes sont plus compliquées que de cliquer sur le bouton. Le clic utilise ce qui est déjà là (clic de l'utilisateur final), le clic du js passe par une porte dérobée.
Et pour js click apparaîtra comme une tâche asynchrone. Ceci est lié à un sujet assez complexe de ' planification des tâches asynchrones du navigateur et des tâches du CPU (je l'ai lu il y a quelque temps, je ne retrouve plus l'article). En bref, cela se traduira surtout par le fait que les clics de js devront attendre un cycle de planification des tâches de l'unité centrale et il sera exécuté un peu plus lentement après la liaison de l'événement de clic. (Vous pouvez connaître ce cas lorsque vous constatez que l'élément est parfois cliquable, parfois non. )
Quand exactement cela se produit-il et quel est l'inconvénient de cela ? de cette solution de contournement (le cas échéant) ?
\=> Comme mentionné ci-dessus, les deux signifient pour un but, mais à propos de l'utilisation de quelle entrée :
- Click : utilise ce qui est fourni par défaut par le navigateur.
- JS click : passe par la porte dérobée.
\=> Pour les performances, il est difficile de se prononcer car elles dépendent des navigateurs. Mais en général :
- Clic : ne signifie pas plus rapide mais seulement une position plus élevée dans la liste des tâches d'exécution du CPU.
- JS click : ne veut pas dire plus lent mais seulement qu'il a été placé en dernière position de la liste des tâches du CPU.
\=> Inconvénients :
- Click : ne semble pas avoir d'inconvénient, sauf si vous utilisez PhamtomJS.
- JS click : très mauvais pour la santé. Vous pouvez accidentellement cliquer sur un élément qui n'est pas présent dans la vue. Lorsque vous l'utilisez, assurez-vous que l'élément est présent et disponible à la vue et au clic comme le point de vue de l'utilisateur final.
P.S. si vous cherchez une solution.
- Utiliser PhantomJS ? Je vous suggère d'utiliser plutôt Chrome headless. Oui, vous pouvez configurer Chrome headless sur Ubuntu. La chose fonctionne comme Chrome mais n'a pas de vue et est moins boguée que PhantomJS.
- Vous n'utilisez pas PhamtomJS mais rencontrez toujours des problèmes ? Je vous suggère d'utiliser ExpectedCondition de Protractor avec
browser.wait()
( Pour plus d'informations, consultez cette page )
(Je voulais faire court, mais j'ai mal fini. Tout ce qui est lié à la théorie est compliqué à expliquer...)