根据“Geb之书”,我开始绘制我们门户网站的网页。我更喜欢使用静态内容闭包块中定义的变量,然后在页面方法中访问它们:
static content = {
buttonSend { $("input", type: "submit", nicetitle: "Senden") }
}
def sendLetter() {
waitFor { buttonSend.isDisplayed() }
buttonSend.click()
}
不幸的是,有时我会遇到 Geb 等待超时异常(60 秒后),或者更糟糕的是我收到众所周知的“StaleElementReferenceException”。
使用“isEnabled”而不是“isDisplayed”时,我可以避免等待超时,但对于“StaleElementReferenceException”,我只能应用以下解决方案:
def sendLetter() {
waitFor { buttonSend.isEnabled() }
try {
buttonSend.click()
} catch (StaleElementReferenceException e) {
log.info(e.getMessage())
buttonSend.click()
}
}
我想,这个解决方案并不是很好,但我无法应用另一篇文章中描述的显式等待。因此,我有一些一般性问题:
- 当页面动态时,我是否应该避免使用静态内容定义?
- Geb 在什么时间或事件刷新其 DOM?如何触发 DOM 刷新?
- 为什么我在使用 CSS 选择器时仍然收到“StaleElementReferenceException”?
我将不胜感激每一个有助于理解或解决这个问题的提示。最好是有一个简单的代码示例,因为我仍然是初学者。谢谢你!
如果您在页面类上定义了 at 检查,页面将首先验证该条件并等待前 n 秒。这是在您的gebConfig 文件中分配的。默认值为 30 秒。
static at = {
waitFor { buttonSend.isDisplayed() }
}
因此,一旦您通过测试或任何您在页面上使用的方法调用页面“to”方法,页面就会等待,然后执行页面操作。
to MyPage
buttonSend.click()
当页面动态时,我是否应该避免使用静态内容定义?
不,实际上,静态定义是闭包。那么什么是
实际发生的是每次您使用静态页面时
您正在调用一个在其上动态运行的闭包的组件
当前页面(webElements 的集合)。理解这一点是关键
使用 Geb 并发现您将遇到的问题。
Geb 在什么时间或事件刷新其 DOM?如何触发 DOM 刷新?
当您调用:to、go、at、click 、withFrame(frame, page)、withWindow
和浏览器驱动方法它将刷新当前的设置
Web 元素。 Geb 有一系列很好的实用程序来进行切换
页面之间和等待页面的操作变得简单。注:Geb 是
实际上建立在WebDriver WebElements http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html.
为什么我在使用 CSS 选择器时仍然收到“StaleElementReferenceException”?
页面可能尚未完成加载,已被操纵
使用 ajax 调用或已以其他方式刷新。有时一个
'at' PAGE 方法调用可以解决这些问题。他们最适合我
使用框架时很常见,因为 Geb 似乎在页面之间变得混乱
和框架一点。有解决方法。
简而言之,如果您使用页面模式,您可以使用您使用静态内容、at 和 url 闭包定义的 Page 类轻松切换预期页面,如下所示:
- to(Page)
- at(Page)
- 导航器.单击(页面)
- withFrame(框架, 页面) { }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)