phantomjs/casperjs动态传入参数

我们常用phantomjs/casperjs脚本来做一些事情。有时候希望从外部动态传入参数来进行操作。如何实现呢?介绍三种办法:

1.通过phantomjs.args获取参数

即在脚本中直接调用phantom.args,即可获取到命令行参数数组。注意,它默认会带三个内部参数在数组前面。第一个casperjs的安装路径,第二个casperjs的参数–cli,第三个是当前脚本名称(含路径)。之后才是执行脚本的参数。所以如果你只要获取命令行参数。需要调用phantom.args.slice(3)截取。

2.通过casper.cli.args获取参取

有没有办法不用这么废劲呢。有。直接调用casper.cli.args方法即可。

下面是以上两种方式的示例:

  1. //1.use the phantom's args
  2. var args = phantom.args;
  3. console.log('phantom.args:',args);
  4. console.log('phantomjs.args.slice(3):',args.slice(3));
  5. //2.use the args of the casper.cli
  6. var casper = require('casper').create();
  7. var args2 = casper.cli.args;
  8. console.log("casper.cli.args:",args2);
  9. phantom.exit(0);

假设以上代码保存在testArgs.js文件中。我们执行casperjs testArgs.js param1 param2,输出如下结果:

phantom.args: –casper-path=/xxpath/yypath/casperjs,–cli,testArgs.js,param1,param2

phantomjs.args.slice(3): param1,param2

casper.cli.args: param1,param2

3.通过文件读取参数

还有一种不通过命令行的方式读取参数。这个就不细说了。大致思路就是你把你要读取的参数放到一个文件中。然后脚本中调用require(‘fs’)读取文件,然后解析参数。

可能你觉得这样费事,但有时候还真得通过这种方式,比如,你的参数中含有命令行中不能正常解析的特殊字符,又比如你的参数内容非常大等等。

本条目发布于 2014 年 5 月 14 日。属于 casperjsjavascript分类,被贴了   标签。

Casperjs中fill提交表单遇到的问题

Casperjs中fill的作用是填充表单值,并可以提交(可选),API:http://docs.casperjs.org/en/latest/modules/casper.html#fill,这里不详述它的用法。

