SpookyJS 中的全局变量和外部函数
Posted
技术标签:
【中文标题】SpookyJS 中的全局变量和外部函数【英文标题】:Global Variable and External functions in SpookyJS 【发布时间】:2014-07-04 03:30:17 【问题描述】:我是 SpookyJS/CasperJS 的新手,我正在尝试弄清楚执行流程。
这就是我想要实现的目标:
加载页面
存储页面图像
将此图像传递给函数并执行它(此过程相当长:~15 秒)
等待函数返回结果
在加载页面中使用返回值填写表单中的一个字段
提交表格
这是一个代码 sn-p,它试图解释我想出的解决方案:
var globProcessedImage;
try
var Spooky = require('spooky');
catch (e)
var Spooky = require('../lib/spooky');
var spooky = new Spooky(
child:
transport: 'http'
,
casper:
logLevel: 'debug',
verbose: true
, function (err)
if (err)
e = new Error('Failed to initialize SpookyJS');
e.details = err;
throw e;
spooky.start('http://example.com/');
spooky.then(function()
this.captureSelector('./image.png', '#img-node');
);
spooky.waitFor(function()
this.emit('image.processed');
return globProcessedImage !== undefined;
, function then()
processedImage = globProcessedImage;
this.sendKeys('#imagePassword', processedImage);
);
spooky.then(function()
this.capture('./page.png');
);
spooky.run();
spooky.on('image.processed', function()
setTimeout(function()
globProcessedImage = 'my_result_string';
, 15000);
);
);
spooky.on('error', function (e, stack)
console.error(e);
if (stack)
console.log(stack);
);
spooky.on('log', function (log)
if (log.space === 'remote')
console.log(log.message.replace(/ \- .*/, ''));
);
当我运行应用程序时,我收到以下错误:
ReferenceError: Can't find variable: globProcessedImage
如何使 globProcessedImage
在 SpookyJS 中可见?这是在 Web 自动化期间处理外部功能的正确方法吗?
提前致谢。
【问题讨论】:
这非常类似于您之前的问题,好的 spookyjs 与 casperjs...顺便说一句,为什么这个问题被标记为 casperJS?我会删除它 是的,对不起。我需要先了解 CasperJS 中的全局变量以及 SpookyJs 中的差异。我只是想避免混淆。 【参考方案1】:编辑: 在撰写本文时,SpookyJS 不支持将对象按值传递到 waitFor
回调的附加语法。所以这段代码不起作用。
与 casperjs 相比,spookyjs 具有三种可能的上下文:spooky 上下文、casper 上下文和页面上下文。
您尝试的是从 casper 上下文访问在幽灵上下文中定义的变量。您可以如本期所述在上下文之间传递变量:How to make global variables available to functions inside casper?
所以根据你的代码调整它,你应该有:
var globProcessedImage;
try
var Spooky = require('spooky');
catch (e)
var Spooky = require('../lib/spooky');
var spooky = new Spooky(
child:
transport: 'http'
,
casper:
logLevel: 'debug',
verbose: true
, function (err)
if (err)
e = new Error('Failed to initialize SpookyJS');
e.details = err;
throw e;
spooky.start('http://example.com/');
spooky.then(function()
this.captureSelector('./image.png', '#img-node');
// start longRunning here
);
spooky.waitFor([spookyGlobProcessedImage: globProcessedImage, function()
return spookyGlobProcessedImage !== undefined;
], [spookyGlobProcessedImage: globProcessedImage, function then()
this.emit('image.processed', spookyGlobProcessedImage);
processedImage = spookyGlobProcessedImage;
this.sendKeys('#imagePassword', processedImage);
]);
spooky.then(function()
this.capture('./page.png');
);
spooky.run();
spooky.on('image.processed', function(spookyGlobProcessedImage)
this.echo("spookyGlobProcessedImage is " + spookyGlobProcessedImage);
);
);
spooky.on('error', function (e, stack)
console.error(e);
if (stack)
console.log(stack);
);
spooky.on('log', function (log)
if (log.space === 'remote')
console.log(log.message.replace(/ \- .*/, ''));
);
我不确定spooky.waitFor
是否支持这种语法。
【讨论】:
看起来spooky.waitFor
仍然找不到spookyGlobProcessedImage
: ReferenceError: Can't find variable: spookyGlobProcessedImage
@lerio 然后我猜 waitFor 不像spooky.then
那样工作。您可以在描述您的功能请求/错误的 github 项目中打开一个问题。以上是关于SpookyJS 中的全局变量和外部函数的主要内容,如果未能解决你的问题,请参考以下文章