代码之家  ›  专栏  ›  技术社区  ›  switch201

在Navigator.click()方法中,scrollIntoView()在堆栈中的什么位置出现?

geb
  •  0
  • switch201  · 技术社区  · 7 年前

    使用Geb和WebElement,在执行单击之前,首先将WebElement滚动到视图中。我在这里遇到了一个问题,因为在屏幕顶部有一个“菜单”栏,而webdriver看不到。这会导致chrome抛出一个webdriver异常,声明该元素在x点和y点不可单击,因为webdriver在菜单横幅下滚动该元素。

    scrollIntoView() 在代码中发生。我想把一些代码放在 scrollIntoView() 和实际的点击动作,这样我就可以抵消 ScrollIntoView() 轻轻的,这样点击就可以执行了。在Navigator.click()的堆栈中,滚动到视图的具体位置是什么?

    1 回复  |  直到 7 年前
        1
  •  2
  •   erdi    7 年前

    在调用时单击之前将元素滚动到视图中 WebElement.click() 在浏览器端的方法实现内部发生,因此在Geb或 RemoteWebElement https://searchfox.org/mozilla-central/source/testing/marionette/interaction.js#148 .

    如果您希望在单击元素之前手动将其滚动到视图中,您可能需要编写一个Geb模块并覆盖它 click() 其中:

    class ViewPortOffsetModule extends Module {
        Navigator click() {
            //put your implementation of scrolling the element to view here, most probably using the js executor
    
            super.click()
        }
    }
    

    然后在内容定义中:

    static content = {
        elementNeedingOffsetWhenScrollingIntoView { $("#my-element").module(ViewPortOffsetModule) }
    }
    

    现在,如果您在ViewPortOffsetModule中正确实现了滚动到视图中,则调用 elementNeedingOffsetWhenScrollingIntoView.click() 在单击元素之前,将该元素滚动到具有偏移量的视图中。