今天遇到一个问题,在此记录一下。问题是这样的:我一个可以正常提交form的casperjs脚本,在windows可以正常工作,之前在一台centos的linux服务器上也可以正常工作,今天在一台ubuntu12.04的服务器上却不行,尝试过各种办法(降低casperjs/phantomjs版本等)都不行。调用fill方法后,打出warning消息:[warning] [remote] unable to submit form。为了查找原因,我都去翻看了它git上的源码,想知道是哪块儿出了问题,找到以下代码块儿:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Form submission?
if (submit) {
     this .evaluate( function _evaluate(selector) {
         var form = __utils__.findOne(selector);
         var method = (form.getAttribute( 'method' ) || "GET").toUpperCase();
         var action = form.getAttribute( 'action' ) || "unknown";
         __utils__.log( 'submitting form to ' + action +  ', HTTP ' + method,  'info' );
         var event = document.createEvent( 'Event' );
         event.initEvent( 'submit' true true );
         if (!form.dispatchEvent(event)) {
             __utils__.log( 'unable to submit form' 'warning' );
             return ;
         }
         if ( typeof form.submit === " function ") {
             form.submit();
         else {
             form.submit.click();
         }
     }, selector);
}

看下来似乎是没有办法dispatchEvent “submit”的event。但是此时我的心情是“朕知道了,但朕也无能为力”……

考虑到这应该是兼容性的问题,不能也不好做什么大改动。但又必须让它正常工作。所以尝试寻找其它等同效果的办法。现在的问题是提交,而casperjs的api中除了这个fill方法没有提交直接的submit方法。这该怎么办法呢?接下来,我从casperjs的click api示例代码中得到启发。调用evaluate进入页面然后调用原生js的submit方法提交表单。怀着试一下心态运行了一下,各环境都能正常工作!

所以,为了兼容性,Casperjs中这样的写法:

1
2
3
4
5
6
7
8
9
this .fill( 'form#contact-form' , {
'subject' :     'I am watching you' ,
'content' :     'So be careful.' ,
'civility' :    'Mr' ,
'name' :        'Chuck Norris' ,
'email' :       'chuck@norris.com' ,
'cc' :          true ,
'attachment' '/Users/chuck/roundhousekick.doc'
},  true );

应该写成下面这样比较好:

1
2
3
4
5
6
7
8
9
10
11
12
this .fill( 'form#contact-form' , {
     'subject' :     'I am watching you' ,
     'content' :     'So be careful.' ,
     'civility' :    'Mr' ,
     'name' :        'Chuck Norris' ,
     'email' :       'chuck@norris.com' ,
     'cc' :          true ,
     'attachment' '/Users/chuck/roundhousekick.doc'
},  false );
this .evaluate( function (){
     document.querySelector( 'form#contact-form' ).submit();
});
本条目发布于 2013 年 10 月 10 日。属于 casperjsjavascript分类,被贴了   标签。

Ubuntu安装Casperjs

1.安装phantomjs

—-下载程序文件

1
wget https: //phantomjs .googlecode.com /files/phantomjs-1 .9.2-linux-x86_64. tar .bz2

,32位ubuntu下载链接应该是https://phantomjs.googlecode.com/files/phantomjs-1.9.2-linux-i686.tar.bz2。

—-解压文件

1
tar -xvf phantomjs-1.9.2-linux-x86_64. tar .bz2

–将程序移到一个合适的位置

1
sudo mv   phantomjs-1.9.2-linux-x86_64  /usr/local/src/phantomjs

—-创建软链接到环境变量中。这样可以直接在shell中使用phantomjs命令

1
sudo ln -sf  /usr/local/src/phantomjs/bin/phantomjs /usr/local/bin/phantomjs

—-检查是否正常工作

1
phantomjs --version

如果你看到当前版本号,即表示正常工作了。

2.安装Casperjs

—-进入一个你想放弃casper程序的目录

1
cd /usr/local/src/

—-用git下载最新程序

1
sudo git clone git: //github .com /n1k0/casperjs .git

如果你未安装git,使用

1
sudo apt-get  install git

安装git。

—-创建程序软链接

sudo ln -sf /usr/local/src/casperjs/bin/casperjs /usr/local/bin/casperjs

—-检查是否正常工作

1
casperjs --version

看到版本号代码你已经成功安装了Casperjs。以上是安装最版本的Casperjs,1.1与1.0存在不兼容。如果你想下载以前的版本,你可以到https://github.com/n1k0/casperjs上下载指定分支版本,然后像第1步安装phantomjs一样安装。Good Luck~ :)

本条目发布于 2013 年 10 月 10 日。属于 casperjs分类,被贴了   标签。

ubuntu(linux)运行phantomjs错误

错误信息:phantomjs: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory

解决办法:sudo apt-get install freetype-devel fontconfig-devel

如果运行以上命令出现以下错误:

E: Unable to locate package freetype-devel
E: Unable to locate package fontconfig-devel

再运行以下命令解决:sudo apt-get install fontconfig

 

本条目发布于 2013 年 9 月 22 日。属于 linux分类,被贴了   标签。

Casperjs循环执行(重复执行不退出)

我们知道,casperjs执行任务的时候最终是要退出的。那么如何让它(隔一段时间)重复的执行一个相同的行为呢。如果你按我们平时的js循环思维去写,你肯定会失败,达不到预期的效果。

参考写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var casper = require( 'casper' ).create({
         pageSettings: {
             loadImages:   false ,
             loadPlugins:  false
         },
         logLevel:  "info" ,
         verbose:  true
     });
 
function repeat() {
     casper.thenOpen( 'http://www.baidu.com' ).then( function (){
         this .echo( 'do something....' );
     });
     casper.wait(5000, function (){
         this .echo( 'wait time over!' )
     });
     casper.run(repeat);
}
 
casper.start().then( function (){
     this .echo( 'Starting...' );
});
casper.run(repeat);

注意点:

  • casperjs是一个链式的工作流程,你要像操作浏览器一样操作它去完成你的任务(事实上它就是一个工作在后台的浏览器内核)。比如先启动(start),然后(then)干点什么,然后(then)再干点什么(例如wait/waitForxxx)……
  • 所以.最好只创建casper一个实例运行,如果你试图创建多个实例,程序往往会假死,不会(能)退出。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值