【问题标题】:Is there a way to pass object to casper.js' evaluate()?有没有办法将对象传递给 casper.js 的评估()?
【发布时间】:2013-05-30 08:08:52
【问题描述】:

我看到了这个帖子,看起来没有办法将复杂对象传递给evaluate() https://groups.google.com/forum/#!topic/casperjs/x7I8LDFwFJ0

如果我写了一个对象并想在不同的evaluate() 之间共享,我该怎么做?

让我们说一些像这样的愚蠢对象,我想一次又一次地使用 getData 函数:

var testObj = (function() {
  var a = 1;

  function test1(b) {
    return (a+b);
  }

  return {
    getData : function(arg) {
      return (test1(3) + arg);
    }
  }
})();

是否有可能的解决方法?

更新 1:

我的意思是通过函数传递对象。如下所示,但不起作用(返回null):

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

casper.start('about:blank', function() {

    var TestObj = function() {
      var a = 1;

      function test1(b) {
        return (a+b);
      }

      return {
        getData : function(arg) {
          return (test1(3) + arg);
        }
      }
    }

    var testObj = new TestObj();

    this.echo(casper.evaluate(function(myObject ) {
        return myObject.getData(100);
    }, testObj));
});

casper.run(function() {
    this.exit();
});

【问题讨论】:

    标签: javascript node.js web-scraping phantomjs casperjs


    【解决方案1】:

    不幸的是,您不能将复杂的结构传递给 evaluate(),因为传递给 evaluate() 的任何 arg 都是 JSON.parse(JSON.stringify(arg))。

    但这并不意味着你不能传递另一种对象。

    有关如何传递 JSON 对象进行评估的示例。

    var casper = require('casper').create();
    
    casper.start('about:blank', function() {
        var JSONObject = { arg1: 'val1' , arg2: 'val2' };
        this.echo(casper.evaluate(function(myObject ) {
            return JSON.stringify(myObject);
        }, JSONObject));
    });
    
    casper.run(function() {
        this.exit();
    }); 
    

    有关如何传递基本对象进行评估的示例。

    var casper = require('casper').create();
    
    casper.start('about:blank', function() {
    
        obj = new Object();
        obj.param1  = "value1";
        obj.param2  = "value2";  
    
        this.echo(casper.evaluate(function(myObject ) {
            return JSON.stringify(myObject);
        }, obj));
    });
    
    casper.run(function() {
        this.exit();
    });
    

    有关如何传递带参数的函数以进行评估的示例。

    var casper = require('casper').create();
    
    casper.start('about:blank', function() {
        var arg1 = "value1";
        var arg2 = "value2";
        this.echo(casper.evaluate(myFunction, arg1, arg2));
    });
    
    casper.run(function() {
        this.exit();
    });
    
    function myFunction(arg1, arg2) {
        return arg1 + "-" + arg2;
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用 clientScripts 选项传递脚本,例如 jQuery — Can i use jQuery with CasperJS。您可能可以对自定义脚本执行相同的操作,并且可以很好地分离代码。

      var casper = require('casper').create({
          clientScripts: ["includes/jquery.min.js", "lib/my-custom-script.js"]
      });
      casper.start(function () {
          this.evaluate(function () {
              window.customFunction();
          });
      });
      

      lib/my-custom-scripts.js:

      window.customFunction = function () { /* do stuff */ };
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2021-04-13
        • 1970-01-01
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多