CasperJS:如何传递参数并在循环中使用它们

时间:2017-01-30 18:49:26

标签: loops phantomjs casperjs

我正在编写一个脚本,我需要传递一些参数,我传递参数的方式是这样的:

xvfb-run casperjs --ignore-ssl-errors=true --ssl-protocol=any casper/server.js --checks='["215","216"]'

在server.js中我将它分配给变量:

var checks = casper.cli.get('checks');

然后在下面的代码中我使用循环中的代码:

casper.each(checks, function(check) {
 $('*[data-queue="'+ check+'"] input:checkbox').prop('checked', false);
});

我的问题是,虽然我 console.log(检查)确认正在接收参数,但脚本一直在抱怨:

[error] [phantom] each() only works with arrays

不仅如此,如果我手动对数组进行硬编码,那么循环也无法正常工作。

1 个答案:

答案 0 :(得分:1)

casper.each回调需要两个参数,第一个是Casper模块本身,第二个是迭代变量。

casper.each(checks, function(self, check) {
    // ...
});

如果你想操纵HTML页面,那么必须在page.evaluate内的页面上下文中完成:

casper.each(checks, function(self, check) {
    self.evaluate(function(check){
        $('*[data-queue="'+ check+'"] input:checkbox').prop('checked', false);
    }, check);
});

<小时/> 的更新

抱歉,没有注意到--checks='["215","216"]'的CLI参数 当然它不是一个阵列:

console.log( checks );
console.log( typeof(checks) );

(注意引号'')

  

'[215216]'
  串

但如果您这样使用它:--checks=["215","216"] 并在脚本中:

console.log( typeof(eval(checks)) );
console.log( eval(checks)[1] );
  

对象
  216

(cource eval是邪恶的,所以最好更改传入ID的格式)

casperjs casper/server.js --checks=215,216,15942,5435

console.log( typeof(checks.split(",")) );
console.log( JSON.stringify(checks.split(",")) );
  

对象
  [ “215”, “216”, “15942”, “5435”]