Множественные браузеры в одном запуске

В Protractor поддержка тестирования в нескольких браузерах одновременно реализуется через конфигурацию multiCapabilities и встроенные возможности параллельного запуска. Это позволяет ускорять выполнение тестов и проверять кросс-браузерную совместимость без необходимости отдельного запуска для каждого браузера.

Конфигурация multiCapabilities

В стандартной конфигурации Protractor используется параметр capabilities, который описывает один браузер. Для запуска тестов в нескольких браузерах одновременно применяется multiCapabilities. Пример:

exports.config = {
  framework: 'jasmine',
  seleniumAddress: 'http://localhost:4444/wd/hub',
  
  multiCapabilities: [
    {
      browserName: 'chrome',
      chromeOptions: {
        args: ['--window-size=1920,1080']
      }
    },
    {
      browserName: 'firefox',
      'moz:firefoxOptions': {
        args: ['-width=1920', '-height=1080']
      }
    }
  ],

  specs: ['specs/*.spec.js'],

  maxSessions: 2
};

Ключевые моменты:

  • Каждый объект внутри multiCapabilities описывает отдельный браузер.
  • maxSessions определяет максимальное количество параллельных сессий Selenium. Если значение меньше числа браузеров, Protractor будет запускать тесты последовательно.
  • Для Chrome и Firefox можно настраивать отдельные параметры запуска через chromeOptions и moz:firefoxOptions.

Управление порядком и селективный запуск

По умолчанию Protractor распределяет тесты между браузерами автоматически. Для управления последовательностью можно использовать свойства shardTestFiles и maxInstances:

multiCapabilities: [
  {
    browserName: 'chrome',
    shardTestFiles: true,
    maxInstances: 2
  },
  {
    browserName: 'firefox',
    shardTestFiles: true,
    maxInstances: 2
  }
]
  • shardTestFiles: true разбивает тесты на отдельные сессии, позволяя запускать их параллельно.
  • maxInstances ограничивает число параллельных сессий для конкретного браузера.

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

Совместимость с Jasmine и Mocha

Protractor поддерживает несколько фреймворков тестирования. В случае параллельного запуска важно учитывать синхронизацию результатов и отчетность:

  • Для Jasmine каждый браузер получает свой отдельный поток выполнения.
  • При использовании Mocha и multiCapabilities необходимо следить за уникальными именами тестов и корректной генерацией отчетов, чтобы избежать перезаписи.

Особенности работы с асинхронными тестами

Protractor использует WebDriverJS, работающий на промисах. При множественных браузерах важно:

  1. Избегать глобальных состояний, так как каждый браузер работает в отдельной сессии.
  2. Корректно использовать async/await внутри тестов, чтобы избежать гонок данных при параллельном выполнении.
  3. Не полагаться на однократное выполнение beforeAll для настройки общего состояния — оно должно быть локализовано под конкретный браузер.

Пример асинхронного теста для multiCapabilities:

describe('Тестирование в нескольких браузерах', () => {
  it('должен открыть главную страницу', async () => {
    await browser.get('https://example.com');
    const title = await browser.getTitle();
    expect(title).toContain('Example');
  });
});

Тонкости работы с Protractor и Selenium Grid

Для реального кросс-браузерного тестирования часто используется Selenium Grid. В этом случае:

  • seleniumAddress указывает на хаб Grid.
  • Каждый объект в multiCapabilities может содержать platform и version для точного выбора узла Grid.
  • В Grid можно одновременно запускать тесты в десятках браузеров, при этом Protractor автоматически распределяет сессии.

Пример настройки для Grid:

multiCapabilities: [
  {
    browserName: 'chrome',
    version: '112',
    platform: 'WINDOWS'
  },
  {
    browserName: 'firefox',
    version: '110',
    platform: 'LINUX'
  }
]

Логирование и отладка

Параллельные браузеры усложняют логирование, поэтому рекомендуется:

  • Использовать уникальные директории для отчетов каждого браузера.
  • Включать подробные логи WebDriver через chromeOptions.debuggerAddress или loggingPrefs.
  • Разделять данные по сессиям, чтобы идентифицировать ошибки конкретного браузера.

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

  • Для большого набора браузеров и тестов стоит включать shardTestFiles: true для ускорения выполнения.
  • Настройка maxSessions должна соответствовать ресурсам хоста или Grid.
  • В тестах необходимо избегать глобальных переменных и состояния, так как каждый браузер создаёт отдельный контекст.
  • Использовать отдельные отчеты и логи для каждого браузера для упрощения анализа.

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