GEB:禁用 waitFor 块中的隐式断言

GEB: Disable implicit assertions in waitFor block

我有一个 waitFor{} 块,里面有几行:

waitFor(timeOutSeconds) {
    jobRow.clickUpdate()
    processDialog.waitIfShown()
    jobRow.statusCell.text() == status.value
}

根据The Book of GEB

Any calls to refreshWaitFor() method have implicit assertions added to each expression in the bloc passed to it just like for waitFor() method calls.

问题是 processDialog.waitIfShown() 可以 return false,如果不显示进度条其实还可以。

我只需要验证最后一行 groovy 的真实性,所以现在我写 processDialog.waitIfShown() || true 来跳过这个表达式验证。这有效但看起来很奇怪。

是否有任何标志或选项可以关闭等待块中的隐式断言?

如果您想为特定 waitFor() 调用禁用隐式断言,那么不,目前不支持开箱即用。不过,有许多解决方法:

  • 如果从编译类路径中删除 org.gebish:geb-implicit-assertions 工件,则可以全局禁用隐式断言 - 它是 geb-core 的传递依赖项,并且在所有主要构建系统中排除传递依赖项相对容易
  • 隐式断言不适用于对 void 方法的调用 - 如果将 processDialog.waitIfShown() 包装到具有 void 作为 return 类型的方法中,则不会断言对该方法的调用
  • 隐式断言仅适用于 waitFor() 调用,如果将闭包文字传递给它们 - 如果您将条件闭包分配给变量,然后将该变量传递给 waitFor() 调用,则没有语句在那个闭包中将被隐式断言

如果您认为以上 options/workarounds 还不够,请随时在 the tracker 中提出问题。

如果您查看更新版本的 geb 的 Page, you'll see they've added a getShouldVerifyAtImplicitly 方法,它可以在您的页面实现中被重写为 return false。因为它是 groovy,所以就像定义...

一样简单
boolean shouldVerifyAtImplicitly = false

...您页面中的任意位置 class。