К началу 2010-х годов экосистема JavaScript активно смещалась в
сторону одностраничных приложений. AngularJS (Angular 1.x),
представленный Google в 2010 году, стал одним из ключевых фреймворков
этого периода. Он предложил принципиально иной подход к построению UI:
двустороннее связывание данных, директивы, dependency injection и
управление состоянием через $scope.
Классические инструменты end-to-end тестирования, такие как Selenium
WebDriver, изначально не учитывали особенностей Angular-приложений.
Основная проблема заключалась в асинхронной природе Angular: обновление
DOM происходило не сразу после действий пользователя, а после завершения
digest-цикла и обработки $http, $timeout,
$interval и промисов. Selenium требовал ручного управления
ожиданиями, что приводило к нестабильным тестам и избыточному коду.
Protractor был создан командой Angular в Google как специализированная надстройка над Selenium WebDriver, ориентированная на тестирование AngularJS-приложений. Первый публичный релиз появился примерно в 2013 году.
Ключевая идея Protractor заключалась в глубокой интеграции с Angular:
wait и
sleep.Protractor изначально разрабатывался как инструмент end-to-end тестирования, а не unit или integration тестов.
Protractor строился поверх нескольких ключевых компонентов:
Одной из важных архитектурных особенностей стало внедрение Angular-хуков. Protractor внедрял специальный скрипт в страницу, позволяя:
$http запросы;$rootScope;Это дало возможность реализовать автоматическое ожидание, которое стало визитной карточкой Protractor.
Важным этапом эволюции Protractor стало появление Angular-локаторов, недоступных в чистом Selenium:
by.modelby.bindingby.repeaterby.exactBindingby.optionsЭти локаторы работали напрямую с внутренними структурами AngularJS, а не только с DOM. Это позволяло писать более устойчивые и выразительные тесты, тесно связанные с логикой приложения.
Пример концепции:
На ранних этапах Protractor активно использовался преимущественно с Chrome и Firefox. По мере развития:
Protractor быстро стал стандартом де-факто для e2e-тестирования AngularJS-приложений.
С выходом Angular 2 (2016 год) экосистема столкнулась с серьёзными изменениями:
$scope и digest-цикла;Protractor адаптировался к этим изменениям. Хотя Angular 2+ кардинально отличался от AngularJS, инструмент продолжил использоваться как основной e2e-фреймворк.
Ключевые изменения в Protractor в этот период:
browser.waitForAngularEnabled(false)).Одним из самых значимых этапов эволюции Protractor стал отказ от Selenium Control Flow.
Изначально Protractor маскировал асинхронность, позволяя писать код в синхронном стиле:
element(by.id('login')).sendKeys('admin');
element(by.id('submit')).click();
Под капотом все действия ставились в очередь Control Flow. Однако этот подход:
Начиная с версий Protractor 5+ и особенно в 6–7 версиях:
async/await;Это сблизило Protractor с остальной экосистемой Node.js, но потребовало миграции существующих проектов.
К концу 2010-х годов рынок e2e-тестирования начал смещаться:
Основные проблемы Protractor на этом этапе:
В 2021 году команда Angular официально объявила о прекращении активной поддержки Protractor. Репозиторий был переведён в режим maintenance, а затем архивирован.
Причины решения:
При этом Protractor продолжает использоваться в существующих проектах, особенно в legacy-системах на AngularJS и ранних версиях Angular.
Protractor сыграл ключевую роль в развитии frontend-тестирования:
Многие идеи Protractor — такие как синхронизация с состоянием приложения и высокоуровневые локаторы — стали стандартом для последующих поколений инструментов тестирования.