首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从casper.start或casper.thenOpen内部调用外部函数

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

Stack Overflow用户
提问于 2015-07-22 14:17:34
回答 2查看 1.3K关注 0票数 1

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

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

this example之后,我在一个名为“getPageTitle.js”的单独文件中定义一个函数;

代码语言:javascript
复制
function getPageTitle(casper) {
    casper.echo(casper.getTitle());
}
exports.getPageTitle = getPageTitle;

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

代码语言:javascript
复制
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()调用替换上面的最后一行;

代码语言:javascript
复制
casper.start();
casper.thenOpen("http://www.google.com/", casperFunctions.getPageTitle(casper));

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

有人能不能解释一下为什么这不像我所期望的那样。这似乎是一种模块化函数的自然方式,一旦页面加载,CasperJS就会调用这些函数,但这里是不是遗漏了什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-22 14:26:21

CasperJS的执行是异步的。start()和所有then*()wait*()函数都是异步步骤函数。这意味着您只在步骤的页面中。

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

第一版:

代码语言:javascript
复制
function getPageTitle(casper) {
    return function(){
        casper.echo(casper.getTitle());
    };
}

现在,您要将一个step函数传递到start()中,该函数将被异步计算。

第二版:

请记住,可以在step函数中使用this来引用casper。这是一个更好的方法,因为您不需要显式传递引用:

代码语言:javascript
复制
function getPageTitle() {
    return function(){
        this.echo(this.getTitle());
    };
}

就这样叫它:

代码语言:javascript
复制
casper.start("http://www.google.com/", casperFunctions.getPageTitle());

第三版:

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

代码语言:javascript
复制
function getPageTitle() {
    this.echo(this.getTitle());
}

就这样叫它:

代码语言:javascript
复制
casper.start("http://www.google.com/", casperFunctions.getPageTitle);
票数 2
EN

Stack Overflow用户

发布于 2015-07-22 14:25:01

代码语言:javascript
复制
casper.start("http://www.google.com/", casperFunctions.getPageTitle(casper));

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

我想你应该可以代替

代码语言:javascript
复制
casper.start("http://www.google.com/", casperFunctions.getPageTitle.bind(casper));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31565769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档