Сквозное тестирование форм и пользовательских сценариев
Автоматизируйте многошаговую отправку форм и навигацию с помощью объектов страниц Playwright.
«Сквозное тестирование форм и пользовательских сценариев» — бесплатный урок React Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Стратегия сквозного тестирования форм
Сквозные тесты форм имитируют полный путь пользователя: открыть страницу, заполнить поля, отправить форму, обработать ошибки валидации и проверить успешный результат.
Модель объекта страницы
Модель объекта страницы (POM) объединяет селекторы и взаимодействия со страницей в классе, делая тесты более понятными и уменьшая дублирование.
class LoginPage {
constructor(private page: Page) {}
async goto() { await this.page.goto('/login'); }
async fillEmail(email: string) { await this.page.getByLabel('Email').fill(email); }
async fillPassword(pw: string) { await this.page.getByLabel('Password').fill(pw); }
async submit() { await this.page.getByRole('button', { name: /log in/i }).click(); }
async getError() { return this.page.getByRole('alert').textContent(); }
}Использование объекта страницы в тестах
При использовании объектов страниц тесты превращаются в понятные описания действий пользователя на уровне намерений — их легко читать и поддерживать.
test('successful login redirects to dashboard', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.fillEmail('alice@example.com');
await loginPage.fillPassword('password123');
await loginPage.submit();
await expect(page).toHaveURL('/dashboard');
await expect(page.getByRole('heading', { name: 'Dashboard' })).toBeVisible();
});Тестирование ошибок валидации
Отправьте недопустимые или пустые данные и проверьте сообщения об ошибках, отображаемые интерфейсом.
test('shows validation errors on empty submit', async ({ page }) => {
await page.goto('/register');
await page.getByRole('button', { name: 'Create account' }).click();
await expect(page.getByText('Email is required')).toBeVisible();
await expect(page.getByText('Password must be at least 8 characters')).toBeVisible();
});Тестирование многошаговых форм
Для многошаговых мастеров последовательно пройдите каждый шаг, проверяя переход формы дальше и сохранение ранее введенных данных.
test('completes 3-step signup', async ({ page }) => {
await page.goto('/signup');
// Step 1
await page.getByLabel('First Name').fill('Alice');
await page.getByRole('button', { name: 'Next' }).click();
// Step 2
await page.getByLabel('Plan').selectOption('pro');
await page.getByRole('button', { name: 'Next' }).click();
// Step 3
await page.getByLabel('Card Number').fill('4242424242424242');
await page.getByRole('button', { name: 'Complete' }).click();
await expect(page.getByText('Welcome, Alice!')).toBeVisible();
});Имитация API в Playwright
Используйте page.route(), чтобы перехватывать вызовы API и возвращать имитационные ответы — это удобно для проверки особых случаев без настоящего серверного компонента.
await page.route('/api/register', async route => {
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({ token: 'fake-token' }),
});
});
await page.goto('/register');
// ...fill and submit form
await expect(page).toHaveURL('/dashboard');Тестирование загрузки файлов
Используйте setInputFiles(), чтобы имитировать загрузку файла в Playwright.
test('uploads a profile photo', async ({ page }) => {
await page.goto('/profile');
const fileInput = page.getByLabel('Profile photo');
await fileInput.setInputFiles('./fixtures/avatar.png');
await page.getByRole('button', { name: 'Upload' }).click();
await expect(page.getByAltText('Profile photo')).toBeVisible();
});Повторное использование состояния аутентификации
Войдите один раз, сохраните состояние хранилища браузера и используйте его в разных тестах, чтобы пропустить повторяющиеся сценарии входа.
// auth.setup.ts
test('authenticate', async ({ page }) => {
await page.goto('/login');
await page.getByLabel('Email').fill('alice@example.com');
await page.getByLabel('Password').fill('password');
await page.getByRole('button', { name: 'Log in' }).click();
await page.context().storageState({ path: 'e2e/.auth/user.json' });
});
// playwright.config.ts — use storageState in other tests
use: { storageState: 'e2e/.auth/user.json' }Тестирование восстановления после ошибок
Имитируйте сбои сети и проверьте, может ли пользователь повторить попытку или видит понятное сообщение об ошибке.
await page.route('/api/submit', route => route.abort());
await page.getByRole('button', { name: 'Submit' }).click();
await expect(page.getByText('Network error. Please try again.')).toBeVisible();
await page.unroute('/api/submit');
// Now the real request goes through
await page.getByRole('button', { name: 'Retry' }).click();Тестирование навигации с клавиатуры
Проверьте полную доступность форм с клавиатуры: переходите по полям с помощью клавиши Tab и отправляйте форму клавишей Enter.
test('submits form with keyboard only', async ({ page }) => {
await page.goto('/contact');
await page.keyboard.press('Tab'); // focus name
await page.keyboard.type('Alice');
await page.keyboard.press('Tab'); // focus email
await page.keyboard.type('alice@example.com');
await page.keyboard.press('Tab'); // focus submit
await page.keyboard.press('Enter');
await expect(page.getByText('Message sent!')).toBeVisible();
});Фикстуры для тестовых данных
Используйте фикстуры Playwright, чтобы аккуратно совместно использовать логику настройки, например создание тестового пользователя, в нескольких тестах.
// fixtures.ts
const test = base.extend<{ testUser: User }>({
testUser: async ({}, use) => {
const user = await createTestUser();
await use(user);
await deleteTestUser(user.id);
},
});
// In a test file:
test('edits profile', async ({ page, testUser }) => {
await page.goto(`/users/${testUser.id}/edit`);
});Параллельное выполнение тестов
По умолчанию Playwright запускает тесты параллельно в разных рабочих процессах. Используйте test.describe.serial только для тестов, которые должны выполняться по порядку.
Быстрая проверка
Каково главное преимущество модели объекта страницы (POM) в сквозном тестировании?
Итоги
Сквозные тесты форм используют объекты страниц для удобства сопровождения, page.route() для имитации API, setInputFiles() для загрузки файлов и состояние хранилища для повторного использования сеансов аутентификации. Проверяйте валидацию, многошаговые сценарии и навигацию с клавиатуры, чтобы охватить реальные пути пользователей.
Изучай React с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 88
- Уроки
- 324
Часто задаваемые вопросы
Урок «Сквозное тестирование форм и пользовательских сценариев» бесплатный?
Да — полный текст урока «Сквозное тестирование форм и пользовательских сценариев» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Сквозное тестирование форм и пользовательских сценариев»?
Автоматизируйте многошаговую отправку форм и навигацию с помощью объектов страниц Playwright. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Сквозное тестирование форм и пользовательских сценариев»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Интеграционное тестирование с React Testing Library
- Тестирование асинхронного интерфейса и вызовов API с MSW
- Начало работы с Playwright для React
- Сквозное тестирование форм и пользовательских сценариев