从evaluate方法调用时不显示消息

时间:2014-08-05 09:39:04

标签: javascript casperjs

我是casperjs的新手并且玩弄它,但我无法使其evaluate()功能正常工作。

这是我的例子

var casper = require('casper').create();

casper.echo('started...');

casper.start('http://www.google.de/');

casper.then(function() {
    this.echo(this.getTitle());
});

casper.then(function() {
    this.evaluate(function() {
        this.echo('test');
    });
});

casper.run();

我正在使用casperjs sample.js

执行它

started...Google之后,控制台输出中没有任何反应。不执行evaluate方法中给出的闭包函数。

我甚至无法通过--verbose的控制台获取更多信息。

我做错了什么?

1 个答案:

答案 0 :(得分:7)

casper.evaluate回调内部是页面上下文。它中的所有内容都直接在页面上执行,并且是沙箱。 this指的是此回调中的window对象。我怀疑谷歌添加了window.echo功能。所以你不会在控制台中看到任何东西。 this.echocasper.echo仅可在页面上下文之外使用。

要实际查看来自页面上下文的控制台消息,您需要注册remote.message事件:

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

并向控制台写点东西:

this.evaluate(function() {
    console.log('test');
});

如果您已注册page.error事件:

casper.on("page.error", function(pageErr){
    this.echo("page.err: " + JSON.stringify(pageErr));
});

你会看到,window.echo无法被调用,因为它是undefined。调用它会导致TypeError,它会停止执行evaluate()回调,然后null执行evaluate()后会给你{。}}。

有关evaluate的更多信息,请参阅我的回答here

注意:尝试在google上编写第一个脚本不是一个好主意,因为你会遇到多个问题。 Google嗅探用户代理,并根据它为您提供不同的网站。此外,还将考虑视口大小。我建议你从example.org开始,然后是stackoverflow.com,因为两者都表现得相当好。