如何从casper.start或casper.thenOpen中调用外部函数

时间:2015-07-22 14:17:34

标签: javascript casperjs function-call

我正在尝试拆分以下代码,以便将回调函数存储在自己的文件中。

var casper = require('casper').create();
casper.start("http://www.google.com/", function() {
    this.echo(this.getTitle());
});
casper.run(); // "Returns Google"

this example之后,我在一个名为" getPageTitle.js";

的单独文件中定义一个函数
function getPageTitle(casper) {
    casper.echo(casper.getTitle());
}
exports.getPageTitle = getPageTitle;

并在另一个名为" main.js"的文件中调用该函数。通过将CasperJS对象直接传递给函数;

var casper = require('casper').create();
var casperFunctions = require('./getPageTitle.js');
casper.start("http://www.google.com/", casperFunctions.getPageTitle(casper));
# Error: CasperError: Casper is not started, can't execute `getTitle()`                  

此外,如果我用thenOpen()电话替换上面的最后一行;

casper.start();
casper.thenOpen("http://www.google.com/", casperFunctions.getPageTitle(casper));

上面的代码不会抛出错误; CasperJS能够导航到网站,但页面标题" Google"不归还。

有人可以说明为什么这不符合我的预期。这似乎是模块化CasperJS在页面加载时会调用的函数的一种自然方式,但我在这里错过了什么?

2 个答案:

答案 0 :(得分:2)

CasperJS的执行是异步的。 start()以及所有then*()wait*()函数都是异步步骤函数。这意味着您只能在诸如步骤之类的页面内。

当您查看getPageTitle()以及如何调用它时,您应该注意到您未将步骤函数传递到casper.start(),而是您立即调用{ {1}}。那时,执行甚至还没有开始,因为一旦调用getPageTitle(),计划的步骤就开始执行。通过致电run(),您正在尝试访问标题为:空白空白

第一个版本:

getPageTitle()

现在您将步骤函数传递给function getPageTitle(casper) { return function(){ casper.echo(casper.getTitle()); }; } ,这将被异步评估。

第二版:

请注意,您可以在步骤函数中使用start()来引用this。这是一种更好的方法,因为您不需要明确传递引用:

casper

并将其称为:

function getPageTitle() {
    return function(){
        this.echo(this.getTitle());
    };
}

第三版:

如果您的功能不需要任何参数,那么您不需要包装函数。你可以直接传递它:

casper.start("http://www.google.com/", casperFunctions.getPageTitle());

并将其称为:

function getPageTitle() {
    this.echo(this.getTitle());
}

答案 1 :(得分:0)

casper.start("http://www.google.com/", casperFunctions.getPageTitle(casper));

不起作用,因为您将调用casperFunctions.getPageTitle(casper)的结果作为回调参数传递给casper.start

我认为你应该能够做到这一点

casper.start("http://www.google.com/", casperFunctions.getPageTitle.bind(casper));