使用Geb和WebElement,在执行单击之前,首先将Web元素滚动到视图中。我在这里遇到了一个问题,因为在屏幕顶部有一个“菜单”栏,Webdriver看不到。这会导致chrome抛出一个webdriver异常,指出该元素在点x,y处不可单击,因为webDriver在菜单横幅下滚动了该元素。
如果我查看NonEmptyNavigator的实现以及随后的远程webElement的实现,那么我找不到代码中scrollIntoView()
出现的位置。我想在scrollIntoView()
和实际单击动作之间放置一些代码,以便可以稍微偏移ScrollIntoView()
以便执行单击。在Navigator.click()的堆栈中到底发生在哪里?
答案 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()
将在单击元素之前将元素滚动到具有偏移量的视图中。