J'ai une suite de régression automatisée avec Protractor & Jasmine. L'application testée est récemment devenue une application hybride, NgUpgrade
avec NgUpgrade
. après la mise à niveau, les scripts expirent pour accéder à certains éléments. J'ai ajouté le script ci-dessous pour remplacer la fonction waitforAngular
qui est le correctif pour le problème de délai d' waitforAngular
. Cependant, cela ne fonctionnera pas pour la connexion (page non angulaire). Je dois annuler ce remplacement pour la page non angulaire. se demandant si quelqu'un peut fournir de l'aide à ce sujet
**var script = "var callback = arguments[arguments.length - 1];" + "angular.element(document.querySelector(\"body\")).injector()" + ".get(\"$browser\").notifyWhenNoOutstandingRequests(callback)"; browser.waitForAngular = ()=> { return browser.executeAsyncScript(script); }**
4 Réponses :
Pour remplacer le comportement par défaut de Protractor pour attendre les appels angulaires, vous pouvez désactiver l'attente angulaire par: browser.waitForAngularEnabled(false)
Cependant, la documentation de Protractor recommande d'utiliser le pilote waitForAngularEnabled
directement au lieu de basculer la propriété waitForAngularEnabled
qui peut conduire à un script instable.
Une alternative serait d'utiliser browser.driver.<whatever>
au lieu de browser.<whatever>
:
Exemple:
browser.get
Lorsque la page Web contient des composants angulairesbrowser.driver.get
Lorsque la page Web n'a pas de composants angulairesJ'ai essayé 'browser.waitForAngularEnabled (false)' mais pas de chance.this.specStarted = function (result) {browser.executeScript ("return !! (window.angular || window.ng);") .then (function (isAngular) {if (isAngular) {var script = "var callback = arguments [arguments.length - 1];" + "angular.element (document.querySelector (\" body \ ")). injector ()" + ". get (\ "$ browser \"). notifyWhenNoOutstandingRequests (callback) "; browser.waitForAngular = (test) => {if (test) {return browser.executeAsyncScript (script);}}} else {browser.waitForAngularEnabled (false );}});};
ajouté browser.driver.get aussi, mais ne fonctionne toujours pas
J'ai essayé la solution browser.waitForAngularEnabled (false) ci-dessous sur une page non angulaire mais elle entre toujours dans browser.executeAsyncScript (script) et lance l'erreur "angular not defined"
this.specStarted = function (result) { browser.executeScript("return !!(window.angular || window.ng);") .then(function(isAngular){ if(isAngular) { console.log('angular page '); var script = "var callback = arguments[arguments.length - 1];" + "angular.element(document.querySelector(\"body\")).injector()" + ".get(\"$browser\").notifyWhenNoOutstandingRequests(callback)"; browser.waitForAngular = (test)=> { if(test){ return browser.executeAsyncScript(script); } } } else { browser.waitForAngularEnabled(false); console.log('not an angular page'); } }); };
Une solution peut être de modifier le comportement angularEnabled par défaut. Par défaut, waitForAngularEnabled
a la valeur true
. Vous devez modifier ce comportement par défaut à l'aide de waitForAngularEnabled(false)
. Mais gardez à l'esprit que cela dépend totalement de la séquence des scripts en cours d'exécution. c'est-à-dire si vous êtes connecté à l'application et que vous souhaitez maintenant accéder à la page de connexion (page non angulaire), vous devez désactiver ce comportement par défaut et chaque fois que vous entrez dans une autre page, c'est-à-dire la page angulaire, vous devez l'activer par défaut comportement.
Faites-moi savoir si cela aide !!!
Merci à tous, ce problème est résolu avec le code ci-dessous
browser.waitForAngular = function(){var script = "var callback = arguments[arguments.length -1]" +"angular.element(document.querySelector(\"body\")).injector()" +".get(\"$browser\").notifyWhenNoOutstandingRequests(callback)"; if (!this.ignoreSynchronization) { return browser.executeAsyncScript(script); } else { return this.driver.controlFlow().execute(() => { return true; }, 'Ignore Synchronization Protractor.waitForAngular()') } };