Алиасы для данных

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


Создание алиасов для элементов DOM

Cypress позволяет назначать алиасы любым найденным элементам через команду .as(). Это упрощает многократное использование элементов в разных шагах теста без повторного поиска.

cy.get('form#login').as('loginForm');
cy.get('@loginForm').within(() => {
  cy.get('input[name="username"]').type('admin');
  cy.get('input[name="password"]').type('password');
  cy.get('button[type="submit"]').click();
});

Ключевые моменты:

  • cy.get('селектор').as('имя') — сохраняет найденный элемент под алиасом.
  • Обращение к алиасу происходит через @имя.
  • Алиасы действуют только внутри того теста, в котором они были объявлены.

Алиасы для данных из HTTP-запросов

Cypress часто используется для тестирования взаимодействия с API. Результаты запросов удобно сохранять в алиас, чтобы использовать их в последующих шагах.

cy.request('GET', '/api/users').as('usersList');
cy.get('@usersList').then((response) => {
  expect(response.status).to.eq(200);
  expect(response.body).to.have.length.greaterThan(0);
});

Особенности использования:

  • Алиас хранит объект ответа, включая status, body и headers.
  • Для работы с данными рекомендуется использовать .then(), чтобы гарантировать доступ к значениям после завершения запроса.

Алиасы для stub и spy

Cypress интегрируется с методами cy.intercept и позволяет отслеживать сетевые запросы через алиасы.

cy.intercept('POST', '/api/login').as('loginRequest');

cy.get('button[type="submit"]').click();

cy.wait('@loginRequest').its('response.statusCode').should('eq', 200);

Заметки по работе с алиасами intercept:

  • Алиас сохраняет объект запроса и ответа.
  • Команда cy.wait('@имя') ожидает завершения запроса и возвращает данные для проверки.
  • Позволяет проверять statusCode, тело запроса, параметры и заголовки.

Алиасы для сложных данных и вычислений

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

cy.get('input[name="quantity"]').invoke('val').then((quantity) => {
  cy.wrap(quantity).as('currentQuantity');
});

cy.get('@currentQuantity').then((qty) => {
  const doubled = qty * 2;
  cy.log(`Удвоенное значение: ${doubled}`);
});

Особенности:

  • Для хранения произвольных данных используется cy.wrap(value).as('имя').
  • Алиас может хранить не только элементы или ответы, но и любые объекты или значения.

Использование алиасов с before и beforeEach

Для подготовки данных до выполнения тестов удобно создавать алиасы в хуках before и beforeEach.

beforeEach(() => {
  cy.request('GET', '/api/products').as('products');
});

it('Проверка первого продукта', () => {
  cy.get('@products').then((response) => {
    expect(response.body[0]).to.have.property('name');
  });
});

Важно:

  • Алиас, созданный в beforeEach, доступен в каждом тесте.
  • Алиас в before также будет доступен в тестах, но если тесты изменяют данные, рекомендуется использовать beforeEach для гарантии свежего состояния.

Ограничения и нюансы

  • Алиасы не являются глобальными между тестами, их область действия ограничена одним тестовым блоком (it) или хуками.
  • Использование алиасов в асинхронных операциях требует применения .then() или cy.wrap().
  • Неправильное использование алиасов может приводить к ошибкам доступа к данным до их инициализации.

Резюме по применению

Алиасы в Cypress позволяют:

  • Сохранять элементы DOM для повторного использования.
  • Хранить результаты HTTP-запросов и манипулировать ими.
  • Отслеживать сетевые вызовы через cy.intercept.
  • Сохранять промежуточные вычисленные значения.
  • Использовать подготовленные данные в хуках before и beforeEach.

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