关于javascript:scrollIntoView vs moveToElement

scrollIntoView vs moveToElement

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

  • 滚动到视图:

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

    1
    2
    3
    Actions actions = new Actions(driver);
    actions.moveToElement(element);
    actions.perform();
  • 这些方法等效吗?应首选哪种方法?


    scrollIntoView

    dom方法scrollIntoView只将元素滚动到视图中。如果scrollIntoView不能滚动元素到视图中,它就会安静地失败。我在body的开头添加了一个不可见元素,并在上面调用scrollIntoView。没有滚动,但没有错误。请注意,您对使用scrollIntoView滚动元素的方式比使用moveToElement滚动元素的方式有更多的控制。Selenium只对将元素带到视图中以便将鼠标放在元素上感兴趣。它没有给你任何关于它将如何做的发言权。但是,scrollIntoView允许您,例如,指定是否希望元素的顶部或底部与其可滚动的祖先对齐。(详情请参见此处。)

    moveToElement

    Selenium方法moveToElement做了两件事:它将元素滚动到视图中,并将鼠标移动到元素顶部。我还使用了一些不能滚动或移动到的元素来测试它,因为它们在屏幕上没有坐标,在这里也没有错误。

    选择一个

    我默认使用moveToElement,但有以下例外:

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

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

    • 有些情况下,尝试通过Selenium的命令来模拟用户行为是不可能的,或者通过发送一系列Selenium命令来模拟用户行为是非常昂贵的。(每个命令都是到网络的往返。在这种情况下,我使用Selenium的executeScript。在这种情况下,最好在正在执行的脚本中使用scrollIntoView,而不是结束脚本,创建一个Action来执行滚动,然后用另一个executeScript完成整个操作。