获取“无法读取属性'[方法]'未定义”

问题描述:

这可能有一个简单的解决方案,但我只是没有看到它。我正在写一个量角器测试和设置页面对象文件获取“无法读取属性'[方法]'未定义”

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功能。我错过了什么或做错了什么?谢谢。

+1

作为一个编码约定,最好将构造函数声明为'function Newstate(...)' – OrangeDog

您使用的方式Object.create不正确。你的情况正确的符号是:

var newstate = function (url) { 
    browser.get(url); 
}; 

newstate.prototype = Object.create({ 
    dd: { select: function(state) { $('select option[value="'+state+'"]').click(); } } 
}); 

为什么selectdd对象上未定义的原因是,第二个参数Object.createproperty descriptor object,不仅仅是属性的对象喜欢你提供。

但是,在你的情况下,你根本不需要Object.create,因为newstate.prototype.dd = function() { /*...*/ }就足够了。

+0

我实际上有很多函数可以放入原型中。你会建议哪种方法最好? 'newstate.prototyp.dd = ...'或使用'Object.create()'方法? – Machtyn

+1

在这种情况下最好不要使用Object.create,因为它通常意味着设置继承,而不仅仅是原型。所以在这里没有任何好处。我只是使用'newstate.prototype = {构造函数:newstate,dd:function(){},另一个:function(){},...}'。 'constructor:newstate'用于确保'newstate'的实例具有指向原始构造函数的构造函数属性,但这可能并不重要。 – dfsq