【问题标题】:Cypress not retrying assertion赛普拉斯不重试断言
【发布时间】:2021-01-02 03:23:40
【问题描述】:

由于在标题文本上设置了断言,我的赛普拉斯测试行为不一致。这是我的代码:

cy.get('.heading-large').should('contain', 'dashboard') // passes
cy.contains('View details').first().click()
cy.get('.heading-large').should('contain', 'Registration details') // sometimes fails

如果失败,那是因为标题仍然包含“仪表板” - 赛普拉斯似乎没有重试,但给出错误 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。

【问题讨论】:

  • 您是否按照“仅当测试运行程序的浏览器失去焦点(或无头运行)”问题中的建议尝试.click({ force: true })?由于 CSS 设置,一些元素没有actionability{ force: true } 告诉赛普拉斯绕过规则。
  • 感谢 eric99,我刚刚尝试过,但当窗口失焦时仍然出现相同的断言错误。它看起来越来越像我需要等待flake issue 得到解决,同时观察运行的测试!

标签: cypress


【解决方案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')

同样,其他方式会更好。

参考:

【讨论】:

  • 感谢老派!了解有关混叠的最佳实践很有帮助。但是,我的测试仍然表现相同。尝试过您的建议并再运行几次后,看起来问题更多在于赛普拉斯如何处理未聚焦的窗口。我已对您的回复投了赞成票,但由于我是新手,因此尚不可见!
  • 很抱歉,这不是您问题的解决方案。 :(
  • 谢谢,我不认为这是本案的根本原因,但我确实学到了一些有用的东西:)
  • 答案被接受,因为它帮助缩小了根本原因,并为我指出了使测试更有弹性的有用方法:)
【解决方案2】:

看来我们需要等待赛普拉斯错误“Some tests flake only if test runner's browser loses focus (or run headlessly)”得到修复。这是因为我尝试了其他有用的答案,但是当窗口失焦时,我始终面临原始问题。

感谢那些回答和评论的人。

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多