try {
var Spooky = require("spooky");
} catch (e) {
console.log(e);
}
var spooky = new Spooky({
capser: {
logLevel: "debug",
verbose: true
},
child: {
command: "./casperjs/bin/casperjs",
port: 8081,
spooky_lib: "./node_modules/spooky/"
}
}, function (err) {
if(err) {
console.log(err);
}
spooky.start("http://www.google.com");
spooky.then(function () {
console.log("7331");
this.emit("printmsg", "1337");
});
spooky.run();
});
spooky.on("printmsg", function (msg) {
console.log(msg);
});
spooky.on("error", function (e) {
console.error(e);
});
运行时,会显示1337
,但不会显示7331
。为什么是这样?我问的原因是因为当你想记录某些变量的值时,它很难调试。
另外,如果你想改变then函数,那么:
spooky.then(function () {
var self = this;
this.evaluate(function () {
self.emit("printmsg", "Hello World!");
});
});
这不起作用,因为evaluate
无法访问自变量。在PhantomJS中你可以使它成为page.evaluate(function (self) {
但是当我用Spooky尝试时它就不起作用了。因此,在您想要的时候记录数据非常困难。
有解决方法吗?
答案 0 :(得分:3)
自从发布此问题以来,我发现了导致我这个问题的原因,所以我将在下面分享答案,以防其他人遇到类似的问题:
在the SpookyJS Github page上的标准快速入门示例中,Spooky中有一个已注释掉的“控制台”事件监听器,当取消注释时,将导致Casper的所有输出显示在屏幕上:
// Uncomment this block to see all of the things Casper has to say.
// There are a lot.
// He has opinions.
spooky.on('console', function (line) {
console.log(line);
});
设置此事件侦听器后,它会将Casper的所有输出记录到屏幕上。我试图在我的问题中登录到控制台的例子都是在Spooky传递给Casper进行处理的调用中运行的,所以这就是我没有看到它们显示的原因。设置此事件侦听器后,将显示输出,以及xShirase答案中__utils__.echo
函数调用所使用的输出。
此外,Casper提供echo
函数,可用于在Casper的evaluate函数之外发送输出,默认情况下,该函数只能访问正在查看的页面的范围:
spooky.then(function () {
this.echo("foo");
});
由于标准配置将Casper的日志记录级别设置为debug
并设置了详细日志记录,因此一旦设置了此事件侦听器,就会显示许多信息。通过将日志记录级别设置为error
或其他logging level supported by Casper,可以避免这种情况。
答案 1 :(得分:1)
哦,我是如何与那个人合作的! 起初,我基本上在做:
var msg = this.evaluate(function () {
return('1337');
});
console.log(msg);
然后我发现Casper为每个页面注入了一个非常有用的clientutils模块:http://docs.casperjs.org/en/latest/modules/clientutils.html
它使您能够从远程DOM发送日志,如下所示:
casper.then(function () {
this.evaluate(function () {
__utils__.echo('1337');
});
});