当
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' 断言抛出的错误?
捕获错误相当复杂,因为 Cypress 并不完全按照这种方式运行。
如果您想重试(如 catch 代码所示),该功能内置于 Cypress runner 中。
it('retries the test', {retries: {runMode: 2, openMode: 1}}, function() {
.. test code
})
你可以尝试递归
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()
中的原因
如果您怀疑加载程序有时永远不会消失,您应该限制递归次数 - 否则堆栈将溢出