SpookyJS:Console.log无法在内部工作

时间:2013-11-13 16:09:07

标签: javascript node.js phantomjs casperjs spookyjs

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尝试时它就不起作用了。因此,在您想要的时候记录数据非常困难。

有解决方法吗?

2 个答案:

答案 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');
  });
});