在 Cypress 的 for 循环中等待异步方法

Tom*_*Tom 6 javascript asynchronous cypress

编辑:为什么这不是重复的:因为Cypress,只是读取而不是将所有内容标记为重复。

编辑 2:另外,请参阅答案以更好地理解通常的异步for循环问题与此问题之间的差异。


我正在编写 cypress 测试,我想创建一个 cypress 命令,用用户列表填充我的数据库。我希望创建循环在移动到下一个用户之前等待每个用户被创建(因为我希望以特定顺序完成)。

现在,我的循环如下所示:

Cypress.Commands.add("populateDb", (users) => {
  var createdItems = []

  for (const user of users) {
    cy.createUser(user, 'passe').then(response => {
      createdUsers.unshift(response.body.user)
    })
  }
  return createdItems
})
Run Code Online (Sandbox Code Playgroud)

当然,这个循环在移动到下一个用户之前不会等待每个用户被创建(我想要“顺序处理”,而不是“并行然后等待所有承诺解决”)

我在这里阅读了有关异步 for 循环的答案:

但我似乎找不到我想要的东西,主要是因为 cypress 不允许我将我的函数声明为异步,如下所示:

Cypress.Commands.add("populateDb", async (users) => {
    //Some code
})
Run Code Online (Sandbox Code Playgroud)

如果我不声明它,async我将无法使用await.

是不是有一些get()方法之王只是同步等待 Promise 解决?

Tom*_*Tom 0

事实证明,赛普拉斯对等待异步方法解析可以做的事情如此严格是有原因的:它总是自动按顺序运行所有异步命令,因为它们被调用,而不是并行,所以这将执行即使是 Async 也是正确的顺序createUser

Cypress.Commands.add("populateDb", (users) => {
  for (const user in users) {
    cy.createUser(user).then(response => {
      console.log(response)
    })
  }
})
Run Code Online (Sandbox Code Playgroud)

如果您想获取返回值(在我的例子中,我需要用户 ID 以便稍后删除它们),您可以将它们存储在var文件根级别并添加一个返回该 var 的 cypress 命令。

var createdItems = []

Cypress.Commands.add("getCreatedItems", () => {
  return createdItems
})

Cypress.Commands.add("populateDb", (users) => {
  for (const user in users) {
    cy.createUser(user).then(response => {
      createdItems.unshift(response) // I unshift() because I need to delete them in FILO order later
    })
  }
})
Run Code Online (Sandbox Code Playgroud)

然后在 cypress 测试文件中,您可以按照需要执行的顺序调用它们:

cy.populateDb(users)
cy.getCreatedItems().then(response => {
  //response is my createdItems Array, and cy.getCreatedItems() will run only when cy.populateDb() is resolved
})
Run Code Online (Sandbox Code Playgroud)