web-dev-qa-db-fra.com

Rapporteur - Où utiliser browser.waitForAngular ()

J'ai quelques tests écrits en utilisant rapporteur pour app angular.js. J'utilise le modèle de conception Page Objects et quelques méthodes me permettent de naviguer vers d'autres pages en cliquant sur les liens et les boutons. et peu de temps après, j'appelle browser.waitForAngular().

Page Object

module.exports = function () {
    this.companyNameLink = element(by.id('viewCompany'));
    this.newMeetingButton = element(by.id('newMeetingButton'));

    this.createNewGeneralMeeting = function () {
        this.newMeetingButton.click();
        browser.waitForAngular();
    };

    this.goToCompanyPage = function () {
        this.companyNameLink.click();
        browser.waitForAngular();
    };
};

Et dans certains fichiers de spécification, j'utilise cet objet de page comme celui-ci ..

var DashboardPage = require('../dashboardPageObject.js');
dashboardPage = new DashboardPage();

...

dashboardPage.goToCompanyPage();

Mais le problème est parfois que je reçois l'erreur angular could not be found on the window et que mes tests échouent. La plupart du temps, les tests sont exécutés. Ce problème est aléatoire. Ma question est la suivante: devrais-je supprimer la méthode browser.waitForAngular() de la méthode de l'objet page et l'appeler après avoir effectué l'appel de la méthode comme ceci ...

Objet de page modifié

...
this.goToCompanyPage = function () {
    this.companyNameLink.click();
};
...

Fichier de spécification

dashboardPage.goToCompanyPage();
browser.waitForAngular();

Est-ce que l'appel browser.waitForAngular() est à l'origine du problème? Où devrais-je appeler waitForAngular y a-t-il une meilleure pratique pour l'utiliser?

17
Kasun Kodagoda

De la documentation de rapporteur :

Demandez à WebDriver d'attendre qu'Angular ait terminé le rendu et qu'il n'y ait plus d'appel $ http ou $ timeout en attente avant de continuer. Notez que Protractor applique automatiquement cette commande avant chaque action WebDriver.

Vous ne devriez pas appeler cela du tout et je ne peux pas penser à un cas valable où vous devriez.

27
Delian Mitankin

Au lieu d'utiliser waitForAngular, vous devez gérer la promesse renvoyée par click.

Ainsi, tout d’abord, vos méthodes d’objet page doivent renvoyer ces promesses:

this.goToCompanyPage = function () {
    return this.companyNameLink.click();
};

Ensuite, votre utilisation réelle de cette méthode peut ressembler à ceci:

dashboardPage.goToCompanyPage().then(function() {
  // this will be executed when the click is done.
  // No need for any waitForAngular.
});

Pour d'autres exemples, voir ma version state/page-object de la suite de tests PhoneCat Protector de Angular.

8
avandeursen

J'utilise browser.WaitForAngular () avant de naviguer vers une page spécifique via browser.Url Sinon, des erreurs se produisent dans le journal du navigateur pour lequel je déclare le nettoyage de test.

0
Alexander Zhidkov