.should('exist') 断言在赛普拉斯上是多余的吗?

Posted

技术标签:

【中文标题】.should(\'exist\') 断言在赛普拉斯上是多余的吗?【英文标题】:Is the .should('exist') assertion redundant on Cypress?.should('exist') 断言在赛普拉斯上是多余的吗? 【发布时间】:2019-11-25 00:31:18 【问题描述】:

让我们考虑一下我需要断言元素是否存在的情况。在 cypress 中有两种可能的方法:

1) cy.get('button').contains('Save')
2) cy.get('button').contains('Save').should('exist')

在这两种情况下,如果“保存”按钮不存在,测试将失败。

除了可能更好的代码可读性/可维护性之外,我应该将 .should('exist') 添加到我的 cypress 测试中还有哪些原因?

【问题讨论】:

【参考方案1】:

对于断言元素是否存在的用例,它们确实是多余的。

.contains() 产生一个 DOM 元素,根据documentation,.should 产生与作为输入给出的相同元素。当 .should 产生不同的元素时有一些例外(如您在文档中所见),但在使用 should('exist') 的情况下,它们确实是多余的

正如您所提到的,我个人也更喜欢添加should 以提高可读性。实际上我更喜欢.should('be.visible'),因为以下情况 - 当一个元素由于某些 CSS 问题而被隐藏或被推出屏幕时,从用户的角度来看它并不存在。但是..

cy.get('button').contains('Save') - 通过测试

cy.get('button').contains('Save').should('exist') - 通过测试

cy.get('button').contains('Save').should('be.visible') - 测试失败

【讨论】:

但我们真的希望必须对浏览器可见视口之外的元素使用scrollIntoView 吗?【参考方案2】:

实际上,直到 v4.0 发布(并合并 this PR),如果您自己链接任何否定断言,则需要链接 should('exist') 断言。这是因为默认的should('exist') 断言is skipped when you chain your own assertions。

肯定断言没有必要,因为它们不会传递不存在的元素。

另见Implicit should 'exist' assertion is not being applied on cy.get() when other assertion.

下面,元素.first-item不存在但断言通过:

describe('test', () => 
    it('test', () => 
        cy.get('.first-item').should('not.have.class', 'is-selected');
    );
);

【讨论】:

以上是关于.should('exist') 断言在赛普拉斯上是多余的吗?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法断言赛普拉斯没有调用路由?

赛普拉斯 - iframe 处理

赛普拉斯:如何验证字体颜色与预期不符

赛普拉斯断言文本

如何在赛普拉斯中使用灯具列表断言列表

赛普拉斯在开玩笑断言中导致类型错误