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();
Некоторые браузеры имеют специфичные ограничения, например:
CSS transitions
в определённых версиях.Для таких случаев используют проверку браузера и внедрение
браузер-специфичных патчей или условных шагов, как
показано выше с getCapabilities().
Protractor позволяет собирать логи браузера и WebDriver, что помогает выявлять различия:
browser.manage().logs().get('browser').then(function(browserLogs) {
browserLogs.forEach(function(log) {
console.log(log.message);
});
});
Анализ логов позволяет обнаруживать ошибки рендеринга, JavaScript-исключения и различия в поведении API между браузерами.
Правильная обработка различий между браузерами позволяет сделать тесты устойчивыми, предсказуемыми и кросс-платформенными, что критично для сложных веб-приложений.