scrollIntoView 与 moveToElement

Posted

技术标签:

【中文标题】scrollIntoView 与 moveToElement【英文标题】:scrollIntoView vs moveToElement 【发布时间】:2016-04-06 08:24:52 【问题描述】:

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

    Scrolling into view:

    ((javascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
    

    使用moveToElement browser action:

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

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

【问题讨论】:

【参考方案1】:

scrollIntoView

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

moveToElement

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

选择一个

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

1234563

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

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

【讨论】:

moveToElement 如果该元素在屏幕上不可见,则不要滚动到该元素。它只控制鼠标并将光标放在元素上。如果你想滚动到一个不可见的元素,你必须告诉 selenium 滚动页面直到元素位置在屏幕上可见(你可以将元素位置与视口进行比较) 到目前为止,已经看到 JS scrollIntoView 始终有效,但 Actions moveTo 失败。为什么 JS 看起来更可靠?

以上是关于scrollIntoView 与 moveToElement的主要内容,如果未能解决你的问题,请参考以下文章

scrollIntoView 失效调研与替换方案

scrollIntoView 失效调研与替换方案

scrollIntoView 失效调研与替换方案

锚点 与 scrollIntoView()

scrollIntoView()的用法

Selenium WebDriver MoveToElement - 隐藏元素、悬停和切换类