【问题标题】:Cypress finding DOM element using multiple contains赛普拉斯使用多个包含查找 DOM 元素
【发布时间】:2021-06-01 20:32:39
【问题描述】:

我需要选择列表中的第一封电子邮件,但我不知道它何时到达。

为电子邮件的到达设置较大的超时时间可能会奏效,但我正在寻找更好的解决方案。

我需要选择.subjectconfirm your email address 且时间字段为a few seconds ago 的第一行。

这是我尝试过的:


cy.contains('a few seconds ago')
  .closest('.row') // get the container
  .contains('confirm your email address')

这个解决方案的问题是,如果有一封主题为reset your password的电子邮件,它会先找到它,然后等待最后一个包含超时。

似乎Cypress 没有重新检查整个调用链,只是它失败的最后一个。 (因此它不会从第一个 .get('a few seconds ago') 重新启动,而只会等到 .contains('confirm your email address') 超时。

我也可以运行一些jquery 检查,但是我自己编写超时和重试,这在Cypress 中是不行的...

如何让Cypress 找到满足contains 要求的第一行?


编辑:

如果我在should 中编写多个断言:


  cy.get(".msglist-message", { timeout: 10_000 })
    .should(($row) => {
      // either fails triggers retry
      expect($row.text()).to.match(/a few seconds ago/i);
      expect($row.text()).to.match(new RegExp(subject, "i"));
    })
    .click();

click() 仍然会在所有行上都有引用(匹配 .msglist-message),这出乎我的意料:

cy.click() 只能在单个元素上调用。您的主题包含 7 个元素。如果要连续单击每个元素,请传递 { multiple: true }

所以基本上我只是断言在我的多个contains 条件下,有一行与row 匹配,但我仍然不能在其上使用Cypress 命令,例如click,我没有对该元素的引用。

好像shouldcannot yield a new value with lambda也一样。

当我尝试在should 内单击时,我得到了一些无休止的重试循环:


  cy.get(".msglist-message", { timeout: 10_000 })
    .should(($row) => {
      // either fails triggers retry
      expect($row.text()).to.match(/a few seconds ago/i);
      expect($row.text()).to.match(new RegExp(subject, "i"));

      cy.wrap($row).click()
    })

【问题讨论】:

    标签: javascript automated-tests integration-testing cypress


    【解决方案1】:

    也许颠倒顺序会抓住它?

    cy.contains('confirm your email address')
      .closest('.row') // get the container
      .contains('a few seconds ago')          // do you even need this? timeout === 4 seconds
            
    

    否则.should(() => expect()...)会重试

    cy.get('.row')
      .should($row => {
        // either fails triggers retry
        expect($row.text()).to.match(/a few seconds ago/i)
        expect($row.text()).to.match(/confirm your email address/i)
      })
    

    缩小行列表

    正如您提到的,.should() 不会更改主题,因此后续链会看到所有行。

    要缩小范围,请使用 .contains() 选择单行

    cy.contains('.row', 'Confirm your email address')
      .should($row => {
        // either fails triggers retry
        expect($row.text()).to.match(/a few seconds ago/i)
        expect($row.text()).to.match(/confirm your email address/i)
      })
      .contains('.row', 'Confirm your email address') 
      .click()
    

    或者您可以在顶部应用.contains()

    cy.contains('.row', 'Confirm your email address')
      .should($row => {
        expect($row.text()).to.match(/a few seconds ago/i)
      })
      .click()
    

    或者(逻辑上)“几秒钟前”收到的消息将是顶部的消息

    cy.contains('.row', 'Confirm your email address')
      .should($row => {
        // either fails triggers retry
        expect($row.text()).to.match(/a few seconds ago/i)
        expect($row.text()).to.match(/confirm your email address/i)
      })
      .eq(0) 
      .click()
    

    【讨论】:

    • 我认为这样的事情将会是这样,我只是不能在使用Cypress 的项目上click()。我仍然无法使用此方法引用 DOM 元素。你可以看到我的编辑。
    • 倒序没抓到,我想让测试更可靠。我第一次尝试它时发生了多行a few seconds ago,我想这可能会显示比实际几秒钟更长的持续时间。
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多