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.
Идентичность обработчика: Для успешной отписки
важно, чтобы переданный обработчик в метод off был
идентичен тому, что был передан в on. Если обработчик
анонимный (не сохранён в переменной), отписка не будет
возможна.
Отписка от всех обработчиков события: Если требуется отписаться от всех обработчиков конкретного события, можно передать пустую функцию или не указывать обработчик, как показано ниже:
page.off('click');
В этом случае будут удалены все обработчики события
click, которые были зарегистрированы на объекте
page.
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 в процессе автоматизированного тестирования. Это позволяет контролировать жизненный цикл обработчиков, предотвращать утечку памяти и обеспечивать изолированное выполнение тестов. Важно помнить о синхронности и идентичности обработчиков при отписке, а также учитывать особенности работы с элементами страницы.