Кастомные события

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

Создание кастомных событий

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

Пример создания кастомного события:

const { test, expect } = require('@playwright/test');

test('Отправка кастомного события', async ({ page }) => {
  // Создание кастомного события
  await page.evaluate(() => {
    const event = new CustomEvent('myCustomEvent', {
      detail: { message: 'Привет, мир!' }
    });
    document.body.dispatchEvent(event);
  });

  // Ожидание на обработку кастомного события
  page.on('myCustomEvent', (event) => {
    console.log(event.detail.message); // Выведет: Привет, мир!
  });
});

В данном примере создается кастомное событие myCustomEvent, которое имеет дополнительное поле detail с информацией, которую можно передать вместе с событием. Для того чтобы обработать это событие, нужно привязать слушатель события к элементу или всему документу. В примере событие myCustomEvent слушается на уровне документа.

Эмуляция пользовательских взаимодействий

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

Пример имитации пользовательского ввода с помощью кастомного события:

const { test, expect } = require('@playwright/test');

test('Эмуляция ввода текста с кастомным событием', async ({ page }) => {
  await page.goto('https://example.com');

  // Добавление обработчика события
  await page.evaluate(() => {
    const inputElement = document.querySelector('input');
    inputElement.addEventListener('input', (event) => {
      console.log('Введенные данные:', event.target.value);
    });
  });

  // Эмуляция ввода текста
  await page.evaluate(() => {
    const inputElement = document.querySelector('input');
    const event = new Event('input', {
      bubbles: true,
      cancelable: true,
    });
    inputElement.value = 'Тестовое сообщение';
    inputElement.dispatchEvent(event);
  });
});

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

Подключение кастомных событий к компонентам UI

Часто тестируемые веб-приложения имеют сложную структуру компонентов, которые генерируют кастомные события. Например, компонент модального окна может генерировать событие закрытия, а обработчик этого события может скрывать окно. В таких случаях полезно эмулировать и обрабатывать кастомные события для корректной проверки функциональности компонентов.

Пример тестирования компонента с кастомным событием закрытия модального окна:

const { test, expect } = require('@playwright/test');

test('Закрытие модального окна с кастомным событием', async ({ page }) => {
  await page.goto('https://example.com');

  // Ожидание появления модального окна
  await page.click('#openModalButton');

  // Инициализация кастомного события закрытия окна
  await page.evaluate(() => {
    const modal = document.querySelector('#modal');
    modal.dispatchEvent(new CustomEvent('closeModal', { detail: { reason: 'user' } }));
  });

  // Проверка, что окно закрывается после события
  const modal = await page.$('#modal');
  expect(modal).toBeNull(); // Модальное окно должно быть закрыто
});

Здесь тест проверяет, что модальное окно закрывается после получения кастомного события closeModal. Это позволяет проверить реакцию компонента на события, генерируемые его логикой.

Важность управления событиями

Playwright предоставляет гибкие средства для работы с кастомными событиями, однако важно учитывать несколько аспектов:

  1. Асинхронность событий: Кастомные события могут быть асинхронными, особенно если они связаны с действиями пользователя или сети. Необходимо учитывать задержки между отправкой события и его обработкой, чтобы корректно синхронизировать тесты.

  2. Передача данных через события: При отправке данных через кастомные события важно тщательно проверять их корректность, особенно если эти данные имеют влияние на состояние приложения. Например, в случае с формами важно не только передавать событие, но и проверять, что данные корректно обработаны.

  3. Обработка ошибок: В случае, если обработчик кастомного события не выполнится или сработает некорректно, необходимо предусматривать проверку на ошибки и исключения. Например, если событие должно закрывать модальное окно, но по каким-то причинам этого не происходит, это может быть индикатором ошибки в компоненте.

Использование кастомных событий в реальных приложениях

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

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

Заключение

Работа с кастомными событиями в Playwright открывает дополнительные возможности для тестирования, позволяя эмулировать различные взаимодействия, которые трудно воспроизвести с помощью стандартных событий. Это особенно полезно в контексте тестирования сложных веб-приложений, где компоненты могут взаимодействовать между собой через кастомные события.