Protractor — инструмент для end-to-end тестирования приложений на Angular и AngularJS, но его возможности распространяются и на тестирование обычных веб-приложений. При работе с браузером Safari следует учитывать ряд специфических особенностей, связанных как с самим браузером, так и с механизмом взаимодействия WebDriver.
SafariDriver встроен в macOS начиная с версии 10.0. Для его работы не требуется отдельная установка сторонних драйверов, как в случае с Chrome или Firefox. Однако необходимо активировать режим Allow Remote Automation в настройках Safari:
safaridriver --enable.Без этого шага Protractor не сможет инициировать соединение с браузером.
В конфигурационном файле 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.safari.options для включения дополнительных настроек:capabilities: {
browserName: 'safari',
'safari.options': {
technologyPreview: false
}
}
waitForAngularEnabled). В Safari иногда наблюдаются
ложные тайм-ауты, когда браузер не завершает обработку
событий Angular. Рекомендуется использовать явные ожидания через
ExpectedConditions:const EC = protractor.ExpectedConditions;
browser.wait(EC.visibilityOf(element(by.css('.my-element'))), 5000);
Ограниченная поддержка вкладок и окон
SafariDriver плохо работает с несколькими окнами. Методы
browser.switchTo().window() могут приводить к
непредсказуемым результатам. Для тестов, требующих работы с новыми
вкладками, лучше использовать отдельные сессии.
Поддержка JavaScript-промисов и асинхронности
Safari иногда возвращает неожиданные значения при работе с
async/await в Protractor, особенно при взаимодействии с
element.all(). Рекомендуется явно ожидать выполнения всех
промисов:
const elements = await element.all(by.css('.items')).getText();
browser.switchTo().alert() работают нестабильно в Safari.
Часто требуется дополнительная проверка наличия alert перед вызовом
accept() или dismiss().Для тестирования на iOS Safari используется комбинация Protractor и Appium. Основные различия:
platformName: 'iOS' и
deviceName.automationName рекомендуется устанавливать как
'XCUITest'.browser.manage().window().setSize(), не
поддерживаются.browser.executeScript() с вызовом JavaScript.capabilities: { loggingPrefs: { browser: 'ALL' } } помогает
отслеживать ошибки, которые не отображаются в консоли Protractor.При настройке автоматизированного тестирования Safari в CI/CD-среде (например, Jenkins, GitHub Actions):
safaridriver --enable.Эта детальная информация обеспечивает понимание особенностей работы Protractor с Safari и позволяет корректно строить стабильные end-to-end тесты на этой платформе.