代码之家  ›  专栏  ›  技术社区  ›  JSB

如何从casper内部调用外部函数。start或casper.then打开

  •  1
  • JSB  · 技术社区  · 11 年前

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

    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;
    

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

    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 回复  |  直到 9 年前
        1
  •  2
  •   Artjom B.    11 年前

    CasperJS的执行是异步的。 start() 以及所有 then*() wait*() 函数是异步步骤函数。这意味着你只在这样一个步骤里面的页面上。

    当你看着你的 getPageTitle() 以及它的调用方式,您应该注意到您没有将step函数传递到 casper.start() ,但你马上打电话 获取页面标题() 此时,执行甚至还没有开始,因为计划的步骤一开始执行 run() 被调用。通过调用 获取页面标题() ,您正在尝试访问关于的标题:空白 空白的 .

    第一版:

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

    现在您将一个step函数传递到 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());
    }
    

    并这样称呼它:

    casper.start("http://www.google.com/", casperFunctions.getPageTitle);
    
        2
  •  1
  •   Jaromanda X    11 年前
    casper.start("http://www.google.com/", casperFunctions.getPageTitle(casper));
    

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

    我想你应该可以这样做

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