Управление браузерными сессиями

WebdriverIO предоставляет мощные возможности для управления браузерными сессиями при автоматизации тестирования в JavaScript. Сессии браузеров являются основой взаимодействия с веб-приложениями, и понимание того, как они создаются, настраиваются и управляются, критически важно для успешного тестирования. В этом разделе рассматриваются основные операции, связанные с браузерными сессиями: создание, управление несколькими сессиями, использование профилей браузеров и настройка времени жизни сессий.

Создание новой сессии браузера

Для начала работы с WebdriverIO необходимо создать сессию браузера. Для этого используется WebdriverIO API, которое позволяет инициировать сессию с выбранным браузером. Это может быть как стандартный браузер (например, Chrome или Firefox), так и специальные браузеры для мобильных устройств.

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

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

async function startSession() {
  const browser = await remote({
    logLevel: 'info',
    capabilities: {
      browserName: 'chrome'
    }
  });
  
  await browser.url('https://example.com');
  console.log(await browser.getTitle());
  await browser.deleteSession();
}

startSession();

Этот код инициирует сессию с браузером Chrome, переходит на указанный URL, выводит заголовок страницы и завершает сессию.

Управление состоянием сессии

После того как сессия создана, она остается активной до тех пор, пока не будет завершена с помощью команды deleteSession(). Это позволяет работать с браузером, выполнять действия на страницах, взаимодействовать с элементами и проверять их состояния.

Для управления состоянием сессии можно использовать несколько функций:

  • getSession() — возвращает информацию о текущей сессии.
  • deleteSession() — завершает текущую сессию, закрывая браузер.

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

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

async function getSessionInfo() {
  const browser = await remote({
    logLevel: 'info',
    capabilities: {
      browserName: 'chrome'
    }
  });

  const session = await browser.getSession();
  console.log(session);  // Выводит информацию о текущей сессии
  await browser.deleteSession();
}

getSessionInfo();

Многозадачность: работа с несколькими сессиями

WebdriverIO поддерживает управление несколькими сессиями одновременно, что полезно для параллельного тестирования или работы с различными браузерами. Для этого можно использовать WebdriverIO в режиме многозадачности.

Для создания нескольких сессий достаточно запустить несколько экземпляров remote() с разными конфигурациями. Пример параллельного запуска сессий:

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

async function startMultipleSessions() {
  const browser1 = await remote({
    logLevel: 'info',
    capabilities: { browserName: 'chrome' }
  });
  
  const browser2 = await remote({
    logLevel: 'info',
    capabilities: { browserName: 'firefox' }
  });

  await browser1.url('https://example.com');
  await browser2.url('https://example.org');

  console.log(await browser1.getTitle());
  console.log(await browser2.getTitle());

  await browser1.deleteSession();
  await browser2.deleteSession();
}

startMultipleSessions();

В данном примере создаются две сессии: одна с браузером Chrome и другая с Firefox. Каждая сессия работает параллельно, что позволяет тестировать несколько браузеров одновременно.

Использование профилей браузеров

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

Для использования профилей в Chrome можно указать путь к уже созданному профилю с помощью опции --user-data-dir.

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

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

async function startWithProfile() {
  const browser = await remote({
    logLevel: 'info',
    capabilities: {
      browserName: 'chrome',
      'goog:chromeOptions': {
        args: ['--user-data-dir=/path/to/your/profile']
      }
    }
  });

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

startWithProfile();

Этот пример запускает Chrome с указанным профилем, что позволяет использовать сохраненные куки, пароли и другие данные.

Настройка времени жизни сессии

Время жизни сессии можно контролировать через параметры WebDriver. В некоторых случаях, например, при автоматическом запуске тестов на CI/CD, может быть необходимо ограничить время работы сессии, чтобы избежать долгих ожиданий или зависших процессов.

WebdriverIO поддерживает настройку времени жизни сессии с помощью параметра maxInstances в конфигурационном файле. Также можно управлять временем ожидания, используя опции waitTimeout или connectionTimeout.

Пример настройки времени ожидания:

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

async function sessionWithTimeout() {
  const browser = await remote({
    logLevel: 'info',
    capabilities: {
      browserName: 'chrome'
    },
    connectionTimeout: 10000, // 10 секунд на установление соединения
    waitTimeout: 5000 // 5 секунд на ожидание элементов
  });

  await browser.url('https://example.com');
  await browser.deleteSession();
}

sessionWithTimeout();

В данном примере сессия будет завершена, если соединение не удастся установить в течение 10 секунд или если элементы на странице не будут найдены в течение 5 секунд.

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

При работе с браузерными сессиями важно правильно обрабатывать ошибки. Это помогает избежать непредвиденных сбоев в тестах и предоставляет информацию о том, что именно пошло не так. WebdriverIO предоставляет механизмы для работы с ошибками через асинхронные блоки кода.

Пример обработки ошибок:

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

async function safeSession() {
  let browser;
  try {
    browser = await remote({
      logLevel: 'info',
      capabilities: { browserName: 'chrome' }
    });

    await browser.url('https://example.com');
    console.log(await browser.getTitle());
  } catch (error) {
    console.error('Ошибка при работе с сессией:', error);
  } finally {
    if (browser) {
      await browser.deleteSession();
    }
  }
}

safeSession();

Этот пример гарантирует, что сессия будет закрыта даже в случае возникновения ошибки.

Заключение

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