'TypeError: undefined is not a function' using Protractor

'TypeError: undefined is not a function' using Protractor

我知道有很多关于此错误代码的主题。但是,我正在努力寻找任何有帮助的解决方案(或者我可能只是愚蠢)。

我正在为网页构建 Protractor 测试,我的原始 JavaScript 运行良好。但我想将其全部转换为使用页面对象,以便于编辑和理解以及避免代码重复。

我用于登录的第一个页面对象工作得很好,但是我用于添加新用户的第二个页面对象却没有。

我从中链接页面对象的主测试文档分别包含有效和无效的代码实例。

我在cmd中运行量角器测试时得到的错误是:

1) This should hold all the tests while logged in to Admin site Should create first new User.

       Message:
         TypeError: undefined is not a function
       Stacktrace:
         TypeError: undefined is not a function
        at [object Object].<anonymous> (C:\\\test
    04_spec.js:25:27)

第一个引用的页面是:

require ('../page/users_page.js');

var login_page = function(){

    this.username = element(by.id('username'));
    this.password = element(by.id('password'));

    this.get = function(urlVal){
        browser.get(urlVal);
    };

    this.login = function(un, pass){
        this.username.sendKeys(un);
        this.password.sendKeys(pass);
        element(by.tagName('button')).click();
    };
};

module.exports = login_page;

而第二个实例引用的页面是:

require ('../page/users_page.js');

var users_page = function(){

    this.addUserButton = element(by.css('[role="button"]'));
    this.firstName = element(by.model('firstname'));
    this.lastName = element(by.model('lastname'));
    this.userName = element(by.model('username'));
    this.password = element(by.model('password'));
    this.confirmPassword = element(by.model('confirmpassword'));
    this.confirm = element(by.css('[class="btn btn-success marginRight10px floatLeft"]'));
    this.back = element(by.css('[class="btn floatLeft"]'));

    this.addUser = function(fn, ln, un, pw, cpw){
        this.firstname.sendKeys(fn);
        this.lastword.sendKeys(ln);
        this.username.sendKeys(un);
        this.password.sendKeys(pw);
        this.confirmpassword.sendKeys(cpw);
    };

    this.userRole = function(index){
        element(by.model('tes.userRole')).$('[value="'+index+'"]').click();
    };

    return require('./users_page.js');

};
module.exports = new users_page();

至少有一个问题:addUserButton 不是函数。替换:

usersPage.addUserButton().click();

与:

usersPage.addUserButton.click();

confirmback 页面对象字段也是如此。


另外,代替:

usersPage.userRole[0];

您可能打算调用底层页面对象函数:

usersPage.userRole(0);

除此之外,您可能打算实例化一个新的 "users page" 对象。替换:

var usersPage = new login_page;

与:

var usersPage = new users_page;

require ('../page/users_page.js');

var login_page = function(){

    this.username = element(by.id('username'));
    this.password = element(by.id('password'));

    this.get = function(urlVal){
        browser.get(urlVal);
    };

    this.login = function(un, pass){
        this.username.sendKeys(un);
        this.password.sendKeys(pass);
        element(by.tagName('button')).click();
    };
};

module.exports = login_page;

require ('../page/users_page.js');

var users_page = function(){

    this.addUserButton = element(by.css('[role="button"]'));
    this.firstName = element(by.model('firstname'));
    this.lastName = element(by.model('lastname'));
    this.userName = element(by.model('username'));
    this.password = element(by.model('password'));
    this.confirmPassword = element(by.model('confirmpassword'));
    this.confirm = element(by.css('[class="btn btn-success marginRight10px floatLeft"]'));
    this.back = element(by.css('[class="btn floatLeft"]'));

    this.addUser = function(fn, ln, un, pw, cpw){
        this.firstname.sendKeys(fn);
        this.lastword.sendKeys(ln);
        this.username.sendKeys(un);
        this.password.sendKeys(pw);
        this.confirmpassword.sendKeys(cpw);
    };

    this.userRole = function(index){
        element(by.model('tes.userRole')).$('[value="'+index+'"]').click();
    };

    return require('./users_page.js');

};
module.exports = new users_page();

注意每一页的最后一行:

工作文档在 'module.exports'

后没有 'new' 语句或括号

由于 Phil 的评论注意到了 'new' 部分,但直到现在才意识到括号,所以归功于 Phil!