如何在处理 "internal" 滚动条时滚动到视图中
How to scroll into view when dealing with an "internal" scroll bar
如果这个问题有点模棱两可,我深表歉意。我注意到如果所述元素不在页面上并且需要使用 "internal" 滚动条
滚动到 Geb 元素将不会滚动到视图中
by "internal" 滚动条 我指的是嵌套在给定网页中的滚动条,与全局网页的滚动条分离。
当我尝试抓取由于内部滚动条而离开页面的元素时,geb returns 一个空对象(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()
returns 正确的行数:50,但是当我为页面外的一行调用 getRow
时,它 returns无效的。如果在列表顶部找到同一行,则它有效。如果需要滚动到它,它只会 returns null。
所以我发现了我的问题所在。如果我用索引而不是字符串从屏幕上抓取一个元素。 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
}
如果这个问题有点模棱两可,我深表歉意。我注意到如果所述元素不在页面上并且需要使用 "internal" 滚动条
滚动到 Geb 元素将不会滚动到视图中by "internal" 滚动条 我指的是嵌套在给定网页中的滚动条,与全局网页的滚动条分离。
当我尝试抓取由于内部滚动条而离开页面的元素时,geb returns 一个空对象(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()
returns 正确的行数:50,但是当我为页面外的一行调用 getRow
时,它 returns无效的。如果在列表顶部找到同一行,则它有效。如果需要滚动到它,它只会 returns null。
所以我发现了我的问题所在。如果我用索引而不是字符串从屏幕上抓取一个元素。 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
}