2014-02-27 43 views
1

我正在使用量角器来测试Angular JS应用程序。 我想使用页面对象模式,因此我需要将一个函数导出到另一个模块中。如何在Node.js中将此函数导出到另一个模块中

这是我的页面login.js文件:

require("./login.spec.js"); 
var LoginPage = function() 
{ 
    this.userName = element(by.id('login_form_user_input')); 
    this.password = element(by.id('login_form_password_input')) ; 
    this.loginButton = element(by.id('login_form_signin_button')); 
    this.loginText = element(by.css('#mainGlobalSearchBtn')); 
    this.loginError = element(by.xpath('html/body/div[1]/div[1]/div[1]/form/div/p')); 
    this.login = function (userName, password) 
     { 
     LoginPage.userName.sendKeys(userName); 
     LoginPage.password.sendKeys(password); 
     LoginPage.loginButton.click(); 
     browser.waitForAngular(); 
     }; 
}; 

exports.LoginPage = LoginPage; 

现在叫同一个文件夹下login.spec.js另一个js文件,我想打电话给登录这个方法:

var util = require ('util'); 
require("./myconfig.js"); 
describe('Login', function() { 
var loginPage = require("./login-page.js"); 
var ptor; 

beforeEach (function() 
{ 
    ptor = protractor.getInstance(); 
    ptor.get(settings.winURL); 
    waits(2000); 
    //Delete cookies to avoid saving password or username 
}); 
it('should not login : incorrect login details', function() 
{ 
    loginPage.login('incorrectusername','incorrectpassword'); 
    expect(loginPage.loginError.getText()).toContain('Access denied'); 
}); 

当启动该代码量角器不输入用户名和相应的字段passwoed,我得到这个控制台输出中:

1) Login should not login : incorrect login details 
    Message: 
    TypeError: Object #<Object> has no method 'login' 
    Stacktrace: 
    TypeError: Object #<Object> has no method 'login' 
    at null.<anonymous> (C:\******\login.spec.js:34:20) 

这里是第34行是引发错误:

loginPage.login('incorrectusername','incorrectpassword'); 

如何使用登录functioninside登录页面功能在其他模块?

回答

0

require('./login-page.js')返回“类”功能。这意味着,要拨打login方法的loginPage模块,您可以使用new。例:

it('should not login : incorrect login details', function() 
{ 
    var page = new loginPage(); 
    page.login('incorrectusername','incorrectpassword'); 
    expect(page.loginError.getText()).toContain('Access denied'); 
}); 
+0

或者以这种方式导出:exports.LoginPage = new LoginPage(); –

+0

我已经尝试了两种方法,并且都返回了与上面相同的错误! – Ziwdigforbugs

+0

你的模块返回一个函数,但应该返回一个实例。你正试图访问一个函数的方法,这就是问题所在。 –

0

删除的开始你的模块的require("./login.spec.js");。测试在模块创建之前运行。

+0

你是正确的我已经删除它,但这与我的错误无关,我想我的箴言是我暴露了一个函数并使用其中的另一个函数? – Ziwdigforbugs

+0

我不相信会导致错误。 –

0

量角器有这个令人敬畏的选项,称为onPrepare。你把它放在你的config.js文件中。你的onPrepare可以引用一个文件。

在这个文件中,你可以拥有你需要的所有变量和函数!

而不是“这个”你使用全局。

global.userName = element(by.id('login_form_user_input')); 
global.password = element(by.id('login_form_password_input')) ; 
global.loginButton = element(by.id('login_form_signin_button')); 
global.loginText = element(by.css('#mainGlobalSearchBtn')); 
global.loginError = element(by.xpath('html/body/div[1]/div[1]/div[1]/form/div/p')); 
global.login = function (user, pw) 
    { 
    userName.sendKeys(user); 
    password.sendKeys(pw); 
    loginButton.click(); 
    browser.waitForAngular(); 
    }; 

然后在你的配置你这样做:

//other config settings, 
onPrepare: myvariables.js 

在你的天赋,你不需要任何要求!

只需拨打你所需要的(减去全局)

beforeEach (function() { 
ptor = protractor.getInstance(); 
ptor.get(settings.winURL); 
waits(2000); 
//Delete cookies to avoid saving password or username 
}); 
it('should not login : incorrect login details', function() 
{ 
    login('incorrectusername','incorrectpassword'); 
expect(loginError.getText()).toContain('Access denied'); 
}); 

您可能还需要命名您的用户名变量和用户名称ARG和密码不同的东西。 (固定在上面)

相关问题