2017-03-16 1 views
1

Je travaille sur un projet d'automatisation de l'interface utilisateur en utilisant Intern js. Et je l'implémente en utilisant page object model. J'ai un scénario simple où l'utilisateur entre les informations d'identification dans la page de connexion et est navigué pour accueillir la page. Dans mon script, j'ai une fonction 'doLogin()' dans LoginPage qui est responsable de la saisie des informations d'identification et en cliquant sur le bouton soumettre. Maintenant, le problème est que je veux doLogin() pour retourner WelcomePage et je suis incapable de trouver le moyen de le faire.Intern js: Comment retourner PageObject de la page de la fonction qui l'ouvre?

Heres mon code SEtUP:

LoginPage.js

   define([], 
        function() { 

        function LoginPage(remote) { 
        this.remote = remote; 

        } 

       LoginPage.prototype = { 
        constructor: LoginPage, 
        // Login Page related Methods 

        doLogin: function(username,password){ 
        this 
        .findById(json.locators.username). 
        .type(username).end() 
        .findById(json.locators.password) 
        .type(username).end() 
        .findByXpath(json.locators.sumit).click().end() 
        .sleep(1000).then(function(){ 
        return welcomePage// this is not working 
        }) 
       } 
      }; 

      return LoginPage; 
     }); 

WelcomePage.js

   define([], 
       function() { 

       function WelcomePage(remote) { 
        this.remote = remote; 

        } 

       WelcomePage.prototype = { 
        constructor: WelcomePage, 

        doSomething: function(){ 
       //welcome page related method 
       } 
      }; 

     return WelcomePage; 
    }); 

Maintenant, ce que je veux vraiment achive est de faire quelque chose comme:

loginpage.doLogin(usrname,password).doSomething(); 

peut certains l'aide du corps à ce sujet?

Répondre

1

Une manière plus flexible d'implémenter des objets de page est de les rendre des groupes de fonctions d'assistance (comme pollUntil de Leadfoot) plutôt que des objets de type commande.

En utilisant ce modèle, votre objet LoginPage pourrait ressembler à:

define([], function() { 
    return { 
     doLogin: function (username, password) { 
      return function() { 
       return this.parent 
        .findById(json.locators.username). 
        .type(username).end() 
        .findById(json.locators.password) 
        .type(username).end() 
        .findByXpath(json.locators.sumit).click().end() 
        .sleep(1000).then(function(){ 
         return welcomePage// this is not working 
        }); 
      } 
     } 
    }; 
}); 

WelcomePage pourrait ressembler à

define([], function() { 
    return { 
     doSomething: function() { 
      return function() { 
       return this.parent 
        // more stuff 
      } 
     } 
    }; 
}); 

Vous pouvez appeler this.parent dans la fonction renvoyée parce que lorsque la fonction d'aide est appelée (comme a Command then callback) son contexte sera défini sur la commande qui l'appelle.

vous les utiliser comme

define([ 
    './WelcomePage', 
    './LoginPage', 
    // ... 
], function (
    welcomePage, 
    loginPage, 
    // ... 
) { 
    // ... 

    this.remote 
     .get('some page') 
     .then(loginPage.doLogin('username', 'password')) 
     .then(welcomePage.doSomething()) 
     // other stuff 

    // ... 
}); 
+0

mais il donne 'Impossible de lire la propriété « findById » d'erreur undefined' – CodeBlooded

+0

Il est difficile de dire sans voir un test plus complet. Est-ce que votre fonction 'doLogin' (en supposant que vous faites quelque chose comme les exemples ci-dessus) retourne une fonction, ou est-ce qu'elle retourne la substance dans la fonction (' this.parent.findById ... ')? Il a besoin de retourner une fonction, et cette fonction sera appelée en tant que rappel 'then'. – jason0x43

+0

J'ai passé des heures à essayer de faire des exemples trop compliqués ... alors cette approche a fonctionné comme un charme .. Merci beaucoup! –