Dans Selenium WebDriver, il existe deux méthodes principales pour placer un élément dans une zone visible :
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
Utilisation de moveToElement
action du navigateur :
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();
Ces méthodes sont-elles équivalentes et laquelle devrait être préférée?
scrollIntoView
La méthode DOM scrollIntoView
fait uniquement défiler l'élément dans la vue. Si scrollIntoView
ne peut pas faire défiler l'élément en vue, il échouera silencieusement. J'ai ajouté un élément invisible au début de body
et j'ai appelé scrollIntoView
dessus. Rien ne défile mais il n'y a pas d'erreur. Notez que vous avez plus de contrôle sur comment l'élément défile avec scrollIntoView
qu'avec moveToElement
. Le sélénium est uniquement intéressé à mettre l'élément en vue afin que la souris puisse être placée dessus. Cela ne vous donne aucun mot à dire sur la façon dont cela va se faire. scrollIntoView
vous permet cependant, par exemple, de spécifier si vous voulez que le haut ou le bas de l'élément soit aligné avec son ancêtre déroulant. (Voir ici pour les détails.)
moveToElement
La méthode Selenium moveToElement
fait deux choses: elle fait défiler l'élément en vue et déplace la souris au-dessus de l'élément. Je l'ai également testé avec des éléments qui ne peuvent pas être déplacés ou déplacés car ils n'ont pas de coordonnées à l'écran et n'ont pas d'erreur ici non plus.
Par défaut, j'utilise moveToElement
, avec les exceptions suivantes:
Si vous ne voulez pas du tout affecter où Selenium a placé la souris mais que vous voulez faire défiler quelque chose en vue (un peu étrange ... mais possible), alors vous devez utiliser scrollIntoView
.
Si vous devez faire défiler un élément avec le type de contrôle que scrollIntoView
vous donne (comme l'option d'alignement que j'ai mentionnée ci-dessus), alors vous devez l'utiliser plutôt que moveToElement
.
Dans certains cas, il n'est pas possible ou très coûteux de simuler le comportement de l'utilisateur via les commandes de Selenium en envoyant une série de commandes Selenium. (Chaque commande est un aller-retour vers le réseau. Lorsque le serveur de test se trouve quelque part sur Internet, cela s'additionne.) Dans de tels cas, j'utilise executeScript
de Selenium. Dans ce cas, il peut être avantageux d'utiliser scrollIntoView
dans le script en cours d'exécution, plutôt que de terminer le script, de créer un Action
pour effectuer le défilement et de terminer l'opération avec un autre executeScript
.