Protractor изначально разработан для тестирования Angular-приложений и использует встроенный механизм ожидания завершения всех асинхронных операций Angular перед выполнением действий с элементами страницы. Это поведение обеспечивает стабильность тестов для Angular-приложений, но иногда необходимо отключить автоматическую синхронизацию, особенно при тестировании страниц, не относящихся к Angular, или при смешанных приложениях, где часть страниц написана на Angular, а часть — на обычном HTML/JS.
Protractor работает поверх WebDriverJS и реализует ожидание
Angular-зоны (ngZone) перед взаимодействием с
элементами. Он проверяет:
$http и
$timeout,По умолчанию Protractor не выполняет действия, пока Angular полностью не стабилизируется, что позволяет избежать проблем с недоступными элементами или неполностью отрендеренными компонентами.
Отключение автоматической синхронизации Angular необходимо в следующих случаях:
Тестирование не-Angular страниц Protractor при работе с обычными HTML-страницами будет ждать стабилизации Angular, которая отсутствует, что приведет к зависанию теста.
Смешанные приложения Если часть приложения использует Angular, а часть — нет, требуется временно отключать синхронизацию при переходе на не-Angular страницы.
Необычные Angular конфигурации Некоторые сторонние библиотеки или кастомные зоны Angular могут нарушить стандартный механизм ожидания.
browser.waitForAngularEnabledДля управления синхронизацией используется метод
browser.waitForAngularEnabled().
// Отключение синхронизации
await browser.waitForAngularEnabled(false);
// Переход на не-Angular страницу
await browser.get('https://example.com/non-angular');
// Выполнение действий на странице
const button = element(by.id('submit'));
await button.click();
// Включение синхронизации для следующей Angular страницы
await browser.waitForAngularEnabled(true);
Ключевые моменты:
true — синхронизация включена (по умолчанию).false — синхронизация отключена.browser.ignoreSynchronization (устаревший подход)Ранее для отключения синхронизации использовалось свойство
browser.ignoreSynchronization:
browser.ignoreSynchronization = true;
Однако начиная с Protractor 5.x рекомендуется использовать
browser.waitForAngularEnabled, так как оно:
await browser.waitForAngularEnabled(false)),await browser.waitForAngularEnabled(false);
await browser.get('https://example.com/form');
await element(by.css('input[name="email"]')).sendKeys('test@example.com');
await element(by.css('button[type="submit"]')).click();
// Angular страница
await browser.get('https://example.com/angular-page');
// Выполнение действий на Angular странице
await element(by.model('user.name')).sendKeys('John');
// Переход на не-Angular страницу
await browser.waitForAngularEnabled(false);
await browser.get('https://example.com/static-page');
await element(by.css('#download')).click();
// Возврат на Angular страницу
await browser.waitForAngularEnabled(true);
await browser.get('https://example.com/angular-page');
describe('Микс Angular и не-Angular страниц', function() {
it('Выполняет действия на Angular странице', async function() {
await browser.get('https://example.com/angular');
await element(by.binding('user.name')).getText();
});
it('Выполняет действия на не-Angular странице', async function() {
await browser.waitForAngularEnabled(false);
await browser.get('https://example.com/static');
await element(by.css('#static-button')).click();
});
});
ExpectedConditions или
browser.wait, иначе возможны ошибки типа
element not visible или
stale element reference.Пример явного ожидания:
const EC = protractor.ExpectedConditions;
const button = element(by.id('submit'));
await browser.wait(EC.elementToBeClickable(button), 5000);
await button.click();
$http или $timeout, поэтому
асинхронные операции на Angular-странице могут быть недоступны для
взаимодействия до явного ожидания.true после
работы с не-Angular страницами.waitForAngularEnabled(false) с явными
ожиданиями ExpectedConditions, чтобы избежать
нестабильности тестов.Отключение Angular синхронизации в Protractor — мощный инструмент для гибкого управления тестами, позволяющий корректно обрабатывать не-Angular страницы и смешанные приложения, сохраняя стабильность и предсказуемость выполнения тестов.