#arrays #cypress
Вопрос:
Как использовать массив в Cypress? Я пытаюсь извлечь данные excel в JSON и сохранить их в массиве, пока процедура работает, но когда я пытаюсь вызвать массив, который я использовал раньше, он работает плохо
Вот скриншот:
Комментарии:
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)
})