Валидация форм является одним из ключевых аспектов тестирования веб-приложений. Cypress предоставляет широкий инструментарий для проверки как клиентской, так и серверной валидации, позволяя убедиться, что поля формы корректно обрабатывают данные, а ошибки отображаются пользователю должным образом.
Каждый тест Cypress начинается с описания тестового сценария через
describe и it. Для валидации формы обычно
выполняются следующие шаги:
Навигация к форме
cy.visit('/login');Заполнение полей Используются команды
cy.get() и type(). Для очистки поля перед
вводом применяют clear().
cy.get('input[name="username"]').clear().type('testuser');
cy.get('input[name="password"]').clear().type('password123');Отправка формы
cy.get('form').submit();Проверка ошибок или успешного результата Для
проверки отображения ошибок используется
should('contain', 'текст ошибки') или
should('be.visible').
cy.get('.error-message').should('contain', 'Пароль слишком короткий');Обязательные поля формы можно тестировать путем попытки отправки формы с пустыми значениями и проверки соответствующих сообщений об ошибке.
cy.get('form').submit();
cy.get('input[name="email"]:invalid').should('exist');
cy.get('.error-message').should('contain', 'Email обязателен');
Для современных браузеров можно использовать нативные селекторы
валидации HTML5: :invalid и :valid.
Если поля формы зависят от других значений (например, переключение чекбоксов или выпадающих списков), Cypress позволяет проверять их поведение после изменения состояния.
cy.get('input[type="checkbox"]').check();
cy.get('select[name="country"]').select('Россия');
cy.get('.state-field').should('be.visible');
Это важно для сложных форм, где часть полей появляется или становится обязательной в зависимости от выбранных значений.
Многие формы используют AJAX-запросы для проверки данных (например,
проверка уникальности логина). В Cypress это делается с помощью
перехвата сетевых запросов через cy.intercept().
cy.intercept('POST', '/api/check-username', { body: { available: false } });
cy.get('input[name="username"]').type('existinguser');
cy.get('.error-message').should('contain', 'Имя пользователя уже занято');
Использование cy.wait() для задержки обычно не
рекомендуется; вместо этого следует ожидать появление элемента или
завершение запроса через intercept.
Cypress позволяет тестировать все типы элементов формы:
type(),
clear().check(),
uncheck().select().attachFile().Пример для файла:
cy.get('input[type="file"]').attachFile('example.pdf');
cy.get('.upload-success').should('contain', 'Файл загружен успешно');
Для комплексной валидации формы важно сочетать тестирование интерфейса с проверкой API:
cy.intercept() и cy.wait().cy.intercept('POST', '/api/register').as('register');
cy.get('form').submit();
cy.wait('@register').its('response.statusCode').should('eq', 200);
Для больших форм рекомендуется разделять тесты на логические блоки:
Использование вспомогательных функций и кастомных команд Cypress
(Cypress.Commands.add) позволяет уменьшить дублирование
кода и сделать тесты более читаемыми.
Cypress.Commands.add('fillLoginForm', (username, password) => {
cy.get('input[name="username"]').clear().type(username);
cy.get('input[name="password"]').clear().type(password);
});
Это позволяет в тестах просто вызывать:
cy.fillLoginForm('testuser', 'password123');
Сообщения об ошибках могут быть текстовыми, всплывающими или изменять класс элементов. В Cypress их проверка осуществляется через:
should('contain', 'текст') — проверка текстаshould('have.class', 'error') — проверка классаshould('be.visible') — проверка видимостиКомбинирование этих проверок гарантирует полное покрытие сценариев валидации формы.