scrollIntoView vs moveToElement

时间:2016-01-02 02:44:23

标签: javascript java html selenium selenium-webdriver

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

  1. Scrolling into view

    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
    
  2. 使用moveToElement browser action

    Actions actions = new Actions(driver);
    actions.moveToElement(element);
    actions.perform();
    
  3. 这些方法是否相同,应该首选哪一种?

1 个答案:

答案 0 :(得分:29)

scrollIntoView

DOM方法scrollIntoView仅将元素滚动到视图中。如果scrollIntoView无法将元素滚动到视图中,它将无声地失败。我在body的开头添加了一个不可见的元素,并在其上调用scrollIntoView。没有滚动,但没有错误。请注意,您可以使用scrollIntoView比使用moveToElement更多地控制 元素的滚动方式。 Selenium只对将元素放入视图感兴趣,以便可以将鼠标放在其上。它没有给你如何做到这一点。但是,scrollIntoView允许您指定是否希望元素的顶部或底部与其可滚动的祖先对齐。 (有关详细信息,请参阅here。)

moveToElement

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

选择一个

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

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

  • 如果您需要使用scrollIntoView给出的控件类型滚动元素(就像我上面提到的对齐选项),那么您必须使用它而不是moveToElement

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