scrollIntoView vs moveToElement

ale*_*cxe 32 html javascript java selenium selenium-webdriver

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

  1. 滚动到视图中:

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

    Actions actions = new Actions(driver);
    actions.moveToElement(element);
    actions.perform();
    
    Run Code Online (Sandbox Code Playgroud)

这些方法是否相同,应该首选哪一种?

Lou*_*uis 38

scrollIntoView

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

moveToElement

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

选择一个

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

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

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

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

  • 如果元素在屏幕上不可见,moveToElement 不会滚动到该元素。它仅控制鼠标并将光标放在元素上。如果你想滚动到一个不可见的元素,你必须告诉selenium滚动页面,直到元素位置在屏幕上可见(你可以将元素位置与视口进行比较) (4认同)
  • 到目前为止,我们看到 JS rollIntoView 总是有效,但 Actions moveTo 失败。为什么JS看起来更可靠? (3认同)