【问题标题】:Intern js :How to return PageObject of the page from the function which opens it ?实习生js:如何从打开它的函数返回页面的PageObject?
【发布时间】:2017-03-16 14:51:45
【问题描述】:

我正在使用 Intern js 进行 UI 自动化项目。我正在使用 page object model 来实现它。我有一个简单的场景,用户在登录页面中输入凭据并导航到欢迎页面。 在我的脚本中,我在LoginPage 中有一个“doLogin()”函数,它负责输入凭据并单击提交按钮。 现在的问题是我希望doLogin() 返回WelcomePage,但我无法弄清楚如何做到这一点。

这是我的代码设置:

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

有人可以帮忙吗?

【问题讨论】:

    标签: javascript promise intern pageobjects


    【解决方案1】:

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

    使用该模型,您的 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,因为当调用辅助函数(作为命令then 回调)时,它的上下文将设置为调用它的命令。

    你会像这样使用它们

    define([
        './WelcomePage',
        './LoginPage',
        // ...
    ], function (
        welcomePage,
        loginPage,
        // ...
    ) {
        // ...
    
        this.remote
            .get('some page')
            .then(loginPage.doLogin('username', 'password'))
            .then(welcomePage.doSomething())
            // other stuff
    
        // ...
    });
    

    【讨论】:

    • 但它给出了Cannot read property 'findById' of undefined 错误
    • 没有看到更完整的测试用例很难说。你的doLogin 函数(假设你正在做类似上面的例子)返回一个函数,还是返回函数内部的东西(this.parent.findById...)?它需要返回一个函数,并且这个函数会被一个then回调调用。
    • 我花了很长时间试图使过于复杂的示例工作。然后这种方法就像一个魅力。非常感谢你!
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2012-11-02
    相关资源
    最近更新 更多