Верните значение массива из пользовательской команды cypress и получите доступ к нему из теста

#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

});