Рандомизирующий выбор элементов для Cypress тестов - PullRequest
2 голосов
/ 25 апреля 2020

В настоящее время тестирую местный веб-сайт мов ie, где я должен ввести определенное количество билетов для выбранного мов ie. Скриншот прикрепленного экрана здесь -

enter image description here

Репозиторий для воспроизведения проблемы - https://github.com/zac11/iCinema

  1. Клонируйте репо.
  2. Go в каталоге client и выполните npm i
  3. Запустите npm start из каталога root.
  4. Webapp будет открыть в localhost:3000

Я хочу иметь возможность произвольно вводить билеты mov ie на выбранные фильмы таким образом, чтобы он выбирал случайную категорию билетов нашего из четыре и вводит номер билета, скажем, 2

Сейчас я могу заполнить категорию билета, жестко закодировав локатор таким образом -

  cy.get('div.tickets-info > div:nth-child(1) > span > b').type(3,{force:true});

, который вводит количество билетов для категории Junior Ticket. Я хочу иметь возможность произвольно вводить заявку в любую из четырех категорий без необходимости жестко кодировать локатор категории.

PS - Хранилище также содержит кипарисные тесты, которые можно запустить с помощью npm run test

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Мне нужно было сделать то же самое с нашим приложением, поэтому я придумал пользовательскую команду , чтобы легко это сделать. Вот код, который я придумал в cypress/support/commands.js:

Cypress.Commands.add('any', { prevSubject: 'element' }, (subject, size = 1) => {
  return cy.wrap(subject).then(elementList => {

    // this line enables me to use this command with either cy.get() or cy.wrap()
    elementList = (elementList.jquery) ? elementList.get() : elementList;

    elementList = Cypress._.sampleSize(elementList, size);
    elementList = (elementList.length > 1) ? elementList : elementList[0];

    return cy.wrap(elementList);
  });
});

Я также могу использовать настраиваемое ведение журнала с Cypress.log () в ваших пользовательских командах. Я удалил его из приведенного выше кода для ясности.

Затем вы используете его в своих тестах, как и любые другие команды cy:

cy.get('div.tickets-info > div > span > b').any().type(3,{force:true});

или если вам нужно более одной:

cy.get('div.tickets-info > div > span > b').any(2).each(element => {
    cy.wrap(element).type(2, { force: true });
});
1 голос
/ 25 апреля 2020

Вы можете рандомизировать категорию на основе следующего:

const picked = Math.floor(Math.random()*3); // this gives you a random value from 0 - 3;

// using template string literals - we can add that into picked
cy.get(`div.tickets-info > div:nth-child(`${picked}`) > span > b`).type(3, {force: true})

из выбранного - вы можете иметь массив элементов, связанных с категориями:

const categories = ["Junior", "student", "normal", "senior"]

Вы также можете иметь значения билетов в categories в качестве объектов и использовать их для расчета общей суммы.

const categories = [{
  type: "junior", 
  value: 5
}, {
  type: "student",
  value: 3
}, {
  type: "normal"
  value: 10
}, {
  type: "senior",
  value: 3
}]

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

const value = categories[picked].value * random_amount;
cy.get(".sum-field label:nth-child(1)").should("contain", value) // total
...