Javascript 使用多个包含查找DOM元素的Cypress

Javascript 使用多个包含查找DOM元素的Cypress,javascript,automated-tests,integration-testing,cypress,Javascript,Automated Tests,Integration Testing,Cypress,我需要选择列表中的第一封电子邮件,但我不知道它何时到达 设置电子邮件到达的大超时可能会起作用,但我正在寻找更好的解决方案 我需要选择.subject为确认您的电子邮件地址的第一行,时间字段为几秒钟前的 这就是我尝试过的: cy.contains('a few seconds ago') .closest('.row') // get the container .contains('confirm your email address') 此解决方案的问题是,如果有主题为“重置密码

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

设置电子邮件到达的大超时可能会起作用,但我正在寻找更好的解决方案

我需要选择
.subject
确认您的电子邮件地址
的第一行,时间字段为几秒钟前的

这就是我尝试过的:


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

此解决方案的问题是,如果有主题为“重置密码”的电子邮件,它将首先找到该邮件,然后等待最后一封邮件超时

似乎
Cypress
没有重新检查整个调用链,只是最后一次失败。(因此它不会从第一个
.get('几秒钟前')
重新启动,而是只等待
.contains('confirm your email address')
超时

我也可以运行一些
jquery
检查,但是我自己编写超时和重试,这是一个禁止进入的
Cypress

如何使
Cypress
找到满足两个
要求的第一行


编辑:

如果在
中写入多个断言,则应


  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消息相匹配的行)上具有引用,这是我意想不到的:

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

所以基本上我只是断言有一行与
匹配,因为我的多个
包含
条件,但我仍然不能对其使用
Cypress
命令,比如
单击
,我没有该元素的引用

似乎
应该

当我试图在
应该
中单击时,我得到了一些无休止的重试循环:


  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()
    })


也许颠倒顺序就能抓住它

cy.contains('确认您的电子邮件地址')
.closest('.row')//获取容器
.contains('几秒钟前)//您需要这个吗?超时===4秒
否则,
.should(()=>expect()…)
将重试

cy.get(“.row”)
.should($row=>{
//失败或触发重试
期望($row.text()).to.match(/几秒钟前/i)
期望($row.text()).to.match(/确认您的电子邮件地址/i)
})
缩小行列表的范围

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

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

cy.contains(“.row”,“确认您的电子邮件地址”)
.should($row=>{
//失败或触发重试
期望($row.text()).to.match(/几秒钟前/i)
期望($row.text()).to.match(/确认您的电子邮件地址/i)
})
.contains(“.row”,“确认您的电子邮件地址”)
。单击()
也可以应用顶部的
.contains()

cy.contains(“.row”,“确认您的电子邮件地址”)
.should($row=>{
期望($row.text()).to.match(/几秒钟前/i)
})
。单击()
或者(逻辑上)在“几秒钟前”收到的消息将位于顶部

cy.contains(“.row”,“确认您的电子邮件地址”)
.should($row=>{
//失败或触发重试
期望($row.text()).to.match(/几秒钟前/i)
期望($row.text()).to.match(/确认您的电子邮件地址/i)
})
.eq(0)
。单击()

我想这样的事情会成为现实,我就是不能
点击()
使用
Cypress对该项执行操作。我仍然无法使用此方法对DOM元素进行引用。您可以看到我的编辑。颠倒顺序没有捕捉到它,我想让测试更可靠。几秒钟前第一次尝试时,出现了多行
,我想这可能会在某些情况下显示出来持续时间比实际的几秒钟还要长。