phantomjs/casperjs动态传入参数
来源:互联网 发布:windows多线程互斥 编辑:程序博客网 时间:2024/06/05 03:55
我们常用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’)读取文件,然后解析参数。
可能你觉得这样费事,但有时候还真得通过这种方式,比如,你的参数中含有命令行中不能正常解析的特殊字符,又比如你的参数内容非常大等等。
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上的源码,想知道是哪块儿出了问题,找到以下代码块儿:
// 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
{
// http://www.spiration.co.uk/post/1232/Submit-is-not-a-function
form.submit.click();
}
}, selector);
}
看下来似乎是没有办法dispatchEvent “submit”的event。但是此时我的心情是“朕知道了,但朕也无能为力”……
考虑到这应该是兼容性的问题,不能也不好做什么大改动。但又必须让它正常工作。所以尝试寻找其它等同效果的办法。现在的问题是提交,而casperjs的api中除了这个fill方法没有提交直接的submit方法。这该怎么办法呢?接下来,我从casperjs的click api示例代码中得到启发。调用evaluate进入页面然后调用原生js的submit方法提交表单。怀着试一下心态运行了一下,各环境都能正常工作!
所以,为了兼容性,Casperjs中这样的写法:
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
);
应该写成下面这样比较好:
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();
});
Ubuntu安装Casperjs
1.安装phantomjs
—-下载程序文件
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。
—-解压文件
tar
-xvf phantomjs-1.9.2-linux-x86_64.
tar
.bz2
–将程序移到一个合适的位置
sudo
mv
phantomjs-1.9.2-linux-x86_64
/usr/local/src/phantomjs
—-创建软链接到环境变量中。这样可以直接在shell中使用phantomjs命令
sudo
ln
-sf
/usr/local/src/phantomjs/bin/phantomjs
/usr/local/bin/phantomjs
—-检查是否正常工作
phantomjs --version
如果你看到当前版本号,即表示正常工作了。
2.安装Casperjs
—-进入一个你想放弃casper程序的目录
cd
/usr/local/src/
—-用git下载最新程序
sudo
git clone git:
//github
.com
/n1k0/casperjs
.git
如果你未安装git,使用
sudo
apt-get
install
git
安装git。
—-创建程序软链接
sudo ln -sf /usr/local/src/casperjs/bin/casperjs /usr/local/bin/casperjs
—-检查是否正常工作
casperjs --version
看到版本号代码你已经成功安装了Casperjs。以上是安装最版本的Casperjs,1.1与1.0存在不兼容。如果你想下载以前的版本,你可以到https://github.com/n1k0/casperjs上下载指定分支版本,然后像第1步安装phantomjs一样安装。Good Luck~
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
Casperjs循环执行(重复执行不退出)
我们知道,casperjs执行任务的时候最终是要退出的。那么如何让它(隔一段时间)重复的执行一个相同的行为呢。如果你按我们平时的js循环思维去写,你肯定会失败,达不到预期的效果。
参考写法:
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一个实例运行,如果你试图创建多个实例,程序往往会假死,不会(能)退出。
- phantomjs/casperjs动态传入参数
- phantomjs/casperjs动态传入参数
- phantomJS 、casperjs
- 安装casperjs和phantomjs
- casperjs/phantomjs资料收集
- nodejs+phantomjs+casperjs
- phantomjs and casperjs
- phantomjs 和 CasperJS 的资料。
- phantomjs + casperjs 抓取网页截图
- CasperJS,基于PhantomJS的工具包
- 为什么casperjs比phantomjs好
- phantomJs+CasperJS windows上安装
- 动态传入多个参数
- Phantomjs,Casperjs重要的概念:执行顺序
- Windows下Casperjs Phantomjs的安装
- [译]CasperJS,基于PhantomJS的工具包
- CasperJS needs PhantomJS v1.× 错误解决方法
- 树莓派、debian 下安装 phantomjs casperjs
- 色可冽重金属捕捉剂伴侣ZP02
- ASP.NET MVC4(Razor)从客户端中检测到有潜在危险的 Request.Form 值
- 【Android 应用开发】Android 开发环境下载地址 -- 百度网盘 adt-bundle android-studio sdk adt 下载
- C++虚函数深入测试
- 选择文件或者文件夹处理函数
- phantomjs/casperjs动态传入参数
- hdu 3555 Bomb
- c# int与byte[]转换
- 【android 权限】
- eclipse快速打开文件所在位置
- acm-uva445(水题)
- centos下bash: XXX: command not found的解决方法
- spring实战的rest笔记
- POJ 3041:Asteroids:最小点覆盖