根据“Geb之书”,我开始映射我们门户的网页。我更喜欢使用静态内容闭合块中定义的变量,并在页面方法之后访问它们:不幸的是Geb的一般问题(StaleElementReferenceException和等待超时)
static content = {
buttonSend { $("input", type: "submit", nicetitle: "Senden") }
}
def sendLetter() {
waitFor { buttonSend.isDisplayed() }
buttonSend.click()
}
,有时我得到一个盖布等待超时异常(后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”?
我希望每个提示有助于理解或解决此问题。最好的办法是有一个简单的代码示例,因为我仍然是初学者。谢谢!
这个非常有趣和详细的回答非常感谢。用你的所有例子,我永远不会面对陈旧的元素! :-)我认为这个例外的主要原因是在访问页面元素之前缺少检查器。有时候,我只是使用了已经陈旧的页面对象的引用。酷,我又学到了更多关于Geb的知识!谢谢,吉姆! – AndyDoe