由于标题文本上设置了断言,我的 Cypress 测试表现不一致。这是我的代码:
cy.get('.heading-large').should('contain', 'dashboard') // passes
cy.contains('View details').first().click()
cy.get('.heading-large').should('contain', 'Registration details') // sometimes fails
如果失败,那是因为标题仍然包含“仪表板” - Cypress 似乎没有重试,但给出错误 Timed out retrying: expected '<h1.heading-large>' to contain 'Registration details'
来自阅读 Cypress retry-ability ,我的理解是should
断言应该继续尝试直到超时,超时设置为 "defaultCommandTimeout" : 5000
。即使我在两个页面上有一个具有相同标识符的元素,这种感觉也是如此。我正在测试的应用程序不存在重大性能问题。
如果我不看窗口并且this issue,测试似乎更有可能失败。看起来可能是一个原因。
任何人都可以帮助确定:我的测试或 Cypress 是否存在问题,以及我如何改进测试?我在 MacOS Catalina 上使用 Cypress 5.1.0 和 Chrome 85。
最佳答案
它偶尔会失败,因为在达到超时时,用信息填充 header 的请求尚未解决。
您可以通过设置带有路由别名的路由来解决此问题,以等待请求解析的确切响应,然后再继续点击。
换句话说,当您click()
时,会发送一个请求,该请求会获取您想要在下一个get()
中检查的信息。有时,当您的 get()
超时时,此请求的响应尚未解决。您可以增加超时时间,但不建议这样做,也不是一个好的做法。相反,请等待带有路由和路由别名的特定响应。如果您这样做,在任何情况下,最后一个 get()
都不会被调用,直到它正在查找的信息得到解析。
我不知道你的要求,但它会像这样工作:
// setup the route and alias
cy.server()
cy.route("/youRequestUrlHere").as("myLovelyAlias")
// first get
cy.get('.heading-large').should('contain', 'dashboard')
// this click fires the request url from route() above
cy.contains('View details').first().click()
// wait for route to resolve using route alias
cy.wait("@myLovelyAlias").then((response) => {
// next get called after response resolves
cy.get('.heading-large').should('contain', 'Registration details')
}
引用:
编辑:
如上所述,您还可以作弊并将 defaultCommandTimeout 设置为更高的数字,但不建议这样做,因为您仍然可能遇到响应解析时间比您设置的超时时间长的情况。路由/等待模式是更好、更稳定的方法。
如果您想知道它是如何完成的,您可以将 get()
更改为如下内容:
cy.get('.heading-large', {defaultCommandTimeout: 60000}).should('contain', 'Registration details')
同样,其他方式会更好。
引用:
关于Cypress 不重试断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63900669/