2
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无法访问 self 变量。在 PhantomJS 中你可以做到,page.evaluate(function (self) {但是当我用 Spooky 尝试它时,它不起作用。所以当你想记录数据时是非常困难的。

有没有解决的办法?

4

2 回答 2

3

自发布此问题以来,我已经找到了导致我这个问题的原因,所以我将在下面分享答案,以防其他人遇到类似问题:

在SpookyJS Github 页面上的标准快速入门示例中,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 进行处理的调用中运行,所以这就是我没有看到它们显示的原因。设置此事件侦听器后,我的输出以及__utils__.echoxShirase 答案中函数调用使用的输出都会出现。

此外,Casper 提供了一个echo函数,可用于在 Casper 的评估函数之外发送输出,默认情况下,该函数只能访问正在查看的页面范围:

spooky.then(function () {
  this.echo("foo");
});

由于标准配置将 Casper 的日志记录级别设置为debug并设置了详细日志记录,因此一旦设置了此事件侦听器,就会显示很多信息。这可以通过将日志级别设置为或Casper 支持的error其他日志级别来避免。

于 2013-11-21T18:30:18.980 回答
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');
  });
});
于 2013-11-13T16:24:41.050 回答