В JavaScript-тестировании с использованием Cypress работа с формами — одна из наиболее частых задач. Сабмит формы может осуществляться различными способами, и выбор подхода зависит от структуры приложения, наличия обработчиков событий и требований к тесту. Рассмотрим основные подходы с примерами и разбором тонкостей.
.submit()Cypress предоставляет встроенный метод .submit(),
который инициирует событие сабмита формы.
cy.get('form#loginForm').submit();
Особенности:
submit на элементе
<form>.onsubmit, он будет
выполнен.Подводные камни:
<button type="submit"> имеет
дополнительную логику через onClick, метод
.submit() её не вызовет. В этом случае требуется имитация
нажатия кнопки.Наиболее универсальный способ — клик по кнопке отправки формы.
cy.get('button[type="submit"]').click();
Особенности:
click,
submit, кастомные обработчики onClick).Тонкости использования:
disabled), тест
упадет. Необходимо убедиться, что форма валидна и кнопка активна.cy.get('button[type="submit"]').click();
cy.wait('@loginRequest'); // ожидание сетевого запроса
Некоторые формы допускают отправку через нажатие клавиши Enter в поле ввода.
cy.get('input[name="username"]').type('admin{enter}');
Особенности:
Ограничения:
Можно инициировать событие сабмита программно:
cy.get('form#loginForm').then(($form) => {
$form[0].dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));
});
Особенности:
.submit() и
.click().cy.stub() для проверки вызова
обработчиков.Минусы:
Современные SPA используют AJAX для отправки форм. В таких случаях важно проверять не только событие сабмита, но и результат запроса.
cy.intercept('POST', '/api/login').as('loginRequest');
cy.get('form#loginForm').submit();
cy.wait('@loginRequest').its('response.statusCode').should('eq', 200);
Особенности:
cy.intercept() используется для перехвата и
проверки HTTP-запросов..submit() или .click() тест
полностью охватывает сабмит и обработку ответа.Перед сабмитом часто требуется проверить правильность заполнения полей:
cy.get('input[name="email"]').type('user@example.com');
cy.get('input[name="password"]').type('password123');
cy.get('form#loginForm').submit();
// Проверка появления ошибки или успешного редиректа
cy.url().should('include', '/dashboard');
Особенности:
cy.contains() для проверки
текста ошибок.В сложных приложениях полезно комбинировать методы:
.type('{enter}') для UX-тестов..click() для полноценного сабмита..submit() для проверки стандартного события формы.cy.intercept() для проверки сетевых операций.Пример комбинированного подхода:
cy.intercept('POST', '/api/register').as('register');
cy.get('input[name="username"]').type('newuser{enter}');
cy.get('button[type="submit"]').click();
cy.wait('@register').its('response.statusCode').should('eq', 201);
Такой подход обеспечивает покрытие всех уровней сабмита: фронтенд, обработка событий и сетевые операции.
.submit()..click() по кнопке..type('{enter}')..submit()/.click() с
cy.intercept().dispatchEvent.Использование правильного подхода повышает стабильность тестов и точность проверки функционала формы.