赛普拉斯-迭代每个元素并在移动到下一个迭代/元素之前执行一些操作元素、迭代、并在、操作

2023-09-03 08:27:14 作者:敌敌畏一瓶就好、

我在柏树上有以下问题:

获取包含按钮的特定列的所有表格单元格。 遍历每个单元格--在该单元格中找到按钮。 单击该按钮。 等待出现模式对话框 接受模式并等待它消失。 等待通知出现,然后消失。 移动到下一个单元格元素/迭代

我到目前为止拥有的代码:

cy.get("tr[some attribute]").each(($element, $index, $list) => {
cy.wrap($element).find("button").click();
cy.get(".modal-dialog").should('be.visible');
cy.get(".modal-dialog button[type='submit']").should('be.visible').click();
cy.get("toast").should('be.visible').as('@toast')
cy.get('@toast').should('not.be.visible')
})
赛普拉斯汽车产品线日趋丰富,2012年至2016年间汽车业务年复合增长率高达121

此处的问题:

柏树不会等待第一次迭代结束,而是运行所有迭代。我可以看到打开了多个模式对话框。 Cypress异步单击所有按钮,而无需等待上一次迭代完成。 尽管我可以看到Toast消息不在那里,但Cypress在预期Toast将消失的步骤中失败。

提前谢谢!

推荐答案

我运行了一个简单的应用程序,带有模式和吐司。如果您修复了测试的Toast部分,则可以使用.each()

迭代行

若要修复吐司,您需要删除别名并cy.get('toast')第二次。

别名值存储在内部,在should()执行重试时不会更改。请记住,Toast将在屏幕上停留几秒钟,因此您必须使用重试来测试它是否已消失。(您可能需要根据吐司持续时间增加超时时间)。

要修复的最小更改:

cy.get("tr[some attribute]").each(($row) => {
  cy.wrap($row).find("button").click();
  
  cy.get(".modal-dialog").should('be.visible');
  cy.get(".modal-dialog button[type='submit']").should('be.visible').click();

  cy.get("toast").should('be.visible')
  // timeout must exceed toast auto-close period
  // if you run the test in background or in CI, allow a few seconds extra
  cy.get('toast', {timeout:10000}).should('not.be.visible') 

})

我一次只在屏幕上看到一个吐司,迭代等待cy.get('toast', {timeout:10000}).should('not.be.visible') 完成。