Я видел это так много раз, когда люди предлагают использовать:
browser.ignoreSynchronization=true; // or false
Но я не понимаю, зачем нам это нужно?
Я видел это так много раз, когда люди предлагают использовать:
browser.ignoreSynchronization=true; // or false
Но я не понимаю, зачем нам это нужно?
Простой ответ заключается в том, что он не дотягивает до версии Angular promises, например, от $http
или $timeout
, которые вы можете захотеть сделать, если вы тестируете поведение во время $http
или $timeout
(например, сообщение "загрузка" ) или тестирование сайтов или страниц без Angular, таких как отдельная страница входа.
Например, чтобы проверить кнопку, которая устанавливает загружаемое сообщение во время запроса, вы можете установить его на 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-интерфейсам webdriver.
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
.
Этот параметр определяет, должен ли транспортир ждать angular на странице или нет. Это не правильно документировано, но вот строка документации из кода:
/**
* 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}
*/
Другими словами, если вы тестируете сайт не angular - установите ignoreSynchronization
на true
. В качестве примера в реальном мире см. Одну из проблем, которые я обнаружил при открытии страницы без angular со страницы angular: Non- angular, открывшейся после щелчка.