由于在标题文本上设置了断言,因此我的赛普拉斯测试的行为不一致。这是我的代码:
cy.get('.heading-large').should('contain', 'dashboard') // passes
cy.contains('View details').first().click()
cy.get('.heading-large').should('contain', 'Registration details') // sometimes fails
如果失败,是因为标题仍然包含“ dashboard”-赛普拉斯似乎没有重试,但给出了错误Timed out retrying: expected '<h1.heading-large>' to contain 'Registration details'
通过阅读有关Cypress retry-ability的知识,我的理解是should
断言应该一直尝试直到超时,该超时设置为"defaultCommandTimeout" : 5000
。即使我在两个页面上具有相同标识符的元素也是如此。我正在测试的应用程序没有主要的性能问题。
如果我不看窗口,则测试似乎更有可能失败,并且this issue似乎是可能的原因。
任何人都可以帮助确定:我的测试或赛普拉斯是否存在问题,我应该如何改进测试?我在MacOS Catalina上使用Cypress 5.1.0和Chrome 85。
答案 0 :(得分:1)
有时会失败,因为在达到超时时间之前尚未解决用信息填充标头的请求。
您可以通过设置带有路由别名的路由来解决该问题,然后在继续单击之前等待请求的确切响应得到解决。
换句话说,当您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')
再次,其他方法会更好。
参考:
答案 1 :(得分:1)
看来我们需要等待Cypress错误“ Some tests flake only if test runner's browser loses focus (or run headlessly)”被修复。这是因为我尝试了其他有用的答案,但是当窗口焦点不对准时,始终会遇到原始问题。
感谢那些回答和评论过的人。