'TypeError:undefined不是函数'使用Protractor
'TypeError: undefined is not a function' using Protractor
我知道这个错误代码有很多主题。然而,我正在努力寻找任何有帮助的解决方案(或者我只是愚蠢)。
我正在为一个网页构建一个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();
confirm
和back
页面对象字段也是如此。
此外,代替:
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"语句或括号
由于菲尔的评论,注意到了"新"部分,但直到现在才意识到括号,所以这要归功于菲尔!
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- TypeError:元素(..).then不是Protractor 3.2.1中的函数
- '对象不是函数'尝试将页面对象与Protractor一起使用时出错
- 'TypeError:undefined不是函数'使用Protractor
- Protractor函数帮助程序生成相同的东西
- AngluarJS Protractor测试:函数应该返回一个promise
- 如何从一个js文件导出2个不同的函数到另一个js文件在Protractor
- 如何使用Protractor测试的getSize()函数比较元素的宽度和高度
- 是否存在将日志调用添加到Protractor中的控制流的日志函数
- 在Protractor中,是否可以运行Angular模块函数?
- 如何从Protractor脚本中调用AutoIt函数
- 如何在Angularjs Protractor中使用全局函数
- 如何在protractor .each()函数上使用页面对象变量