Cypress устанавливается через npm и интегрируется в проект JavaScript. Команда для установки:
npm install cypress --save-dev
После установки Cypress можно открыть через команду:
npx cypress open
Это запускает графический интерфейс с доступом к примерным тестам. Для запуска тестов в консоли используется:
npx cypress run
Файлы тестов по умолчанию располагаются в папке
cypress/e2e. Cypress поддерживает структуру, которая
позволяет организовывать тесты по модулям, страницам или
функциональности.
Cypress использует команду cy.get() для поиска элементов
в DOM:
cy.get('селектор')
Поддерживаются любые CSS-селекторы, включая классы, идентификаторы и
атрибуты. Для поиска по тексту используется команда
cy.contains():
cy.contains('Текст кнопки')
Можно комбинировать методы для уточнения поиска:
cy.get('.form').contains('Отправить')
cy.get('button.submit').click()
cy.get('input[name="username"]').type('admin')
cy.get('input[name="search"]').clear()
cy.get('select#country').select('Россия')
Cypress автоматически ожидает, пока элемент станет доступным и
видимым перед взаимодействием. Это устраняет необходимость вручную
прописывать задержки (wait) в большинстве случаев.
Cypress предоставляет мощные команды для ассертов (assertions):
cy.get('#login-form').should('be.visible')
cy.get('.alert').should('contain.text', 'Ошибка')
cy.get('input[type="checkbox"]').should('be.checked')
cy.get('input[name="email"]').should('have.attr', 'placeholder', 'Введите email')
cy.get('input[name="username"]').should('have.value', 'admin')
Cypress использует встроенный механизм ожиданий, что позволяет тесту не падать, пока элемент еще не появился или не стал интерактивным.
Cypress построен на принципе цепочек команд (chaining), что обеспечивает последовательное выполнение действий:
cy.get('form')
.find('input[name="password"]')
.type('123456')
.should('have.value', '123456')
Каждая команда возвращает объект Cypress, позволяя продолжать
цепочку. Асинхронная природа операций скрыта, поэтому нет необходимости
использовать async/await.
cy.get('#agree').check()
cy.get('#agree').uncheck()
cy.get('input[name="gender"]').check('male')
Можно комбинировать проверки состояния после действия:
cy.get('#subscribe').check().should('be.checked')
Для элементов, которые появляются через некоторое время, Cypress использует встроенные ожидания:
cy.get('.modal', { timeout: 10000 }).should('be.visible')
Также можно использовать условные проверки:
cy.get('body').then(($body) => {
if ($body.find('.popup').length) {
cy.get('.popup .close').click()
}
})
Cypress позволяет выполнять сложные действия, имитирующие пользователя:
cy.get('.menu-item').trigger('mouseover')
cy.get('#drag').trigger('mousedown', { which: 1 })
cy.get('#drop').trigger('mousemove').trigger('mouseup', { force: true })
cy.get('button.edit').dblclick()
data-testid или
data-cy) вместо классов, которые могут меняться.should, contains) вместо ручных
таймаутов.Cypress позволяет отслеживать события и проверять их триггер:
cy.get('input[type="text"]')
.type('тест')
.should('have.value', 'тест')
.then(($input) => {
$input.on('input', () => {
console.log('Событие input сработало')
})
})
Для элементов внутри iframe используется специальный
подход:
cy.get('iframe#frame').then(($iframe) => {
const body = $iframe.contents().find('body')
cy.wrap(body).find('button#submit').click()
})
cy.wrap() позволяет обернуть содержимое iframe, чтобы
продолжать использовать цепочки команд Cypress.
Использование CSS-селекторов не всегда удобно. Для надёжного поиска часто применяются:
cy.get('[data-cy="login-button"]').click()
cy.contains('h1', 'Добро пожаловать').should('be.visible')
Эти методы повышают стабильность тестов при изменении структуры страницы.
Эта глава охватывает все основные способы взаимодействия с элементами: поиск, ввод данных, клики, проверки состояния, работу с динамическими элементами и событиями. Эти методы формируют фундамент для построения надежных и читаемых тестов на Cypress.