我们常用phantomjs/casperjs脚本来做一些事情。有时候希望从外部动态传入参数来进行操作。如何实现呢?介绍三种办法:
1.通过phantomjs.args获取参数
即在脚本中直接调用phantom.args
,即可获取到命令行参数数组。注意,它默认会带三个内部参数在数组前面。第一个casperjs的安装路径,第二个casperjs的参数–cli,第三个是当前脚本名称(含路径)。之后才是执行脚本的参数。所以如果你只要获取命令行参数。需要调用phantom.args.slice(3)
截取。
2.通过casper.cli.args获取参取
有没有办法不用这么废劲呢。有。直接调用casper.cli.args
方法即可。
下面是以上两种方式的示例:
-
//1.use the phantom's args
-
var args = phantom.args;
-
console.log('phantom.args:',args);
-
console.log('phantomjs.args.slice(3):',args.slice(3));
-
-
//2.use the args of the casper.cli
-
var casper = require('casper').create();
-
var args2 = casper.cli.args;
-
console.log("casper.cli.args:",args2);
-
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 日。属于
casperjs、
javascript分类,被贴了
casperjs/phantomjs 标签。
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
|
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 日。属于
casperjs、
javascript分类,被贴了
casperjs/phantomjs 标签。
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
|
—-检查是否正常工作
如果你看到当前版本号,即表示正常工作了。
2.安装Casperjs
—-进入一个你想放弃casper程序的目录
—-用git下载最新程序
1
|
sudo
git clone git:
//github
.com
/n1k0/casperjs
.git
|
如果你未安装git,使用
安装git。
—-创建程序软链接
sudo ln -sf /usr/local/src/casperjs/bin/casperjs /usr/local/bin/casperjs
—-检查是否正常工作
看到版本号代码你已经成功安装了Casperjs。以上是安装最版本的Casperjs,1.1与1.0存在不兼容。如果你想下载以前的版本,你可以到https://github.com/n1k0/casperjs上下载指定分支版本,然后像第1步安装phantomjs一样安装。Good Luck~
本条目发布于
2013 年 10 月 10 日。属于
casperjs分类,被贴了
casperjs/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/phantomjs 标签。
我们知道,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() {
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一个实例运行,如果你试图创建多个实例,程序往往会假死,不会(能)退出。