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

时间:2019-07-16 09:44:08

标签: automated-tests cypress assertion

让我们考虑一下我需要断言某个元素是否存在的情况。在赛普拉斯中有2种可能的方法:

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

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

除了可能更好的代码可读性/可维护性之外,我还应该在赛普拉斯测试中添加 .should('exist')的原因是什么?

2 个答案:

答案 0 :(得分: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')-测试失败

答案 1 :(得分:0)

实际上,直到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');
    });
});