处理“内部”滚动条时如何滚动到视图中

时间:2018-10-25 20:31:10

标签: selenium geb

如果这个问题有点模棱两可,我深表歉意。我注意到,如果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。

1 个答案:

答案 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
}