Обработка различий между браузерами

Protractor — инструмент для энд-ту-энд тестирования веб-приложений на Angular и других фреймворках. Одной из ключевых проблем при автоматизированном тестировании является различное поведение приложения в разных браузерах. Эти различия могут проявляться в рендеринге элементов, обработке событий, скорости выполнения скриптов и поддержке специфичных API.

Поддержка нескольких браузеров

Protractor использует WebDriverJS, который позволяет управлять различными браузерами через драйверы: ChromeDriver, GeckoDriver (Firefox), EdgeDriver и другие. В конфигурационном файле protractor.conf.js задаются браузеры для тестирования:

exports.config = {
  multiCapabilities: [
    { browserName: 'chrome' },
    { browserName: 'firefox' },
    { browserName: 'edge' }
  ],
  framework: 'jasmine',
  specs: ['specs/**/*.spec.js'],
};

multiCapabilities позволяет запускать тесты параллельно на нескольких браузерах, что ускоряет проверку совместимости и выявление различий.

Определение браузера во время выполнения

Иногда необходимо выполнять определённые действия в зависимости от текущего браузера. Для этого используется объект browser и его метод getCapabilities():

browser.getCapabilities().then(function (caps) {
  const browserName = caps.get('browserName');
  if (browserName === 'firefox') {
    // Специфическая логика для Firefox
  } else if (browserName === 'chrome') {
    // Логика для Chrome
  }
});

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

Ожидания и синхронизация

Различия в браузерах часто проявляются в скорости загрузки элементов и выполнении асинхронных операций. Protractor предлагает использовать Explicit Waits через ExpectedConditions, чтобы сделать тесты устойчивыми:

const EC = protractor.ExpectedConditions;
const elementToWait = element(by.id('submit-button'));

browser.wait(EC.elementToBeClickable(elementToWait), 5000, 'Элемент не кликабельный');
elementToWait.click();

Ключевой момент: использование фиксированных sleep() крайне нежелательно, так как разные браузеры могут иметь разную задержку, что делает тесты нестабильными.

Настройка таймаутов

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

browser.manage().timeouts().implicitlyWait(5000); // ожидание элементов
browser.manage().timeouts().setScriptTimeout(10000); // ожидание выполнения скриптов

Implicit Wait работает как резерв, но рекомендуется комбинировать его с explicit waits для большей точности.

Управление окнами и размерами

Различные браузеры могут рендерить элементы иначе в зависимости от размера окна. Настройка размеров окна перед тестами помогает уменьшить расхождения:

browser.driver.manage().window().setSize(1280, 1024);

В некоторых случаях полезно использовать максимизацию окна:

browser.driver.manage().window().maximize();

Работа с нестандартными поведениями

Некоторые браузеры имеют специфичные ограничения, например:

  • Firefox может некорректно обрабатывать CSS transitions в определённых версиях.
  • Safari на macOS требует дополнительной настройки WebDriver и имеет ограничения на автоматизацию alert/dialog.
  • Chrome может игнорировать определённые нестандартные события JavaScript.

Для таких случаев используют проверку браузера и внедрение браузер-специфичных патчей или условных шагов, как показано выше с getCapabilities().

Логи и отладка

Protractor позволяет собирать логи браузера и WebDriver, что помогает выявлять различия:

browser.manage().logs().get('browser').then(function(browserLogs) {
  browserLogs.forEach(function(log) {
    console.log(log.message);
  });
});

Анализ логов позволяет обнаруживать ошибки рендеринга, JavaScript-исключения и различия в поведении API между браузерами.

Стратегии минимизации различий

  1. Использование стандартных CSS и JS без экспериментальных фич.
  2. Единая конфигурация таймаутов и ожиданий для всех браузеров.
  3. Проверка кросс-браузерной совместимости на этапе разработки, а не только на тестах.
  4. Локализация нестабильных шагов с применением условной логики под конкретный браузер.

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