Алиасы в Cypress — это механизм присвоения удобных ссылок на DOM-элементы или другие объекты, используемый для упрощения повторного доступа к ним в тестах. Основная цель алиасов — сделать код более читаемым, поддерживаемым и уменьшить дублирование запросов к элементам страницы.
Алиас создается с помощью метода .as(), который
применяется к цепочке команд Cypress. Стандартная форма выглядит
так:
cy.get('селектор').as('имяАлиаса')
Пример:
cy.get('#login-button').as('loginBtn')
После этого к элементу можно обращаться через
@имяАлиаса:
cy.get('@loginBtn').click()
Важно понимать, что алиас не хранит элемент напрямую, а лишь ссылку на цепочку поиска. Cypress повторно выполняет поиск каждый раз, когда используется алиас, что обеспечивает актуальность элемента даже после изменений DOM.
Для элементов с динамическими селекторами или вложенной структурой
удобно комбинировать алиасы с методами .find(),
.children(), .eq():
cy.get('.form').as('loginForm')
cy.get('@loginForm').find('input[name="username"]').as('usernameInput')
cy.get('@usernameInput').type('admin')
Такой подход улучшает читаемость и делает тесты более структурированными.
Алиасы могут использоваться не только для элементов, но и для данных,
полученных через cy.request() или другие команды Cypress.
Пример:
cy.request('/api/users').as('usersData')
cy.get('@usersData').then((response) => {
expect(response.status).to.eq(200)
expect(response.body).to.have.length.greaterThan(0)
})
Использование алиасов для данных позволяет обращаться к результатам асинхронных операций без необходимости повторно вызывать API-запрос.
Алиасы имеют область видимости в пределах одного теста
(it) или блока beforeEach. Попытка обратиться
к алиасу из другого теста приведет к ошибке:
describe('Тестирование формы', () => {
beforeEach(() => {
cy.get('#login-button').as('loginBtn')
})
it('кликает по кнопке', () => {
cy.get('@loginBtn').click()
})
it('проверяет видимость кнопки', () => {
cy.get('@loginBtn').should('be.visible')
})
})
В этом примере алиас создается в beforeEach, что
позволяет использовать его в каждом тесте внутри
describe.
cy.wrapИногда нужно создать алиас для объекта, который не является
результатом команд Cypress. В таких случаях используется
cy.wrap():
const user = { name: 'Alice', age: 25 }
cy.wrap(user).as('userData')
cy.get('@userData').then((u) => {
expect(u.name).to.eq('Alice')
})
cy.wrap() превращает любой объект в цепочку команд
Cypress, делая возможным использование всех стандартных методов работы с
алиасами.
cy.get() и cy.request().@loginButton, @usernameInput), чтобы сразу
было понятно, к чему они относятся..find(),
.eq(), .children() для работы со сложными
компонентами.describe('Форма логина', () => {
beforeEach(() => {
cy.visit('/login')
cy.get('form#loginForm').as('loginForm')
cy.get('@loginForm').find('input[name="username"]').as('usernameInput')
cy.get('@loginForm').find('input[name="password"]').as('passwordInput')
cy.get('@loginForm').find('button[type="submit"]').as('submitBtn')
})
it('вводит данные и логинится', () => {
cy.get('@usernameInput').type('admin')
cy.get('@passwordInput').type('12345')
cy.get('@submitBtn').click()
cy.url().should('include', '/dashboard')
})
})
В этом примере использование алиасов делает код компактным и легко
читаемым, а изменения структуры формы потребуют исправлений только в
блоке beforeEach, а не во всех тестах.
Алиасы в Cypress — это ключевой инструмент для упрощения тестирования, особенно в крупных проектах с повторяющимися элементами и асинхронными данными. Они повышают устойчивость тестов к изменениям DOM и улучшают структуру кода.