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

时间:2018-09-21 20:04:21

标签: geb

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

如果我查看NonEmptyNavigator的实现以及随后的远程webElement的实现,那么我找不到代码中scrollIntoView()出现的位置。我想在scrollIntoView()和实际单击动作之间放置一些代码,以便可以稍微偏移ScrollIntoView()以便执行单击。在Navigator.click()的堆栈中到底发生在哪里?

1 个答案:

答案 0 :(得分:2)

在调用WebElement.click()时在单击之前将元素滚动到视图中是在浏览器端的方法实现内,因此您找不到在Geb或RemoteWebElement中将任何内容滚动到视图中的参考。这是从木偶(Firefox WebDriver实现)代码库: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()将在单击元素之前将元素滚动到具有偏移量的视图中。