我们的应用程序有一些不稳定的测试,有时会成功通过,有时会在页面加载期间因 WaitTimeoutException
失败。
我发现我们正在使用 waitFor(time)
和 sleep(time)
等方法。
它们之间有什么区别,哪一个更好用?或者有一些更好的解决方案来解决这个问题?
最佳答案
很多场景都需要在geb中等待。等待页面加载最好在使用页面模式时完成,您可以在页面中定义 at 检查器,例如:
static at = { waitFor { $('form').@id == "loginForm"} }
当使用此功能时,geb 将等待,直到 at 检查器可以验证页面已加载。等待直到geb配置中设置的超时。这突出了它的工作原理。在任何脚本上,您可以在任何条件下使用自己的 waitFor 调用。我提供的链接将向您展示这是如何工作的。在 geb 的更高版本中,您可以将每个 at 调用设置为显式包装在 waitFor 中。
static at = { $('form').@id == "loginForm" }
另外回答您的问题: sleep 只能作为最后的手段,因为整个线程都处于 sleep 状态,并且可能会破坏您的等待设置。当您这样做时,您会失去对加载和等待脚本的控制感。如果您无法使用带有等待条件的 waitFor 闭包将测试配置为工作,那么也许您应该考虑使页面更快。我们使用60秒只是因为环境问题。
在我看来,WaitFor(time) 有点多余,除非您实际上正在测试时间本身。
在geb中,最好针对页面内容进行操作,而不是使用可能超出您控制范围的条件。
Geb 配置:
waiting {
timeout = 30
retryInterval = 1.0
}
Ajax:WAITING ajax 调用完成。它会首先休眠,因为大多数调用都在此时完成,然后它将检查事件的 ajax 调用,并在完成后休眠更多,以便为页面提供渲染时间。某些动态页面更改需要比其他页面更长的时间,因此可以修改 sleep 后的内容以适合您的网站或完全删除。
/**
* Wait for all AJAX requests to finish.
*/
void waitForAjax(time=350) {
sleep(time)
if (!js.exec("return $.active > 0;")) {
sleep(time) // You may require more wait time here depending on action
return
}
waitForAjax(time)
}
关于user-interface - Geb 测试经常失败并出现 WaitTimeoutException : condition did not pass in 99. 0 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25135533/