如何在casperjs的evaluate函数中输出log


casperjs的evaluate函数中使用casper.log就无法输出,代码如下


 var casper = require('casper').create({
    'verbose': true,
    'logLevel': 'debug'
});

casper.start('http://www.baidu.com/', function() {
    this.evaluate(function() {
        this.log('asd', 'error'); // 这一条无法输出
    });
});

大概的原因我也知道,应该是evaluate中的东西相当于在一个sandbox中执行,要与外界交互是只能通过特定的接口的

但这样造成我写程序的不便,因为在evaluate函数中就可能发生一些不可预期的情况,而我想把它log下来

我目前有两种解决方案

  1. evaluate函数返回时添加一个errorCode,从而判断发生了什么错误或者warning
  2. evaluate中使用console.log,并在外面监听remote.message,但这样等于多了一个日志流出来,也是十分不便

第二种解决方法的代码


 casper.start('http://www.baidu.com/', function() {
    this.evaluate(function() {
        console.log('asd');
    });
}); 

casper.on('remote.message', function(msg) {
    this.log(msg, 'info');
});

所以有什么 更好的解决方案 吗?

casperjs JavaScript

凡人ノ智慧 10 years, 3 months ago

大概看了下 casper 的文件, evaluation 应该是在你打开的页面上执行函数,所以里面的代码貌似应该像是在写页面代码那样吧。

我看示例是写的代码用于登录,所以尝试了一下这段


 var casper = require('casper').create({
    'verbose': true,
    'logLevel': 'debug'
});

casper.start('http://www.baidu.com/', function() {
    this.log("start http://www.baidu.com")
    this.evaluate(function() {
        alert("hello world")
    });
});

casper.run();

输出的内容中有一句:


 [info] [remote] [alert] hello world

在页面上调用 casper 的东西不太可能, this.log 应该等同于 window.log ,是个不存在的函数,理论上来说 console.log 应该可以执行,但是没有反馈,也不晓得执行没得。

kinov answered 10 years, 3 months ago

Your Answer