scrollIntoView 与 moveToElement

IT技术 javascript java html selenium selenium-webdriver
2021-03-16 00:06:13

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

  1. 滚动查看

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

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

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

1个回答

scrollIntoView

DOM 方法scrollIntoView仅将元素滚动到视图中。如果scrollIntoView无法将元素滚动到视图中,它将静默失败。我在开头添加了一个不可见元素body并调用scrollIntoView了它。没有滚动,但没有错误。请注意,您必须对更多的控制如何将元素与滚动scrollIntoViewmoveToElementSelenium 只对显示元素感兴趣,以便可以将鼠标放在它上面。它没有给你任何关于它将如何做的发言权。scrollIntoView但是,例如,允许您指定是否希望元素的顶部或底部与其可滚动的祖先对齐。(请参阅此处了解详细信息。)

moveToElement

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

选择一个

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

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

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

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

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