Закрытие неиспользуемых ресурсов в WebdriverIO — важная часть управления жизненным циклом тестов. Сюда входят такие ресурсы, как браузеры, окна, сессии и другие объекты, которые могут оставаться открытыми или активными после выполнения тестов. Неправильное управление этими ресурсами может привести к утечкам памяти, замедлению работы тестов и трудностям в обслуживании тестовой инфраструктуры. Важным аспектом является также освобождение ресурсов после завершения тестов, чтобы избежать конфликтов при их повторном использовании.
После завершения теста необходимо закрыть сессию WebDriver. В
WebdriverIO для этого используется метод
browser.deleteSession(). Этот метод завершает сессию с
браузером и освобождает все связанные ресурсы.
Пример:
after(async () => {
await browser.deleteSession();
});
Этот метод следует вызывать после выполнения всех тестов, чтобы гарантировать, что все открытые сессии будут закрыты. WebdriverIO автоматически создает сессию при запуске, и она должна быть явно закрыта в конце. Если этого не сделать, браузер будет продолжать работать в фоновом режиме, что может привести к дополнительным нагрузкам на систему.
Веб-драйвер позволяет работать с несколькими окнами и вкладками в
рамках одной сессии. Важно завершать работу с лишними окнами, которые
были открыты в процессе теста. WebdriverIO предоставляет методы для
управления окнами, такие как browser.switchToWindow() и
browser.closeWindow().
Пример закрытия всех окон:
after(async () => {
const handles = await browser.getWindowHandles();
for (let handle of handles) {
await browser.switchToWindow(handle);
await browser.closeWindow();
}
});
Этот код переключается на каждое открытое окно и закрывает его. После завершения всех тестов окна должны быть закрыты, чтобы не оставлять их открытыми и не нарушать работу других тестов.
WebdriverIO поддерживает асинхронные операции, такие как действия с элементами DOM, загрузка страниц или выполнение скриптов в браузере. Часто ресурсы не закрываются сразу, если операция не завершена. В таких случаях важно правильно управлять асинхронными ожиданиями, чтобы не создавать «зависших» ресурсов.
Методы, такие как browser.waitUntil() и
browser.pause(), позволяют убедиться, что все необходимые
операции завершены перед закрытием сессии или окна.
Пример использования waitUntil():
await browser.waitUntil(async () => {
const isReady = await browser.execute(() => document.readyState === 'complete');
return isReady;
}, { timeout: 5000, timeoutMsg: 'Страница не загрузилась в течение 5 секунд' });
Это гарантирует, что страница будет полностью загружена, прежде чем тест продолжит выполнение. Такие ожидания помогают избежать неполных или некорректных данных, что снижает риск возникновения ошибок.
Когда тесты взаимодействуют с DOM или создают дополнительные объекты, важно следить за тем, чтобы они не оставались в памяти после выполнения. WebDriver сам по себе не управляет памятью, поэтому за этим нужно следить вручную, чтобы избежать утечек.
Для очистки памяти можно использовать методы типа
browser.execute() для удаления глобальных переменных, если
они не нужны после завершения теста.
Пример:
after(async () => {
await browser.execute(() => {
window.localStorage.clear();
window.sessionStorage.clear();
});
});
Этот код очищает локальное и сессионное хранилище, которое может хранить данные, оставшиеся после выполнения тестов. Такие данные, как кешированные объекты или состояния, могут привести к некорректным результатам при последующих тестах, если они не будут очищены.
В некоторых случаях, особенно при использовании параллельных тестов, важно убедиться, что все тесты завершены, прежде чем закрывать ресурсы. В этом поможет использование фреймворков, таких как Mocha, и их хуков.
Пример использования afterAll() для закрытия ресурсов
после всех тестов:
afterAll(async () => {
await browser.deleteSession();
});
Этот хук срабатывает после завершения всех тестов, что дает возможность безопасно закрыть сессию и освободить ресурсы.
Когда тесты выполняются параллельно, важно правильно управлять ресурсами, чтобы избежать их перезаписи или использования одного ресурса несколькими тестами одновременно. WebdriverIO поддерживает работу с параллельным запуском тестов с помощью различных драйверов, таких как Selenium Grid или BrowserStack.
Для безопасного закрытия сессий и окон в параллельных тестах
необходимо гарантировать, что каждый тест использует свой собственный
экземпляр браузера и сессию. Это можно настроить с помощью конфигурации
WebdriverIO, например, через настройку runner и
maxInstances.
Пример:
exports.config = {
runner: 'local',
maxInstances: 5, // максимальное количество параллельных экземпляров
capabilities: [{
browserName: 'chrome'
}],
after: async () => {
await browser.deleteSession();
}
};
В этом примере тесты будут выполняться в пяти параллельных экземплярах, и для каждого будет создана отдельная сессия, которая будет корректно закрыта после выполнения.
Для более точного контроля над состоянием тестов и использования ресурсов можно интегрировать WebdriverIO с инструментами для мониторинга. Например, можно использовать такие средства, как Sentry, LogRocket или custom логи, чтобы отслеживать ошибки и утечки ресурсов в реальном времени. Это позволит своевременно обнаружить неочищенные ресурсы или утечки памяти, особенно в сложных многозадачных тестах.
Регулярное закрытие неиспользуемых ресурсов не только улучшает производительность тестов, но и предотвращает возможные ошибки. Оставленные открытыми сессии и окна могут привести к непредсказуемому поведению системы, особенно в средах с ограниченными ресурсами. Закрытие всех использованных объектов — это основа стабильности и предсказуемости автоматизированных тестов.