Валидация входных данных

Puppeteer — это библиотека Node.js для управления браузером Chromium или Chrome через протокол DevTools. Она предоставляет API для автоматизации действий пользователя, тестирования интерфейсов и валидации данных. Для работы требуется Node.js версии не ниже 16.

Установка выполняется через npm:

npm install puppeteer

После установки Puppeteer автоматически загружает совместимую версию Chromium, которую можно использовать для тестирования. Для подключения в коде:

const puppeteer = require(&

Создание браузера и страницы осуществляется через методы launch() и newPage():

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto('https://example.com');
})();

Навигация и взаимодействие с элементами

Валидация входных данных часто требует взаимодействия с формами. Puppeteer позволяет выполнять действия с элементами страницы: ввод текста, клики, выбор значений из селекторов.

Пример заполнения формы:

await page.type('#username', 'testuser');
await page.type('#password', '123456');
await page.click('#submit');

Метод type(selector, text) имитирует ввод текста, click(selector) — клик по элементу. Для селекторов можно использовать CSS или XPath.

Для проверки наличия элемента или его состояния применяются методы waitForSelector и evaluate:

await page.waitForSelector('#error-message', { visible: true });
const errorText = await page.$eval('#error-message', el => el.textContent);

Валидация форм и проверка ошибок

Основная задача тестирования ввода — убедиться, что форма корректно обрабатывает данные. Puppeteer позволяет проверять:

  • обязательные поля
  • формат введённых данных
  • отображение сообщений об ошибках

Проверка обязательного поля:

await page.click('#submit');
const isErrorVisible = await page.$eval('#username-error', el => el.offsetParent !== null);
console.log(isErrorVisible); // true, если сообщение об ошибке отображается

Проверка формата e-mail:

await page.type('#email', 'invalid-email');
await page.click('#submit');
const emailError = await page.$eval('#email-error', el => el.textContent);
console.log(emailError); // "Введите корректный e-mail"

Использование offsetParent позволяет определить, виден ли элемент на странице, что важно для проверки ошибок валидации.

Работа с динамическими формами

Современные веб-приложения часто используют динамическую валидацию — ошибки отображаются после изменения поля или потери фокуса.

await page.type('#password', 'short');
await page.focus('#username'); // перемещение фокуса для активации валидации
const passwordError = await page.$eval('#password-error', el => el.textContent);

Для проверки динамических сообщений рекомендуется использовать waitForFunction:

await page.waitForFunction(
  () => document.querySelector('#password-error')?.textContent.includes('минимум 8 символов')
);

Метод позволяет ожидать, пока текст элемента изменится на ожидаемый, что особенно полезно для асинхронной проверки данных.

Автоматическая генерация тестовых данных

Для комплексного тестирования часто требуется проверять разные комбинации значений. Puppeteer можно интегрировать с библиотеками генерации данных, например Faker.js:

const { faker } = require('@faker-js/faker');

const randomEmail = faker.internet.email();
await page.type('#email', randomEmail);
await page.click('#submit');

Это позволяет проверять валидацию формы на различных корректных и некорректных данных.

Снятие скриншотов и логирование ошибок

Для отладки тестов Puppeteer позволяет делать скриншоты и сохранять их:

await page.screenshot({ path: 'error.png', fullPage: true });

Также полезно логировать текст ошибок для анализа:

const errors = await page.$$eval('.error-message', elements => elements.map(el => el.textContent));
console.log(errors);

Метод $$eval</code> позволяет получить массив всех элементов с указанным селектором, что удобно для проверки множественных сообщений о валидации.</p> <h3 id="проверка-состояния-кнопок-и-блокировок">Проверка состояния кнопок и блокировок</h3> <p>Формы могут блокировать кнопку отправки до корректного ввода. Puppeteer позволяет проверять атрибуты кнопок:</p> <pre class="javascript"><code>const isDisabled = await page.$eval('#submit', btn => btn.disabled); console.log(isDisabled); // true, если кнопка заблокирована

Эта проверка важна для сценариев, когда форма не должна отправляться с некорректными данными.

Организация тестов

Для поддерживаемости и масштабирования тестов рекомендуется использовать Puppeteer совместно с тестовыми фреймворками, такими как Jest или Mocha. Это позволяет структурировать сценарии, использовать beforeEach для подготовки страницы и afterEach для закрытия браузера.

describe('Валидация форм', () => {
  let browser, page;

  beforeAll(async () => {
    browser = await puppeteer.launch({ headless: true });
    page = await browser.newPage();
    await page.goto('https://example.com/login');
  });

  afterAll(async () => {
    await browser.close();
  });

  test('Обязательное поле username', async () => {
    await page.click('#submit');
    const isErrorVisible = await page.$eval('#username-error', el => el.offsetParent !== null);
    expect(isErrorVisible).toBe(true);
  });
});

Использование фреймворка обеспечивает удобное управление тестами, отчётность и интеграцию с CI/CD.

Асинхронная валидация и задержки

Некоторые формы используют серверную проверку данных при вводе (например, проверка уникальности e-mail). Puppeteer позволяет обрабатывать такие сценарии с ожиданием сетевых ответов:

await page.type('#email', 'test@example.com');
await page.waitForResponse(response => response.url().includes('/validate-email') && response.status() === 200);
const emailError = await page.$eval('#email-error', el => el.textContent);

Метод waitForResponse позволяет дождаться ответа сервера перед проверкой текста ошибки, обеспечивая корректность асинхронной валидации.

Совмещение техник в сложных формах

Для комплексных форм можно сочетать проверку обязательных полей, формата данных, динамической и серверной валидации. Puppeteer предоставляет инструменты для:

  • управления фокусом и событий blur
  • проверки видимости сообщений об ошибках
  • отслеживания сетевых запросов
  • логирования и снятия скриншотов при ошибках

Такой подход позволяет создавать полностью автоматизированные тесты валидации, имитирующие действия реального пользователя и обеспечивающие высокое качество фронтенда.