等待 Cypresseach() 函数完成

Boo*_*oon 5 javascript arrays each async-await cypress

我正在调用一个函数populateArray,该函数使用函数选取页面上的元素children()。我想将属性值存储到 usingeach()函数中。这就是我正在做的事情

static populateArray(){
let arr = []

 cy.xpath(NODE_PREVIEW_PANEL).children(NODE_TYPE)
                 .each((element, index, list) => arr.push(cy.wrap(element).invoke('attr', 'data-testid')))
}
Run Code Online (Sandbox Code Playgroud)

问题是当我通过将其分配给变量来调用该函数时

actualArray = ArticlePage.populateArray()

它不等待底层的each()函数完全完成。它只是选择部分值并继续。我想只有在完全解决actualArray之后才有值。populateArray

小智 4

使用怎么样Cypress.Promise?来自文档

Cypress 具有 Promise 意识,因此如果您从 .then() 等命令内部返回 Promise,Cypress将不会继续,直到这些 Promise 解决

const populateArray = () => {
  return new Cypress.Promise((resolve, reject) => {
    let arr = []
    cy.xpath('//ul')
      .children('li')
      .each(element => arr.push(element.attr('data-testid'))) // NOTE different push
      .then(() => {
        return resolve(arr)
      })
  })
}
Run Code Online (Sandbox Code Playgroud)

使用await 调用(测试必须是异步的),

it('gets the array', async () => {

  const actualArray = await ArticlePage.populateArray();
  expect(actualArray).to.deep.equal(['1', '2', '3']);  // whatever is in 'data-testid'

})
Run Code Online (Sandbox Code Playgroud)