Geb测试经常因WaitTimeoutException而失败:条件在99.0秒内未通过

Ma *_* Ko 2 groovy user-interface selenium automated-tests geb

我们的应用程序有一些不稳定的测试,有时会成功通过,有时会WaitTimeoutException在页面加载期间失败.我发现我们正在使用像waitFor(time)和的方法sleep(time).它们之间有什么区别,哪个更好?或者有一些更好的解决方案来解决这个问题?

twi*_*inj 5

许多情况下都需要等待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手册

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)