Что такое browser.ignoreSynchronization в транспортире?
Я видел это так много раз, когда люди предлагают использовать:
browser.ignoreSynchronization=true; // or false
Но я не понимаю, зачем нам это?
3 ответа
Простой ответ заключается в том, что это заставляет транспортир не ждать угловых обещаний, таких как $http
или же $timeout
решить, что вы можете сделать, если вы тестируете поведение во время $http
или же $timeout
(например, сообщение "загрузка") или тестирование неангловых сайтов или страниц, например отдельной страницы входа.
Например, чтобы проверить кнопку, которая устанавливает сообщение о загрузке во время запроса, вы можете установить его в true
при получении элемента + проверка его содержимого
element(by.css('button[type="submit"]')).click();
browser.ignoreSynchronization = true;
expect(element(by.css('.message')).getText().toBe('Loading...');
browser.ignoreSynchronization = false;
expect(element(by.css('.message')).getText().toBe('Loaded');
Более сложный ответ заключается в том, что установка его на true
означает, что последующие добавления / инъекции в поток управления также не добавляют browser.waitForAngular
, Существуют случаи, когда важно понимание потока управления и когда / как что-то добавляется / вводится в него. Например, если вы используете browser.wait
чтобы проверить многоступенчатый процесс, функция передана wait
вводится в поток управления после добавления остальных функций теста в поток управления.
element(by.css('button[type="submit"]')).click();
browser.ignoreSynchronization = true;
expect(element(by.css('.message')).getText().toBe('Stage 1');
browser.wait(function () {
// This function is added to the control flow after the final
// browser.ignoreSynchronization = false in the test
// so we need to set it again here
browser.ignoreSynchronization = true;
return element(by.cssContainingText('.message', 'Stage 2')).isPresent().then(function(isPresent) {
// Cleanup so later tests have the default value of false
browser.ignoreSynchronization = false;
return !isPresent;
});
});
expect(element(by.css('.message')).getText().toBe('Stage 2');
browser.ignoreSynchronization = false;
expect(element(by.css('.message')).getText().toBe('Stage 3');
Альтернатива использованию browser.ignoreSynchronization
это доступ к стандартному API веб-драйвера напрямую
element(by.css('button[type="submit"]')).click();
expect(browser.driver.findElement(by.css('.message')).getText().toBe('Loading...');
expect(element(by.css('.message')).getText().toBe('Loaded');
Использование методов драйвера непосредственно для поиска элементов означает, что система попытается найти их, не ожидая каких-либо текущих $http
просит закончить, очень похоже на настройку browser.ignoreSynchronization = true
,
Этот параметр определяет, должен ли транспортир ждать углового на странице или нет. Это не задокументировано должным образом, но вот строка документации из кода:
/**
* If true, Protractor will not attempt to synchronize with the page before
* performing actions. This can be harmful because Protractor will not wait
* until $timeouts and $http calls have been processed, which can cause
* tests to become flaky. This should be used only when necessary, such as
* when a page continuously polls an API using $timeout.
*
* @type {boolean}
*/
Другими словами, если вы тестируете против неуглового сайта - установите ignoreSynchronization
установка на true
, В качестве примера из реальной жизни рассмотрим одну из проблем, с которыми я столкнулся при открытии неугловой страницы на угловой странице: неугловая страница открывается после щелчка.
2021 ответ
browser.ignoreSynchronization
в наши дни ничего не стоит. В прямом смысле
Эта команда устарела 25 января 2018 г., когда транспортир
v5.3.0
был выпущен
Вместо
browser.waitForAngularEnabled()
следует использовать (прочтите, как его можно использовать )
Но что он делает, так это то, что он обеспечивает встроенную обработку в Protractor для ожидания приложений angular. Представьте, что вы нажимаете кнопку входа в систему, и вам не нужно использовать команду «спать на 10 секунд» или «подождать, пока не исчезнет анимация загрузки» и т. Д. Теоретически все это должно обрабатываться транспортиром из коробки.
Но на самом деле существует слишком много крайних случаев, когда вы не можете полагаться на это, и вам нужно отключить эту функцию, потому что это заставляет скрипт зависать. И это когда
await browser.waitForAngularEnabled(false)
вступает в игру. Или же
await browser.waitForAngularEnabled(true)
включение его снова