Grails Geb:元素不再附加到waitFor内的DOM

Grails Geb:元素不再附加到waitFor内的DOM,grails,selenium,geb,Grails,Selenium,Geb,我从Geb测试中得到一个“元素不再连接到DOM”错误。让我困惑的是,错误来自waitFor本身——我插入wait是为了让页面上的异步活动在继续单击链接之前完成,而该链接以前是相同错误的来源。如果等待本身失败了,我现在就不知所措了 代码类似于 waitFor { $("div", text: "... search string ... ") } $("a", id: "element-id").click() 堆栈跟踪显示waitFor本身就是问题所在: at org.openqa.selen

我从Geb测试中得到一个“元素不再连接到DOM”错误。让我困惑的是,错误来自
waitFor
本身——我插入wait是为了让页面上的异步活动在继续单击链接之前完成,而该链接以前是相同错误的来源。如果等待本身失败了,我现在就不知所措了

代码类似于

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)

从stacktrace中,我可以看到您在测试类内部使用该选择器,而不是在模块内部使用该选择器,因此可以排除分离模块基元素的可能性

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

发生这种情况的原因有两个:

  • 您的选择器非常慢—选择页面中的所有div元素,然后根据JVM中的文本对其进行过滤可能需要很多时间。假设您使用默认的等待预设,那么如果该选择器花费的时间超过5秒,那么
    waitFor{}
    块将只运行一次,获取异常,并且永远不会重试,因为它没有时间了。您应该在浏览器中尽可能多地进行过滤,即使用与CSS3兼容的选择器,并在尽可能小的元素集上使用Geb的文本过滤扩展
  • 您的页面以周期性的方式异步,并且它的更改速度比选择器能够基于元素文本进行筛选的速度快。这也是可能的,因为您的选择器看起来可能非常慢

基本上,我建议使用一个比当前更具体的选择器。

发布完整的堆栈跟踪