Как создать функцию, чтобы избежать повторяющихся шагов?

Я хочу создать функцию, чтобы избежать повторения кода на Cypress.

Задача:

Мне нужно войти в систему с разными типами пользователей (с разными разрешениями) и я хочу проверить, какой тип пользователя получает ошибку «403 Forbidden» на желаемом пути. Поскольку у меня 6 типов пользователей и 11 разных путей, приведенный ниже код повторяется для каждого отдельного пользователя / пути, что меня не устраивает.

        cy.visit('/abc')

          .get('[data-qa = "http-error.section"]')
          .should('exist')
          .contains('403')
          .visit('/def')
          .get('[data-qa = "http-error.section"]')
          .should('exist')
          .contains('403')

          .get('[data-qa = "logout"]')
          .click()

Как я могу создать функцию, например check403 (), и реализовать в ней набор элементов управления? Чтобы код выглядел так:

          cy.visit('/abc')
            .check403()
            .visit('/def')
            .check403()
            .get('[data-qa = "logout"]')
            .click()

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

Что я пробовал:

  • Я попытался создать настраиваемую команду Cypress, но это не сработало.
  • Я попытался создать функцию и переместил ее за пределы фактического корпуса и назвал ее как cy.check403(), но затем у меня возникла ошибка cy.check403() is not a function на Cypress.

Обновлять

Я определил всех пользователей внутри users.json в папке fixtures. Я вхожу в систему с каждым пользователем отдельно, а остальное делаю. Мой код находится под afterlogin.spec.js.

Вот полный код, но он слишком длинный, чтобы выполнить такую ​​простую задачу. Может, поможет:

it('Unauthorized users are redirected to a 403 page', () => {
cy.fixture('users.json').then(users => {
  cy.login(
    users[Cypress.env('ENVIRONMENT')].driver,
    Cypress.env('DEFAULT_USER_PASSWORD')
  ).then(response => {
    cy.setCookie('__bl_pp__', response.body.result.access_token)
      .visit('/me')
      .get('[data-qa = "roles"]')
      .contains('driver')
      .visit('/offers')
      .get('[data-qa = "http-error.section"]')
      .should('exist')
      .contains('403')
      .get('[data-qa = "back-to-homepage"]')
      .should('exist')
      .visit('/drivers')
      .get('[data-qa = "http-error.section"]')
      .should('exist')
      .contains('403')
      .get('[data-qa = "logout"]')
      .click()

    cy.login(
      users[Cypress.env('ENVIRONMENT')].dispatcher,
      Cypress.env('DEFAULT_USER_PASSWORD')
    ).then(response => {
      cy.setCookie('__bl_pp__', response.body.result.access_token)
        .visit('/me')
        .get('[data-qa = "roles"]')
        .contains('dispatcher')
        .visit('/offers')
        .get('[data-qa = "http-error.section"]')
        .should('exist')
        .contains('403')
        .get('[data-qa = "logout"]')
        .click()

      cy.login(
        users[Cypress.env('ENVIRONMENT')].provider,
        Cypress.env('DEFAULT_USER_PASSWORD')
      ).then(response => {
        cy.setCookie('__bl_pp__', response.body.result.access_token)
          .visit('/me')
          .get('[data-qa = "roles"]')
          .contains('provider')
          .visit('/planned')
          .get('[data-qa = "http-error.section"]')
          .should('exist')
          .contains('403')
          .visit('/finished')
          .get('[data-qa = "http-error.section"]')
          .should('exist')
          .contains('403')
          .get('[data-qa = "logout"]')
          .click()

        cy.login(
          users[Cypress.env('ENVIRONMENT')].reviewer,
          Cypress.env('DEFAULT_USER_PASSWORD')
        ).then(response => {
          cy.setCookie('__bl_pp__', response.body.result.access_token)
            .visit('/me')
            .get('[data-qa = "roles"]')
            .contains('reviewer')
            .visit('/offers')
            .get('[data-qa = "http-error.section"]')
            .should('exist')
            .contains('403')
            .visit('/planned')
            .get('[data-qa = "http-error.section"]')
            .should('exist')
            .contains('403')
            .get('[data-qa = "logout"]')
            .click()

          cy.login(
            users[Cypress.env('ENVIRONMENT')].admin,
            Cypress.env('DEFAULT_USER_PASSWORD')
          ).then(response => {
            cy.setCookie('__bl_pp__', response.body.result.access_token)
              .visit('/me')
              .get('[data-qa = "roles"]')
              .contains('admin')
              .visit('/offers')
              .get('[data-qa = "http-error.section"]')
              .should('exist')
              .contains('403')
              .visit('/planned')
              .get('[data-qa = "http-error.section"]')
              .should('exist')
              .contains('403')
              .visit('/finished')
              .get('[data-qa = "http-error.section"]')
              .should('exist')
              .contains('403')
              .get('[data-qa = "logout"]')
              .click()
          })
        })
      })
    })
  })
})

Можете ли вы опубликовать ошибку, которую вы получили, когда пользовательская команда не работала?

Brendan 13.12.2018 17:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
638
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Cypress.Commands.add("check403", () => {
  cy.get('[data-qa = "http-error.section"]')
    .should('exist')
    .should('contain', '403'); // I changed this - you didn't mention that it
      // didn't work, but it would have been returning an element, not asserting
});

Я перезапущу свой код и сообщу вам об ошибке. Думаю, я не вернул элемент. Вероятно, это была ошибка.

Ziya I. Erogul 14.12.2018 00:47

Не уверен на 100%, где пользователи и пути подходят в показанном коде, но вы можете повторить тест, например, с помощью простого цикла javascript.

const users = ['Joe', 'Jim', 'John']
const paths = ['Add', 'Edit', 'Remove']

users.forEach(user => {
  paths.forEach(path => {

    it(`should test user '${user}' and path '${path}'`, => {
      // test code here
    })

  })
})

Может быть, это,

const roles = ['driver', 'dispatcher', 'provider', 'reviewer', 'admin'];

context('Unauthorized users are redirected to a 403 page', () => {
  cy.fixture('users.json').then(users => {

    const user = users[Cypress.env('ENVIRONMENT')];
    roles.forEach(role => {

      it(`testing user '${user}' and role '${role}'`, () => {

        cy.login(user[role], Cypress.env('DEFAULT_USER_PASSWORD'))
          .then(response => {
            cy.setCookie('__bl_pp__', response.body.result.access_token);
            cy.visit('/me').get('[data-qa = "roles"]').contains(role);
            cy.visit('/offers').get('[data-qa = "http-error.section"]')
              .should('exist').contains('403')
              .get('[data-qa = "back-to-homepage"]').should('exist')
            cy.visit('/drivers').get('[data-qa = "http-error.section"]')
              .should('exist').contains('403')
              .get('[data-qa = "logout"]').click()
          })
      })
  })

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

Ziya I. Erogul 14.12.2018 00:35

Другие вопросы по теме