.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') 断言在赛普拉斯上是多余的吗?的主要内容,如果未能解决你的问题,请参考以下文章