Ответ 1
Простой ответ заключается в том, что он не дотягивает до версии 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
.