user-interface - Geb 测试经常失败并出现 WaitTimeoutException : condition did not pass in 99. 0 秒

标签 user-interface selenium groovy automated-tests geb

我们的应用程序有一些不稳定的测试,有时会成功通过,有时会在页面加载期间因 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 manual

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/

相关文章:

java - 如何将 Gui jar 转换为命令行 jar?

java - SWT:选项卡中的可滚动区域

Java Selenium HtmlUnitDriver - 由于 Ajax 调用,Gwt 源未填充

selenium - 使用 selenium : chrome screensharing auto select tab and share with audio 进行测试

groovy - 如何从Groovy文件解析多个类

c# - 对 Windows 服务和 GUI 使用相同的 app.config

JavaFX:如何为组合框设置操作?

jquery - 使用 Capybara、Selenium、JS 测试 Control+Click

java - 常规闭包内部如何工作?

Jenkins:以编程方式添加项目默认构建授权