web-dev-qa-db-fra.com

scrollIntoView vs moveToElement

Dans Selenium WebDriver, il existe deux méthodes principales pour placer un élément dans une zone visible :

  1. défilement dans la vue :

    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
    
  2. 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?

29
alecxe

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.

Choisir un

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.

34
Louis