Особенности Safari

Protractor — инструмент для end-to-end тестирования приложений на Angular и AngularJS, но его возможности распространяются и на тестирование обычных веб-приложений. При работе с браузером Safari следует учитывать ряд специфических особенностей, связанных как с самим браузером, так и с механизмом взаимодействия WebDriver.


Использование SafariDriver

SafariDriver встроен в macOS начиная с версии 10.0. Для его работы не требуется отдельная установка сторонних драйверов, как в случае с Chrome или Firefox. Однако необходимо активировать режим Allow Remote Automation в настройках Safari:

  1. Открыть меню Develop.
  2. Включить Allow Remote Automation.
  3. Убедиться, что SafariDriver доступен через терминал командой safaridriver --enable.

Без этого шага Protractor не сможет инициировать соединение с браузером.


Конфигурация Protractor для Safari

В конфигурационном файле protractor.conf.js необходимо указать browserName как 'safari'. Пример минимальной конфигурации:

exports.config = {
    directConnect: true,
    capabilities: {
        browserName: 'safari'
    },
    framework: 'jasmine',
    specs: ['specs/**/*.spec.js'],
    jasmineNodeOpts: {
        defaultTimeoutInterval: 30000
    }
};

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

  • directConnect: true позволяет обходить Selenium Server, напрямую взаимодействуя с SafariDriver.
  • SafariDriver поддерживает только один экземпляр браузера за раз, поэтому параллельное выполнение тестов ограничено.
  • Некоторые версии Safari требуют явного указания опции safari.options для включения дополнительных настроек:
capabilities: {
    browserName: 'safari',
    'safari.options': {
        technologyPreview: false
    }
}

Ограничения SafariDriver

  1. Проблемы с синхронизацией Angular Protractor использует механизм ожидания Angular (waitForAngularEnabled). В Safari иногда наблюдаются ложные тайм-ауты, когда браузер не завершает обработку событий Angular. Рекомендуется использовать явные ожидания через ExpectedConditions:
const EC = protractor.ExpectedConditions;
browser.wait(EC.visibilityOf(element(by.css('.my-element'))), 5000);
  1. Ограниченная поддержка вкладок и окон SafariDriver плохо работает с несколькими окнами. Методы browser.switchTo().window() могут приводить к непредсказуемым результатам. Для тестов, требующих работы с новыми вкладками, лучше использовать отдельные сессии.

  2. Поддержка JavaScript-промисов и асинхронности Safari иногда возвращает неожиданные значения при работе с async/await в Protractor, особенно при взаимодействии с element.all(). Рекомендуется явно ожидать выполнения всех промисов:

const elements = await element.all(by.css('.items')).getText();
  1. Ограничения на alert и confirm Методы browser.switchTo().alert() работают нестабильно в Safari. Часто требуется дополнительная проверка наличия alert перед вызовом accept() или dismiss().

Работа с Mobile Safari

Для тестирования на iOS Safari используется комбинация Protractor и Appium. Основные различия:

  • Необходимо указать platformName: 'iOS' и deviceName.
  • automationName рекомендуется устанавливать как 'XCUITest'.
  • Некоторые WebDriver-команды, такие как browser.manage().window().setSize(), не поддерживаются.
  • Для эмуляции жестов и скроллинга используется browser.executeScript() с вызовом JavaScript.

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

  • Избегать параллельных сессий — Safari не поддерживает одновременные подключения нескольких драйверов.
  • Явные ожидания вместо автоматических — Angular-синхронизация нестабильна.
  • Регулярное обновление Safari — старые версии SafariDriver имеют баги с асинхронными операциями.
  • Логирование действий — включение capabilities: { loggingPrefs: { browser: 'ALL' } } помогает отслеживать ошибки, которые не отображаются в консоли Protractor.
  • Отдельные конфигурации для macOS и iOS — код, работающий на настольном Safari, может требовать изменений для мобильного.

Интеграция с CI/CD

При настройке автоматизированного тестирования Safari в CI/CD-среде (например, Jenkins, GitHub Actions):

  • Нужно использовать macOS-агентов.
  • Перед запуском тестов включать Allow Remote Automation через скрипт safaridriver --enable.
  • Следует учитывать ограничение на одну сессию Safari одновременно — запуск нескольких тестов в параллельных контейнерах невозможен.

Эта детальная информация обеспечивает понимание особенностей работы Protractor с Safari и позволяет корректно строить стабильные end-to-end тесты на этой платформе.