一尘不染

scrollIntoView与moveToElement

selenium

在Selenium WebDriver中,有两种主要方法可 将元素放入可见区域

  1. 滚动到视图

    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
    
  2. 使用moveToElement浏览器操作

        Actions actions = new Actions(driver);
    actions.moveToElement(element);
    actions.perform();

这些方法是否等效,应首选哪一种?


阅读 599

收藏
2020-06-26

共1个答案

一尘不染

scrollIntoView

DOM方法scrollIntoView仅将元素滚动到视图中。如果scrollIntoView无法将元素滚动到视图中,它只会静默失败。我在元素的开头添加了一个不可见的元素body并对其进行了调用scrollIntoView。没有任何滚动,但是没有错误。请注意,与相比,您对元素
如何
滚动的控制更多。硒只对使元素可见,以便可以将鼠标放在其上感兴趣。它不会告诉您如何执行此操作。但是,例如,允许您指定是要元素的顶部还是底部与其可滚动祖先对齐。(有关详细信息,请参见此处。)scrollIntoView``moveToElement``scrollIntoView

moveToElement

Selenium方法moveToElement有两件事:将元素滚动到视图中,然后将鼠标移到元素顶部。我还用无法滚动或移动到的元素对其进行了测试,因为它们在屏幕上没有坐标,并且在这里也没有错误。

选择一个

我默认使用moveToElement,但以下情况除外:

  • 如果您根本不想影响Selenium放置鼠标的位置,但是想要滚动某些内容到视图中(有点奇怪…但是可能),那么应该使用scrollIntoView

  • 如果您需要使用scrollIntoView提供给您的控件来滚动元素(例如上面提到的对齐选项),则必须使用它而不是moveToElement

  • 在某些情况下,无法尝试通过Selenium的命令来模拟用户的行为,或者通过发送一系列Selenium命令来执行该操作非常昂贵。(每个命令都是到网络的往返。当测试服务器在Internet上某处时,它加起来。)在这种情况下,我使用Selenium的executeScript。在这种情况下,最好scrollIntoView在正在执行的脚本中使用,而不是结束脚本,创建一个脚本Action来执行滚动,并用另一个脚本完成整个操作executeScript

2020-06-26