获取“无法读取属性'[方法]'未定义”
这可能有一个简单的解决方案,但我只是没有看到它。我正在写一个量角器测试和设置页面对象文件获取“无法读取属性'[方法]'未定义”
newstate.js(页面目标文件)
'use strict';
var newstate = function (url) {
browser.get(url);
};
newstate.prototype = Object.create({}, {
dd: { select: function(state) { $('select option[value="'+state+'"]').click(); } }
});
module.exports = newstate;
的spec.js文件:
'use strict';
var newstate = require('newstate.js');
describe('Testing newstate', function() {
var statePage;
beforeAll(function() {
statePage = new newstate('http://localhost:8080');
});
it('should select a state', function() {
statePage.dd.select('AK');
})
})
的conf.js文件:
exports.config = {
framework: 'jasmine',
specs: ['test-spec.js'],
useAllAngular2AppRoots: true,
jasmineNodeOpts: {
showColors: true
}
};
当我运行量角器,我得到:
$ protractor conf.js
Failures:
1) Testing newstate should select a state
Message:
Failed: Cannot read property 'select' of undefined
它启动浏览器,打开网页,就像它应该当我打电话给new newstate('...')
但由于某种原因,它不想看到我的dd.select功能。我错过了什么或做错了什么?谢谢。
您使用的方式Object.create不正确。你的情况正确的符号是:
var newstate = function (url) {
browser.get(url);
};
newstate.prototype = Object.create({
dd: { select: function(state) { $('select option[value="'+state+'"]').click(); } }
});
为什么select
是dd
对象上未定义的原因是,第二个参数Object.create
是property descriptor object,不仅仅是属性的对象喜欢你提供。
但是,在你的情况下,你根本不需要Object.create,因为newstate.prototype.dd = function() { /*...*/ }
就足够了。
我实际上有很多函数可以放入原型中。你会建议哪种方法最好? 'newstate.prototyp.dd = ...'或使用'Object.create()'方法? – Machtyn
在这种情况下最好不要使用Object.create,因为它通常意味着设置继承,而不仅仅是原型。所以在这里没有任何好处。我只是使用'newstate.prototype = {构造函数:newstate,dd:function(){},另一个:function(){},...}'。 'constructor:newstate'用于确保'newstate'的实例具有指向原始构造函数的构造函数属性,但这可能并不重要。 – dfsq
作为一个编码约定,最好将构造函数声明为'function Newstate(...)' – OrangeDog