Отписка от событий

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

Основы событий в Playwright

События — это механизм, с помощью которого Playwright сообщает о наступлении определённых условий или изменений на веб-странице. Например, можно подписаться на событие клика по элементу, изменение текста или загрузку страницы. Подписка на события осуществляется через методы, такие как page.on() или elementHandle.on(). Пример подписки на событие клика:

page.on('click', (event) => {
  console.log('Элемент был кликнут');
});

Когда событие больше не требуется отслеживать, необходимо отписаться от него. Это можно сделать с помощью метода off.

Метод отписки от событий: off

Метод off используется для отписки от событий, на которые ранее был установлен обработчик с помощью on. Сигнатура метода выглядит следующим образом:

page.off(eventName, handler)
  • eventName: название события, от которого нужно отписаться.
  • handler: функция-обработчик, которая была передана при подписке.

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

Пример использования off:

const handler = (event) => {
  console.log('Элемент был кликнут');
};

page.on('click', handler);

// Ожидаем какое-то время, а затем отписываемся
await page.waitForTimeout(5000);
page.off('click', handler);

В этом примере событие клика отслеживается в течение 5 секунд, после чего отписка от события происходит через метод off.

Особенности отписки

  1. Идентичность обработчика: Для успешной отписки важно, чтобы переданный обработчик в метод off был идентичен тому, что был передан в on. Если обработчик анонимный (не сохранён в переменной), отписка не будет возможна.

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

page.off('click');

В этом случае будут удалены все обработчики события click, которые были зарегистрированы на объекте page.

  1. Отписка от событий на элементах: В Playwright можно подписываться и отписываться от событий не только на уровне страницы, но и на уровне отдельных элементов. Использование метода off для элементов аналогично его применению для страницы:
const button = await page.$('button');
const handler = () => console.log('Кнопка была нажата');

await button.on('click', handler);
await button.off('click', handler);

Применение в тестах

Отписка от событий в процессе тестирования может быть полезной в следующих сценариях:

  • Управление временем жизни обработчиков: Когда необходимо подписаться на событие только на определённое время или в рамках теста. В таком случае важно отписаться от события после завершения теста или этапа, чтобы избежать нежелательных побочных эффектов.

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

Пример теста с отпиской от событий:

test('Проверка клика по кнопке', async () => {
  const page = await browser.newPage();
  const button = await page.$('button');
  const handler = () => console.log('Кнопка была нажата');

  await button.on('click', handler);

  // Выполняем клик по кнопке
  await button.click();

  // Проверяем, что событие было обработано
  await page.waitForTimeout(1000);

  // Отписываемся от события
  await button.off('click', handler);
  await page.close();
});

Обработка ошибок при отписке

Если по каким-либо причинам обработчик события не был подписан ранее, вызов метода off не вызовет ошибку, но и не произведёт никаких изменений. Это поведение полезно, когда нет уверенности в том, был ли обработчик установлен:

page.off('click', handler); // Без ошибок, если обработчик не был подписан.

Такое поведение позволяет избежать избыточных проверок в коде и уменьшить количество условных операторов.

Заключение

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