Cypress:当“应该”断言失败时如何捕获错误[关闭]

问题描述 投票:0回答:2

should
断言失败时,我需要捕获错误。 想象一下 .should('not.exist') 的第一个断言失败了(元素仍然可见)

我需要的示例(但这不适用于 Cypress 和 JS):

   this.containsInIframe('tr', assetName)
  .find('div.loader', { timeout: 100000 })
  .should('not.exist')
  .catch((error) => {
    this.reloadPage();
    this.containsInIframe('tr', assetName)
      .find('div.loader', { timeout: 100000 })
      .should('not.exist');
  });

使用Cypress和JS如何处理这种情况?谁能建议解决这个问题的方法吗?

如何捕获 cypress 'should' 断言抛出的错误?

javascript cypress try-catch
2个回答
5
投票

捕获错误相当复杂,因为 Cypress 并不完全按照这种方式运行。

如果您想重试(如 catch 代码所示),该功能内置于 Cypress runner 中。

测试重试

it('retries the test', {retries: {runMode: 2, openMode: 1}}, function() {
  .. test code 
})

3
投票

你可以尝试递归

function reloadUntilLoaderHasGone() {
  this.containsInIframe('tr', assetName)
    .then($tr => {
      const $loader = $tr.find('div.loader')
      if ($loader.length > 0) {
        cy.reload()
        cy.wait(300)
        cy.then(() => reloadUntilLoaderHasGone())
      }
    })
}
reloadUntilLoaderHasGone()

从代码片段中获得确切的模式有点困难,但基本点是

  • 递归重复代码,直到满足条件(例如

    $loader.length === 0
    ,相当于
    .should('not.exist')
    ,但不会失败并停止测试)

  • cy.reload()
    清除页面并创建新元素,因此不要依赖任何先前的结果,而是始终重新查询(看起来你正在这样做)

  • 在递归调用停止不必要的循环之前有一个小

    cy.wait()
    ,但您应该调整等待时间 - 足以完成重新加载和后台操作

  • 递归调用应该在“队列上”完成,因为涉及到 Cypress 队列命令,这就是它被包装在

    cy.then()

    中的原因
  • 如果您怀疑加载程序有时永远不会消失,您应该限制递归次数 - 否则堆栈将溢出

© www.soinside.com 2019 - 2024. All rights reserved.