实习生js:如何从打开它的函数返回页面的PageObject?

时间:2017-03-16 14:51:46

标签: javascript promise intern pageobjects

我正在使用Intern js处理UI自动化项目。我正在使用page object model实现它。我有一个简单的场景,用户在登录页面中输入凭据并导航到欢迎页面。 在我的剧本中,我有一个' doLogin()' LoginPage中的函数,负责输入凭据并单击“提交”按钮。 现在问题是我希望doLogin()返回WelcomePage并且我无法找到执行此操作的方法。

继承我的代码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;
    });

现在我真正希望实现的目标是:

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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

实现页面对象的一种更灵活的方法是使它们成为辅助函数组(如Leadfoot的pollUntil)而不是类似Command的对象。

使用该模型,您的LoginPage对象可能如下所示:

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可能看起来像

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

您可以在返回的函数中调用this.parent,因为当调用辅助函数时(作为Command then回调),它的上下文将被设置为调用它的Command。

你会像

一样使用它们
define([
    './WelcomePage',
    './LoginPage',
    // ...
], function (
    welcomePage,
    loginPage,
    // ...
) {
    // ...

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

    // ...
});