Ma *_* Ko 2 groovy user-interface selenium automated-tests geb
我们的应用程序有一些不稳定的测试,有时会成功通过,有时会WaitTimeoutException在页面加载期间失败.我发现我们正在使用像waitFor(time)和的方法sleep(time).它们之间有什么区别,哪个更好?或者有一些更好的解决方案来解决这个问题?
许多情况下都需要等待geb.等待页面加载最好在使用Page模式时完成,您可以在页面中定义at检查器,例如:
static at = {waitFor {$('form').@ id =="loginForm"}}
当使用它时,geb将等待,直到检查器可以验证页面已加载.等到geb config中的设置超时.这突出了它的工作原理.在任何脚本上,您都可以在任何条件下使用自己的waitFor调用.我提供的链接将向您展示这是如何工作的.在geb的更高版本中,您可以将每个调用设置为在waitFor中显式换行.
static at = { $('form').@id == "loginForm" }
Run Code Online (Sandbox Code Playgroud)
还要回答你的问题:睡眠只应作为最后的手段,因为整个线程都会休眠,并且可能会破坏你的等待设置.执行此操作时,您将失去对加载和等待脚本的控制感.如果您无法使用等待条件的waitFor闭包来配置测试,那么您应该考虑使页面更快.我们仅因环境问题使用60秒.
在我看来,WaitFor(时间)有点多余,除非你实际上是在测试时间本身.
在geb中,最好使用页面内容,而不是使用可能无法控制的条件.
Geb配置:
waiting {
timeout = 30
retryInterval = 1.0
}
Run Code Online (Sandbox Code Playgroud)
Ajax:等待ajax调用完成.它将开始睡眠,因为大多数调用在此时间内完成,然后它将检查活动的ajax调用,并且如果完成调用以使页面有时间渲染则再睡一些.某些动态页面更改需要比其他更长时间,因此可以修改睡眠后的内容以适合您的网站或完全删除.
/**
* 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)
}
Run Code Online (Sandbox Code Playgroud)