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()')
}
};