让我们考虑一下我需要断言某个元素是否存在的情况。在赛普拉斯中有2种可能的方法:
1) cy.get('button').contains('Save')
2) cy.get('button').contains('Save').should('exist')
在两种情况下,如果“保存”按钮不存在,则测试将失败。
除了可能更好的代码可读性/可维护性之外,我还应该在赛普拉斯测试中添加 .should('exist')的原因是什么?
答案 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');
});
});