【发布时间】:2021-06-01 20:32:39
【问题描述】:
我需要选择列表中的第一封电子邮件,但我不知道它何时到达。
为电子邮件的到达设置较大的超时时间可能会奏效,但我正在寻找更好的解决方案。
我需要选择.subject 为confirm 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