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?

48
demandé sur Priyanshu Shekhar 2015-03-02 14:16:54

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.

68
répondu Michal Charemza 2015-05-09 08:09:56

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.

16
répondu alecxe 2017-05-23 11:47:04