Алиасы для запросов

В Cypress алиасы (aliases) представляют собой именованные ссылки на различные объекты или действия, которые позволяют повторно использовать результаты запросов, DOM-элементы или другие объекты в течение теста. Основная цель алиасов — упрощение доступа к данным и повышение читаемости тестов, особенно при работе с асинхронными операциями.

Создание алиасов для запросов

Для того чтобы присвоить алиас запросу, используется метод .as(). Алиас можно присвоить как результату сетевого запроса, так и элементу DOM. В контексте HTTP-запросов часто применяется комбинация команд cy.intercept() и .as().

Пример:

cy.intercept('GET', '/api/users').as('getUsers');

В этом примере любой GET-запрос на /api/users будет перехвачен, и результат запроса можно будет использовать позже через алиас @getUsers.

Ожидание и использование алиасов

После присвоения алиаса к запросу можно использовать cy.wait() для ожидания завершения запроса и получения его ответа. Это особенно важно, если дальнейшие действия зависят от данных, полученных с сервера.

Пример:

cy.wait('@getUsers').then((interception) => {
    expect(interception.response.statusCode).to.equal(200);
    expect(interception.response.body).to.have.length.greaterThan(0);
});

Здесь interception содержит объект с информацией о запросе, включая request и response. Доступ к этим данным позволяет проверять статус, тело ответа, заголовки и другие параметры.

Алиасы для DOM-элементов

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

Пример:

cy.get('#login-button').as('loginBtn');
cy.get('@loginBtn').click();
cy.get('@loginBtn').should('be.disabled');

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

Область действия алиасов

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

Пример использования в beforeEach:

beforeEach(() => {
    cy.intercept('POST', '/api/login').as('loginRequest');
});

it('проверка успешного входа', () => {
    cy.get('#username').type('admin');
    cy.get('#password').type('password');
    cy.get('#login-button').click();
    cy.wait('@loginRequest').its('response.statusCode').should('eq', 200);
});

Алиас @loginRequest доступен внутри теста после его определения в beforeEach.

Комбинация нескольких алиасов

Можно использовать несколько алиасов в одном тесте, например, для последовательных запросов к разным эндпоинтам:

cy.intercept('GET', '/api/users').as('getUsers');
cy.intercept('GET', '/api/posts').as('getPosts');

cy.wait('@getUsers').then((users) => {
    expect(users.response.statusCode).to.equal(200);
});

cy.wait('@getPosts').then((posts) => {
    expect(posts.response.body).to.have.length.greaterThan(0);
});

Такой подход делает тесты структурированными и позволяет точно контролировать порядок выполнения асинхронных операций.

Динамические алиасы

В некоторых сценариях необходимо присваивать алиасы динамически, например, при тестировании данных с разными идентификаторами:

const userIds = [1, 2, 3];

userIds.forEach((id) => {
    cy.intercept('GET', `/api/users/${id}`).as(`getUser${id}`);
});

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

Это позволяет создавать гибкие тесты для работы с множественными сущностями без дублирования кода.

Рекомендации по использованию алиасов

  • Всегда использовать осмысленные имена алиасов. Например, @getUsers лучше, чем @req1.
  • Алиасы облегчают чтение тестов, особенно при сложной цепочке асинхронных операций.
  • Не использовать один и тот же алиас в разных тестах без повторного определения, чтобы избежать конфликтов.
  • Алиасы для DOM-элементов следует использовать при многократных обращениях к элементу, иначе лучше искать элемент напрямую.

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