Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在噩梦EJS求值函数中调用方法?_Javascript_Node.js_Nightmare - Fatal编程技术网

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边界传递方法,至少在你写的方式上。这样做需要对函数进行字符串化并在客户机上重建它,如果不小心,可能会导致奇怪的副作用。