Javascript 如何在噩梦EJS求值函数中调用方法?
我试图组织我的代码以使用页面对象模式,所以我基本上创建了一个模块,其中包含一种方法,可以封装页面交互 我试图扭转这一局面:Javascript 如何在噩梦EJS求值函数中调用方法?,javascript,node.js,nightmare,Javascript,Node.js,Nightmare,我试图组织我的代码以使用页面对象模式,所以我基本上创建了一个模块,其中包含一种方法,可以封装页面交互 我试图扭转这一局面: it('my test step', (done) => { nightmare .wait() .evaluate(() => { return { myname: document.querySelector('docume
it('my test step', (done) => {
nightmare
.wait()
.evaluate(() => {
return {
myname: document.querySelector('document-myname').innerHTML};
})
.then(({myname}) => {
expect(myname).toEqual(`Jorge`);
})
.then(done, done.fail);
});
为此:
var page = require('../util/ui/mypage');
it('my test step', (done) => {
nightmare
.wait()
.evaluate(() => {
return {
myname: page.getMyName()};
})
.then(({myname}) => {
expect(myname).toEqual(`Jorge`);
})
.then(done, done.fail);
});
mypage.js
function getMyName() {
return myname: document.querySelector('document-myname').innerHTML;
}
module.exports = {
getName: getName,
};
结果是我得到了
- Failed: page is not defined
您应该将
page
变量作为evaluate方法回调中的第二个参数传递,如中所述。这是因为evaluate方法的回调具有独立的作用域,因此node.js变量不能直接使用:
var page = require('../util/ui/mypage');
it('my test step', (done) => {
nightmare
.wait()
.evaluate((page) => {
return {
myname: page.getMyName()};
}, page)
.then(({myname}) => {
expect(myname).toEqual(`Jorge`);
})
.then(done, done.fail);
});
您应该将
page
变量作为evaluate方法回调中的第二个参数传递,如中所述。这是因为evaluate方法的回调具有独立的作用域,因此node.js变量不能直接使用:
var page = require('../util/ui/mypage');
it('my test step', (done) => {
nightmare
.wait()
.evaluate((page) => {
return {
myname: page.getMyName()};
}, page)
.then(({myname}) => {
expect(myname).toEqual(`Jorge`);
})
.then(done, done.fail);
});
变量页是否在您的全局范围内?是的,我使用了“严格使用”;在文件上方是全局范围内的变量页吗?是的,我使用了“严格使用”;最重要的是,它确实有效,但现在我得到了“-预期未定义为等于‘Jorge’”。不知何故,它没有返回预期值“page”返回为未定义。我看到您的模块有
getMyName
,您正在导出getName
。另外,最好将getMyName
作为回调传递,而不是从内部调用它。值得注意的是:您不能跨IPC边界传递方法,至少在你写的方式上。这样做需要对函数进行字符串化并在客户端进行重构,如果不小心,可能会导致奇怪的副作用。它确实有效,但现在我得到了“-预期未定义为等于‘Jorge’”。不知何故,它没有返回预期值“page”返回为未定义。我看到您的模块有getMyName
,您正在导出getName
。另外,最好将getMyName
作为回调传递,而不是从内部调用它。值得注意的是:您不能跨IPC边界传递方法,至少在你写的方式上。这样做需要对函数进行字符串化并在客户机上重建它,如果不小心,可能会导致奇怪的副作用。