В 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, чтобы избежать повторного поиска по странице.
Пример:
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.Алиасы являются мощным инструментом Cypress, позволяющим структурировать тесты, упрощать работу с асинхронными запросами и поддерживать код тестов чистым и поддерживаемым.