Использование массива в cypress

#arrays #cypress

Вопрос:

Как использовать массив в Cypress? Я пытаюсь извлечь данные excel в JSON и сохранить их в массиве, пока процедура работает, но когда я пытаюсь вызвать массив, который я использовал раньше, он работает плохо

Вот скриншот:

excelExtraction.spec.js

index.js

Результат

Комментарии:

1. Это может происходить из-за асинхронного поведения JS, последние две инструкции журнала выполняются еще раньше cy.task . Как насчет того, чтобы перенести все cy.log заявления внутрь cy.task ?

2. цель этого состоит в том, чтобы повторно использовать массив для последующего использования

Ответ №1:

cy.log() Инструкции выполняются после задачи, но они принимают свое значение до того, как задача начнет выполняться.

  • cy.log(dataList) — dataList это ссылка на внешний массив, его содержимое оценивается во время печати.
  • cy.log(dataList[1]) — оценивает dataList[1] перед выполнением задачи
  • cy.log(dataList.length) — оценивает dataList.length перед выполнением задачи

Доступ к данным следует осуществлять в асинхронном обратном вызове, чтобы убедиться, что вы видите правильные значения.

Некоторые примеры

 cy.task("generateJsonFromExcel", ...)
  .then((user) =>
    const dataList = [];
    ...
    return dataList;
  })
  .then(() => {
    cy.log(dataList)
    cy.log(dataList[1])
    cy.log(dataList.length)
  }) 
 

или псевдоним результата

 cy.task("generateJsonFromExcel", ...)
  .then((user) =>
    const dataList = [];
    ...
    return dataList;
  })
  .as('dataList')

cy.get('@dataList').then(() => {
    cy.log(dataList)
    cy.log(dataList[1])
    cy.log(dataList.length)
  }) 
 

Ответ №2:

Один из вариантов-вызвать свою задачу в before()

 describe('testing with dataList', () => {

  let dataList = [];

  before(() => {
    cy.task("generateJsonFromExcel", { excelFilePath, excelSheetName })
      .then((users) => {
        dataList = [...users].map(user => user.Email)
      })
  })

  it('logs the loaded dataList', () => {
    
    cy.log(dataList)
    cy.log(dataList[1])
    cy.log(dataList.length)
  })