'TypeError:undefined不是函数'使用Protractor

'TypeError: undefined is not a function' using Protractor

本文关键字:函数 Protractor 使用 undefined TypeError      更新时间:2024-03-27

我知道这个错误代码有很多主题。然而,我正在努力寻找任何有帮助的解决方案(或者我只是愚蠢)。

我正在为一个网页构建一个Protractor测试,我原来的JavaScript运行得很好。但我想将其全部转换为使用页面对象,使其更易于编辑和理解,并避免代码重复。

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

我将页面对象链接到的主测试文档和从中链接的主测试文件分别包含起作用和不起作用的代码实例。

  • 第一个有效的实例是第12行。

  • 第二个没有的实例在第23行。

    如下所示:

      var util = require('util')
      describe ('This is to test the functionality of the Admin page.', function()
      {
          beforeEach(function(){
              browser.ignoreSynchronization = true;
              browser.get('https://website');
          });
          it ('Should log in and move to the Users page.', function() {
              var login_page = require('../page/login_page.js');
              var loginPage = new login_page;
              loginPage.login('user', 'pass');
              beforeEach(function () {
                  expect(browser.getCurrentUrl()).toEqual('https://website');
              });
              describe('This should hold all the tests while logged in to Admin site', function () {
                  it('Should create first new User.', function() {
                      var users_page = require('../page/users_page.js');
                      var usersPage = new login_page;
                      usersPage.addUserButton().click();
                      usersPage.addUser('Test', 'Smith', 'Test100@testing.co.nz', 'Password', 'Password', '0')
                      usersPage.userRole[0];
                      usersPage.confirm().click();
                      usersPage.back().click();
                  });
                   it('Should logout', function () {
                      element(by.cssContainingText('span', 'Logout')).element(by.linkText('Logout')).click();
                  });
              });
          });
      });
    

在cmd中运行Protractor测试时,我得到的错误是:

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

除此之外,您可能还想实例化一个新的"用户页面"对象。替换:

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"语句或括号

由于菲尔的评论,注意到了"新"部分,但直到现在才意识到括号,所以这要归功于菲尔!