【问题标题】:console.log doesn't work in CasperJS' evaluate with setTimeoutconsole.log 在 CasperJS 中无法使用 setTimeout 进行评估
【发布时间】:2012-08-08 12:18:11
【问题描述】:

为什么当我在evaluate 中使用console.log 时,它可以工作:

casper.then(function() {
  this.evaluate( function() {
    console.log('hello'); 
  });
});

但这不起作用:

casper.then(function() {
  this.evaluate( function() {
    setTimeout( function() {console.log('hello');}, 1000);
  });
});

【问题讨论】:

标签: javascript casperjs


【解决方案1】:

因为您将 casperjs 和远程页面环境混为一谈。 evaluate 函数将在远程页面 env 中执行代码,因此 console.log 调用不会输出任何内容。

如果您想捕捉远程 console.log 呼叫,请收听remote.message 事件:

casper.on('remote.message', function(msg) {
    this.echo('remote message caught: ' + msg);
})

顺便说一句,documentation for events 非常详尽,the one for evaluate 也是如此。

【讨论】:

  • setTimeout 是 OP 示例之间的区别。 setTimeout 如何改变这一点?它们都在远程环境中执行。
  • @nikkwong 由于 OP 没有具体说明 "it works" 和 "doesn't work" 的含义,我们只能猜测。我认为他们没有注意到他们正在脱离 CasperJS 的控制流,因此忘记也在 casper 控制流中等待。他们可能退出得太早了。尽管有 OP 的活动,但我怀疑我们能否查明真相。
  • 仅供参考 - 链接已损坏
【解决方案2】:

@NiKo 的回答很关键。

我还建议添加以下内容,因为如果出现错误,您甚至可能无法打印出 console.log() 消息,而是以静默告终。

casper.on( 'page.error', function (msg, trace) {
    this.echo( 'Error: ' + msg, 'ERROR' );
});

【讨论】:

    【解决方案3】:

    CasperJS 包含ClientUtils,可以从远程页面使用,轻松登录到casper脚本的控制台:

    __utils__.echo('This message is logged from the remote page to the CasperJS console');
    

    【讨论】:

      【解决方案4】:

      基于@odigity 的回答,这使得 casperjs 死于更熟悉的错误/堆栈跟踪:

      var util = require('util');
      
      casper.on('page.error', function exitWithError(msg, stack) {
          stack = stack.reduce(function (accum, frame) {
              return accum + util.format('\tat %s (%s:%d)\n',
                  frame.function || '<anonymous>',
                  frame.file,
                  frame.line
              );
          }, '');
          this.die(['Client-side error', msg, stack].join('\n'), 1);
      });
      

      【讨论】:

      • 太棒了!我今天也正在寻找类似的东西。实用模块不应该是utils吗?
      • @Qcom,我认为utils 会很好,因为它是sprintf equivalent。在我使用它的地方,我们已经有 util 可用,所以我只是使用它:)
      • 有趣的是,您是通过 SpookyJS 还是等价物将 casper 与 node 结合使用?据我所知,casper 默认情况下不与节点模块生态系统集成。
      • 我们只是单独使用 casperjs。如果您查看他们的patchedRequire,您会发现它会尝试从 node_modules 加载。
      • 啊,我明白了。感谢您的链接!很高兴知道。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多