Что такое 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) включение его снова

Другие вопросы по тегам