Qu'est-ce que navigateur.ignoreSynchronization dans le Rapporteur?
J'ai vu tellement de fois où les gens suggèrent d'utiliser:
browser.ignoreSynchronization=true; // or false
Mais je ne comprends pas pourquoi en avons-nous besoin?
2 réponses
La réponse simple est que cela fait que protractor n'attend pas les promesses angulaires, telles que celles de $http
ou $timeout
à résoudre, ce que vous voudrez peut-être faire si vous testez le comportement pendant $http
ou $timeout
(par exemple, un message "chargement"), ou tester des sites ou des pages Non angulaires, comme une page de connexion séparée.
Par exemple, Pour tester un bouton qui définit un message de chargement lors d'une requête, vous pouvez le configurer pour true
lors de l'extraction d'un élément + vérification de son contenu
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');
Un plus la réponse impliquée est que le définir sur true
signifie que les ajouts/injections ultérieurs au flux de contrôle n'ajoutent pas non plus browser.waitForAngular
. Il y a des cas où une compréhension du flux de contrôle, et quand/comment les choses sont ajoutées / injectées dedans est importante. Par exemple, si vous utilisez browser.wait
pour tester un processus à plusieurs étapes, la fonction passée à wait
est injectée dans le flux de contrôle après que les autres fonctions du test ont été ajoutées au contrôle flux.
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');
Une alternative à l'utilisation de browser.ignoreSynchronization
est d'accéder directement à l'API WebDriver standard
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');
L'utilisation directe des méthodes du pilote pour trouver les éléments signifie que le système essaiera de les trouver sans attendre la fin des requêtes $http
en cours, tout comme le réglage browser.ignoreSynchronization = true
.
Ce paramètre contrôle si protractor doit attendre angular sur une page ou non. Il n'est pas correctement documenté, mais voici la chaîne de documentation du code :
/**
* 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}
*/
En d'autres termes, si vous testez sur un site non angulaire, définissez ignoreSynchronization
sur true
. À titre d'exemple du monde réel, voir l'un des défis que j'ai eu lors de l'ouverture d'une page Non-angulaire à partir d'une page angulaire: page Non-angulaire ouverte après un clic.