Geb:Element不再连接到waitFor中的DOM

时间:2015-03-04 15:56:44

标签: grails selenium geb

我从Geb测试中得到“元素不再附加到DOM”错误。让我感到困惑的是,错误来自waitFor本身 - 我专门插入了等待以允许页面上的异步活动完成,然后再点击链接,这之前是链接的源头。同样的错误。如果等待本身失败,现在我不知所措。

代码类似于

waitFor { $("div", text: "... search string ... ") }
$("a", id: "element-id").click()

并且堆栈跟踪显示waitFor本身实际上是问题:

at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:187)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554)
at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:268)
at org.openqa.selenium.remote.RemoteWebElement.getText(RemoteWebElement.java:152)
at geb.navigator.NonEmptyNavigator.matches_closure28(NonEmptyNavigator.groovy:474)
at geb.navigator.NonEmptyNavigator.matches(NonEmptyNavigator.groovy:471)
at geb.navigator.NonEmptyNavigator.filter_closure2(NonEmptyNavigator.groovy:63)
at geb.navigator.NonEmptyNavigator.filter(NonEmptyNavigator.groovy:63)
at geb.navigator.NonEmptyNavigator.find(NonEmptyNavigator.groovy:48)
at geb.content.NavigableSupport.$(NavigableSupport.groovy:96)
at geb.Browser.methodMissing(Browser.groovy:193)
at geb.spock.GebSpec.methodMissing(GebSpec.groovy:51)
at [my test]_closure7([my test].groovy:147)
at [my test]_closure7([my test].groovy)
at geb.waiting.Wait.waitFor(Wait.groovy:106)

1 个答案:

答案 0 :(得分:2)

从堆栈跟踪中我可以看到你在测试类中使用了那个选择器而不是模块,因此可以排除分离模块基本元素的可能性。

如果这种情况一直在发生,那么这意味着div选择器选择的其中一个元素会在检索其文本之前从DOM中删除,以对其进行过滤。

出现这种情况有两个原因:

  • 您的选择器非常慢 - 选择页面中的所有div元素,然后根据JVM中的文本过滤它们可能会花费大量时间。假设您使用默认的等待预设,那么如果该选择器花费的时间超过5秒,则waitFor {}块将只运行一次,获取异常并且永远不会重试,因为它会耗尽时间。您应该在浏览器中尽可能多地进行过滤,即使用兼容CSS3的选择器并在尽可能小的元素集上使用Geb的文本过滤扩展。
  • 您的页面是定期异步的,并且它的变化比选择器能够根据元素文本进行过滤更快。这也是可能的,因为你的选择器看起来可能非常慢。

基本上我会建议选择一个比你现在更具体的选择器。