如果这个问题有点模棱两可,我深表歉意。我注意到,如果Geb元素不在页面上,则需要使用“内部”滚动条滚动到Geb元素中。
通过“内部”滚动条,我指的是嵌套在给定网页内的滚动条,与全局网页的滚动条分离。
由于此内部滚动条,当我尝试获取不在页面上的元素时,geb返回一个空对象(geb在页面上找不到该元素)
我做了一些其他的操作来手动滚动这些内部滚动条,但是我想知道Geb是否提供任何功能来处理这些嵌套的滚动条。
下面是一个代码片段,以显示如何处理查找给定的行:
class TabledModule extends Module {
static content = {
headers {$(By.xpath("//lane-group-header"))}
table {$(By.xpath("//div[@class=',y-class']"))}
}
Navigator getAllRows(){
return table.children()
}
Navigator getRow(String text){
return table.children().find{it.text().contains(text)}
}
Navigator getRow(int index){
return table.children()[index]
}
}
来自我的脚本:
getAllRows() //returns 50 which it should (only 20 are displayed)
def row = getRow(45) //returns a navigator as it should
row.click() //successfully clicks the correct row
def row2 = getRow("someString") //returns null when the row is off the page this is the problem and I'm wondering now if it is a bug, since getting the row by index seems to work fine.
对于此模块,仅显示了50行中的约20行,以显示您必须通过嵌套滚动条滚动才能到达的其他行。在列表的下方找到我要访问的行,因此需要滚动才能访问它。
有趣的是getAllRows().size()
返回正确的行数:50,但是当我为页面外的行调用getRow
时,它返回null。如果在列表顶部找到同一行,则该行有效。仅在需要滚动到时才返回null。
答案 0 :(得分:0)
所以我发现了我的问题所在。如果我用索引而不是字符串从屏幕上获取一个元素。 Geb可以抓住导航器并单击该导航器,但是如果元素不在屏幕上,则GEB无法在元素上获取文本。为了解决这个问题,我实现了这种方法。
Navigator getRow(String text){
JavascriptExecutor jse = (JavascriptExecutor)browser.driver
for(int x = 0; x<getAllRows().size();x++){
def row = getRow(x)
WebElement element = row.firstElement()
jse.executeScript("arguments[0].scrollIntoView(true);", element);
if(row.text().contains(text)){
return row
}
}
return null
}