2
votes

Comment annuler le remplacement du navigateur.waitforAngular dans le rapporteur

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);
}**


0 commentaires

4 Réponses :


0
votes

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 angulaires
  • browser.driver.get Lorsque la page Web n'a pas de composants angulaires

2 commentaires

J'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



0
votes

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


0 commentaires

0
votes

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 !!!


0 commentaires

0
votes

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


0 commentaires