WebDriver сессия и её жизненный цикл

WebDriverIO — это высокоуровневый инструмент для автоматизации браузеров с использованием протокола WebDriver или DevTools. Основным элементом любой автоматизации является сессия WebDriver, которая представляет собой соединение с браузером, управляемое через WebDriver протокол. Жизненный цикл сессии напрямую влияет на стабильность тестов, скорость их выполнения и корректность отчётности.


Инициализация сессии

Сессия WebDriver начинается с создания экземпляра браузера. В WebDriverIO это делается через объект browser, который автоматически создается при старте теста, если используется стандартная конфигурация с wdio.conf.js. Внутри WebDriverIO:

  1. Чтение конфигурации — определяется тип браузера, параметры запуска, timeout’ы, разрешение экрана.
  2. Запуск драйвера — инициируется соединение с локальным или удалённым WebDriver сервером (например, Selenium Standalone или ChromeDriver).
  3. Создание сессии — сервер возвращает уникальный идентификатор сессии (sessionId), который используется для всех последующих команд.

Пример явного запуска сессии через WebDriverIO:

const { remote } = require('webdriverio');

(async () => {
    const browser = await remote({
        capabilities: {
            browserName: 'chrome'
        }
    });

    await browser.url('https://example.com');
    console.log(await browser.getTitle());

    await browser.deleteSession();
})();

Здесь remote() создаёт сессию, а deleteSession() завершает её корректно.


Команды и взаимодействие

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

  • Навигация: browser.url(), browser.back(), browser.refresh().
  • Работа с элементами: browser.$(), element.click(), element.setValue().
  • Получение информации: browser.getTitle(), element.getText(), element.getAttribute().

Каждая команда отправляется на WebDriver сервер с использованием REST-запросов, где sessionId указывает, к какой сессии относится действие.


Жизненный цикл сессии

Жизненный цикл сессии включает следующие этапы:

  1. Создание сессии — вызов remote() или запуск теста через wdio CLI.
  2. Выполнение команд — все действия над браузером выполняются внутри активной сессии.
  3. Ожидания и таймауты — WebDriverIO управляет ожиданиями через встроенные функции waitUntil, setTimeouts, что важно для асинхронного взаимодействия.
  4. Завершение сессии — вызывается browser.deleteSession(), либо закрытие теста автоматически через тестовый фреймворк (Mocha, Jasmine, Cucumber). Завершение сессии гарантирует корректное освобождение ресурсов браузера.

Важно понимать, что несвоевременное завершение сессии приводит к «зависшим» процессам браузера, утечкам памяти и некорректным результатам следующих тестов.


Параллельные сессии

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

  • maxInstances в конфигурации wdio.conf.js.
  • Разделение тестов по файлам или сценариям.
  • Использование Selenium Grid или облачных сервисов (BrowserStack, Sauce Labs).

Пример настройки параллельных сессий:

exports.config = {
    maxInstances: 5,
    capabilities: [{
        browserName: 'chrome',
        maxInstances: 2
    }]
};

Здесь одновременно могут выполняться 2 сессии Chrome, а общая максимальная загрузка — 5 экземпляров браузера.


Управление сессией

WebDriverIO предоставляет методы для контроля сессии:

  • browser.sessionId — получение идентификатора текущей сессии.
  • browser.isSessionActive() — проверка активности сессии.
  • browser.reloadSession() — перезапуск сессии без полного закрытия браузера, что полезно для сброса состояния между тестами.

Эффективное управление сессией позволяет:

  • Избегать конфликтов между тестами.
  • Сокращать время на повторное открытие браузера.
  • Повышать стабильность тестов при интеграции с CI/CD.

Ошибки и исключения

Во время работы сессия может завершиться с ошибкой, если:

  • Сервер WebDriver недоступен.
  • Процесс браузера аварийно закрыт.
  • Истекли таймауты ожидания элементов.

WebDriverIO обрабатывает ошибки через Promise rejection и исключения. При этом важно корректно обрабатывать try/catch и завершать сессию через deleteSession(), чтобы не оставлять зависшие процессы.


Взаимодействие с DevTools

Помимо классического WebDriver протокола, WebDriverIO поддерживает DevTools сессии, позволяя управлять браузером напрямую через Chrome DevTools Protocol (CDP). Это обеспечивает:

  • Мгновенное выполнение команд без HTTP-запросов.
  • Дополнительные возможности: снятие скриншотов, эмуляция сети, захват производительности.
  • Управление жизненным циклом аналогично стандартной WebDriver сессии.

Пример создания DevTools сессии:

const browser = await remote({
    capabilities: {
        browserName: 'chrome',
        'wdio:devtoolsOptions': { headless: true }
    }
});

Практические рекомендации

  • Каждому тесту — своя сессия для изоляции данных.
  • Завершать сессию через deleteSession() даже при падении теста.
  • Использовать reloadSession() для сброса состояния без полного закрытия браузера.
  • При параллельных сессиях внимательно следить за ограничением ресурсов, чтобы избежать конфликтов.

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