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. //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 日。属于casperjs、javascript分类,被贴了 casperjs/phantomjs 标签。

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) {
        varform = __utils__.findOne(selector);
        varmethod = (form.getAttribute('method') || "GET").toUpperCase();
        varaction = form.getAttribute('action') || "unknown";
        __utils__.log('submitting form to '+ action + ', HTTP '+ method, 'info');
        varevent = document.createEvent('Event');
        event.initEvent('submit'truetrue);
        if(!form.dispatchEvent(event)) {
            __utils__.log('unable to submit form''warning');
            return;
        }
        if(typeofform.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中这样的写法:

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 标签。

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
sudomv  phantomjs-1.9.2-linux-x86_64 /usr/local/src/phantomjs

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

1
sudoln -sf /usr/local/src/phantomjs/bin/phantomjs/usr/local/bin/phantomjs

—-检查是否正常工作

1
phantomjs --version

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

2.安装Casperjs

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

1
cd/usr/local/src/

—-用git下载最新程序

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

如果你未安装git,使用

1
sudoapt-get installgit

安装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分类,被贴了 casperjs/phantomjs 标签。

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/phantomjs 标签。

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
varcasper = require('casper').create({
        pageSettings: {
            loadImages:  false,
            loadPlugins: false
        },
        logLevel: "info",
        verbose: true
    });
 
functionrepeat() {
    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 0
原创粉丝点击