2015-11-11 4 views
2

Je crée une fonction d'assistance pour mes tests de protractor pour connecter l'application seulement si nécessaire. Ceci est utile pour me permettre d'exécuter chaque test séparément pour le déboguer et, lors de l'exécution de la suite entière, je reçois un petit coup de pouce de performance en n'ayant pas besoin de se connecter avant chaque test.Sur une fonction d'aide de rapporteur, comment puis-je savoir si browser.get a déjà été appelé?

Je dois vous connecter réellement dans deux situations:

  1. Si aucune page n'a jamais été chargé (browser.get() n'a pas été appelé).
  2. Nous sommes sur une page, mais pas encore connecté.

La situation 2 est facile. L'application a un élément qui est montré sur toutes les pages lorsque l'utilisateur est connecté.

La partie difficile est 1. Si j'essaie de trouver l'élément qui indique que l'utilisateur est connecté avant de charger des pages, je reçois l'erreur suivante:

Error while waiting for Protractor to sync with the page: "angular could not be found on the window" 

et je ne vois rien sur l'API ou code source protractor qui pourrait me aider à déterminer si des pages déjà chargées.

Les pointeurs sont appréciés.

Répondre

2

Belle question, même si je ne pense pas que ce soit une bonne idée d'avoir des tests dans un état non déterministe après avoir fait quelque chose.

Seul moyen de savoir si obtenir a été appelé Je peux penser à est de vérifier que browser.driver.getCurrentUrl() renvoie l'URL souhaitée, ou ne revient pas sur: vide. Mais vous devrez attendre un certain temps, car getCurrentUrl renvoie environ: blank même après avoir appelé get, mais la page n'est pas entièrement chargée. Donc, je ferais quelque chose comme ceci:

beforeEach(function() { 
    EC = protractor.ExpectedConditions; 
    var URL; 
    browser.ignoreSynchronization = true; 
    //get rid of automatic check that would give you the "Protractor Sync Error" 
    browser.wait(EC.presenceOf($('.ng-scope')),500) 
       .then(function(){},function(err) { 
        console.log(err) 
        browser.driver.getCurrentUrl().then(function(url) { 
         URL = url; 
         if(URL == "about:blank"){ 
          console.log('no get before'); 
          // your login function here - no get was called before this wait 
         } 
        }); 
       }); 
    browser.ignoreSynchronization = false; 

}); 

La question est si vous avez besoin même de vérifier sur: vide, parce que dans votre cas, il pourrait être suffisant pour vérifier que .NG-champ, ou votre « login élément". Mais cela devrait vous donner un coup de pied.

+1

Je vous remercie beaucoup pour cela, il m'a mis sur la bonne direction. Qu'est-ce que l'astuce pour moi était de mettre le login, en utilisant 'browser.wait()' sur une fonction before (j'ai utilisé 'beforeAll'). Bien sûr 'browser.ignoreSynchronization' est très important aussi, mais que j'avais déjà vu. – ianribas

+1

Et vous avez raison, j'ai simplifié quelque peu la solution en attendant directement mon élément de connexion ('element (by.id ('IdOfLoginElement')). GetText') et en appelant la fonction de connexion sur le gestionnaire d'erreurs. Je n'ai pas vraiment besoin de l'URL. – ianribas

+0

Et, un commentaire conceptuel, c'est un choix conscient de commencer le test sur une page déjà connectée. L'application a une navigation interne, de sorte que chaque test commence généralement par changer l'emplacement, ce qui donne des garanties sur l'état. Et je peux toujours forcer le chargement de la page (et me reconnecter) si les tests deviennent floconneux. – ianribas