【问题标题】: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 测试中还有哪些原因?

【问题讨论】:

    标签: automated-tests cypress assertion


    【解决方案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');
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-11
      • 2021-12-22
      • 2021-12-21
      • 1970-01-01
      • 2022-07-11
      • 2021-01-02
      • 1970-01-01
      • 2022-07-18
      相关资源
      最近更新 更多