#cypress
Вопрос:
Следующее значение извлекается в пользовательской команде Cypress,
listOfResults = [{"name":"x","amount":"99"}, {"name":"y","amount":"88"}]
и команда такова,
Cypress.Commands.add("getResultList", (keyWord, ...args) => {
var listOfResults = [];
cy.get('[class="result"]')
.each((resultItem) => {
var singleResult = {};
//Retrive Title
cy.wrap(resultItem)
.find('.name')
.invoke("text")
.then((val) => {
const title = val.replaceAll("n", "");
singleResult.title = title;
});
//Retrive price
cy.wrap(resultItem)
.find('.price')
.invoke("text")
.then((val) => {
const price = val.replaceAll("n", "");
singleResult.amount = price;
});
cy.then(() => {
listOfResults.push(singleResult);
});
})
.then(() => {
cy.log(listOfResults);//prints. correctly
cy.wrap(listOfResults);
//tried also return cy.wrap(listOfResults);
});
});
и в тесте я пытаюсь получить доступ к нему и сохранить его.
//fetch all data in Search Results page and store it
var resultList = cy.getResultList();
cy.log("length:" resultList.length);
Но это не сохраняется и resultList.length
регистрируется undefined
. Как мы могли бы заставить команду возвращать значение?
Ответ №1:
В пользовательской команде вы должны сделать:
return cy.wrap(listOfResults)
Затем в вашем тесте:
cy.getResultList(keyWord, ...args).then((listOfResults) => {
//Do something here with listOfResults
})
С тех пор wrap()
возвращается Кипарис.Соединяясь цепью, мы можем вызывать .then()
наши команды.
Комментарии:
1. Это работает, и вы также можете отказаться от всего
.then()
этого.
Ответ №2:
Я думаю, что просто добавить два возврата будет нормально,
Cypress.Commands.add("getResultList", (keyWord, ...args) => {
var listOfResults = [];
return cy.get('[class="result"]')
.each((resultItem) => {
var singleResult = {};
//Retrive Title
cy.wrap(resultItem)
.find('.name')
.invoke("text")
.then((val) => {
const title = val.replaceAll("n", "");
singleResult.title = title;
});
//Retrive price
cy.wrap(resultItem)
.find('.price')
.invoke("text")
.then((val) => {
const price = val.replaceAll("n", "");
singleResult.amount = price;
});
cy.then(() => {
listOfResults.push(singleResult);
});
})
.then(() => {
cy.log(listOfResults);//prints. correctly
cy.wrap(listOfResults);
return cy.wrap(listOfResults); // this modifies the outer return
});
});
Должен использоваться в тесте с .then()
любой командой
cy.getResultList(keyword).then(resultList => {
...
Чтобы лучше проиллюстрировать точку зрения Алапана, в пользовательской команде автоматически возвращается результат последней команды.
Так что это минимум, необходимый для вашей команды
Cypress.Commands.add("getResultList", (keyWord, ...args) => {
var listOfResults = [];
cy.get('[class="result"]')
.each((resultItem) => {
var singleResult = {};
//Retrive Title
cy.wrap(resultItem)
.find('.name')
.invoke("text")
.then((val) => {
const title = val.replaceAll("n", "");
singleResult.title = title;
});
//Retrive price
cy.wrap(resultItem)
.find('.price')
.invoke("text")
.then((val) => {
const price = val.replaceAll("n", "");
singleResult.amount = price;
});
cy.then(() => {
listOfResults.push(singleResult);
});
})
cy.wrap(listOfResults) // last command, Cypress returns this
});