【问题标题】:How to export this function in Node.js into another module如何在 Node.js 中将此函数导出到另一个模块
【发布时间】:2015-05-14 04:30:45
【问题描述】:

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

这是我的 page-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 文件中,我想调用 login 这个方法:

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');
});

当启动这个代码量角器时,没有在相应的字段中输入用户名和密码,我得到了这个控制台输出:

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

如何在另一个模块的登录页面功能中使用登录功能?

【问题讨论】:

    标签: javascript node.js angularjs protractor


    【解决方案1】:

    require( './login-page.js' ) 返回一个“类”函数。这意味着,要调用loginPage 模块的login 方法,您可以使用new。例如:

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

    【讨论】:

    • 或者这样导出:exports.LoginPage = new LoginPage();
    • 两种方法我都试过了,都返回和上面一样的错误!
    • 您的模块返回一个函数,但应该返回一个实例。您正在尝试访问函数上的方法,这是有问题的。
    【解决方案2】:

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

    【讨论】:

    • 你说得对,我已经删除了它,但这与我的错误无关,我想我的问题是我正在公开一个函数并在其中使用另一个函数?
    【解决方案3】:

    Protractor 有一个很棒的选项,叫做 onPrepare。你把它放在你的 config.js 文件中。您的 onPrepare 可以引用文件。

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

    您使用全局而不是“this”。

    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');
    });
    

    您可能还想命名您的用户名变量和用户名参数和密码不同的东西。 (固定在上面)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-24
      • 2014-12-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      相关资源
      最近更新 更多