4

我看到了这个线程,看起来没有办法将复杂对象传递给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();
});
4

2 回答 2

14

不幸的是,您不能将复杂的结构传递给 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;
}
于 2013-05-30T14:57:04.690 回答
2

您可以使用 clientScripts 选项来传递脚本,例如 jQuery —我可以将 jQuery 与 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 */ };

希望这可以帮助。

于 2014-05-20T12:17:54.837 回答