CasperJs 是一个基于 PhantomJs 的工具,其比起 PhantomJs 可以更加方便的进行 navigation。

1、安装

CasperJS 依赖于 PhantomJS >= 1.3,强烈建议使用 PhantomJS1.5 版本,PhantomJS 的安装非常简单,下载后解压就可以使用,或者直接使用 npm 安装。

安装 phantomjs 环境

$ npm install -g phantomjs

接下来,我们安装 CasperJS:

$ npm install -g casperjs

安装 CasperJS 必须确保在 Python 环境下,Python下载之后直接安装即可。

确认环境是否安装成功:

$ phantomjs --version
$ python --version
$ casperjs --version
2、一个简单的 CasperJS 代码

创建一个文件 baidu.js,用来模拟我们访问百度页面

var casper = require('casper').create();
casper.start('http://www.baidu.com/', function() {
this.echo(this.getTitle());
}); casper.run();

运行:

$ casperjs baidu.js

得到输出结果:

"百度一下,你就知道"
3、casper 的串联执行和生成网页图片

CasperJS 的执行脚本是由一个一个的 Step 串联起来的,start 表示第一步,然后后面的 step 用 then 来表示,再依次执行:

var casper = require('casper').create();
casper.start('http://www.baidu.com/', function() {
this.echo(this.getTitle());
}); casper.then(function() {
this.capture('baidu-homepage.png'); // 生成一个png图片
}); casper.run();

完成以后,我们会在 Console 上得到一个 title,同时我们也会得到在 then 中捕捉到的图片 baidu-homepage.png。

4、form提交,进行搜索

我们想办法让 CasperJS 完成搜索功能

var casper = require('casper').create();
casper.start('http://www.baidu.com/', function() {
this.echo(this.getTitle());
}); casper.then(function() {
this.capture('baidu-homepage.png'); // 生成一个png图片
}); casper.then(function() {
this.fill('form[action="/s"]', { wd: 'thoughtworks' }, true);//填入form,进行搜索
}); casper.then(function() {
this.capture('thoughtworks-search-results.png');
}); casper.run();

5、如何引入 jQuery,并且进行数据输出保存

有时候,需要引入一些第三方插件来方便操作,例如:jQuery

var casper = require('casper').create({
clientScripts: ["jquery.js"]
}); casper.start('http://www.baidu.com/', function() {
this.echo(this.getTitle());
}); casper.then(function() {
this.fill('form[action="/s"]', { wd: 'thoughtworks' }, true);
}); casper.then(function() {
search_result_titles = this.evaluate(getTitles)
this.echo(search_result_titles.join('\n'))
}); function getTitles() {
var titles = $.map($("h3.t a"), function(link) {
return $(link).text()
});
return titles
} casper.run();

返回结果:

thoughtworks_百度百科
成都Thoughtworks-招聘专员--地点:成都招聘信息|ThoughtWorks招聘...
敏捷开发和体验设计 | ThoughtWorks
thoughtworks基本情况及待遇 【懦夫救星_职场古拳法】
和Thoughtworks的一次邂逅(一) - redhat - ITeye技术网站
thoughtworks笔试整理zz_ThoughtWorks招聘经验
关于我们 | ThoughtWorks
ThoughtWorks位列面试难度最高的科技公司之首_百度文库
透明的相册-ThoughtWorks西安办公室
思特沃克软件技术(西安)有限公司ThoughtWorks Software ...

需要注意的地方:

1)create casper 的时候,我们 inject 了jquery,这个 jquery 必须是保存在本地的,通过 HTTP 访问是无效的。

2)this.evaluate(getTitles) 可以理解成,我们在 CasperJs 中,将 getTitles 这个方法注入到了访问的页面中,在访问的页面中执行这个方法并反问其返回值。

3)访问页面log的获取:2)中讲到了getTitles其实是在被访问页面中执行的,如果我们在getTitles加入一段console.log的代码话,怎么能够得到被访问页面的console信息呢?

casper.then(function() {
this.page.onConsoleMessage = function(e) {
console.log(e);
}
search_result_titles = this.evaluate(getTitles)
this.echo(search_result_titles.join('\n'))
})

这样就可以侦听被访问页面的console.log事件,比导出到CasperJs中

完整案例

// 创建 casper 实例
var casper = require('casper').create({
verbose: true,
logLevel: 'info',
onError: function(self, msg) {
this.capture('error.png');
console.log('error: ' + msg);
self.exit();
},
pageSettings: {
loadImages: false, // 不加载图片,为了速度更快
loadPlugins: false
},
verbose: true
// clientScript: ['jquery.js']
});
phantom.outputEncoding = "utf-8"; //解决中文乱码 /* 打开首页 */
casper.start('https://web.yd.sdy.ppmoney.com/', function() {
this.echo(this.getTitle());
this.echo(this.getCurrentUrl());
});
/* 点击登录按钮,去到登录页 */
casper.then(function() {
this.click('a[title="登录"]');
this.waitForSelector('form[action="/login/"]');
}); /* 输入登录表单 */
casper.then(function() {
this.fill('form[action="/login/"]', {
Phone: '15710376688',
Password: '12345678'
}, true);
});
/* 提交表单,登录 */
casper.then(function() {
this.click('button[id="sendLogin"]');
}); casper.wait(3000); //等待三秒,预防未登录。 /* 充值 */
casper.then(function() {
this.echo(this.getTitle());
this.clickLabel('充值', 'a'); console.log(1234); this.waitForSelector('input[id="monetary"]');
}); /* 设置充值金额 */
casper.then(function(){
this.echo(this.getTitle()); this.evaluate(function() {
document.getElementById("monetary").value = 100;
$("#btnRecharge").attr("class", "pp-btn pp-btn-lg btn-recharge");
}); this.wait(2000, function() {
this.click('input[id="btnRecharge"]');
}); this.capture('recharge.png');
this.waitForSelector('input[id="password"]');
}); /* 设置购买金额 */
casper.then(function() {
this.echo(this.getTitle()); this.evaluate(function() {
document.getElementById("password").value = "12345678";
}); this.echo("充值金额: 1000元.");
}); casper.then(function() {
this.click('input[id="nextButton"]');
this.wait(10000, function() {
this.capture("recharge.png");
});
}); casper.on('remote.message', function(msg) {
this.log(msg, 'info');
}); casper.run(function(){
this.echo('测试运行完成...', 'INFO').exit();
});
 

CasperJs 入门介绍的更多相关文章

  1. [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)

    最近在使用Python爬取网页内容时,总是遇到JS临时加载.动态获取网页信息的困难.例如爬取CSDN下载资源评论.搜狐图片中的“原图”等,此时尝试学习Phantomjs和CasperJS来解决这个问题 ...

  2. C# BackgroundWorker组件学习入门介绍

    C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...

  3. 初识Hadoop入门介绍

    初识hadoop入门介绍 Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. < ...

  4. [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍

    前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...

  5. JavaScript入门介绍(二)

    JavaScript入门介绍 [函数] 函数function 是Javascript的基础模块单元,用于代码的复用.信息影藏和组合调用. function a(){} 函数对象Function Lit ...

  6. JavaScript入门介绍(一)

    JavaScript入门介绍 [经常使用的调试工具][w3school.com.cn在线编辑] [Chrome浏览器 开发调试工具]按F121.代码后台输出调试:console.log("t ...

  7. .NET 4 并行(多核)编程系列之一入门介绍

    .NET 4 并行(多核)编程系列之一入门介绍 本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍. 本篇文章的议题如下:  1. 并行编程和多线程编程的区别.  ...

  8. .NET读写Excel工具Spire.Xls使用(1)入门介绍

    原文:[原创].NET读写Excel工具Spire.Xls使用(1)入门介绍 在.NET平台,操作Excel文件是一个非常常用的需求,目前比较常规的方法有以下几种: 1.Office Com组件的方式 ...

  9. Linux入门介绍

    Linux入门介绍 一.Linux 初步介绍 Linux的优点 免费的,开源的 支持多线程,多用户 安全性好 对内存和文件管理优越 系统稳定 消耗资源少 Linux的缺点 操作相对困难 一些专业软件以 ...

随机推荐

  1. *Fragment与Activity生命周期的协调

    本文出处:http://blog.csdn.net/think_soft/article/details/7272869 拥有Fragment的Activity的生命周期直接影响了其中的Fragmen ...

  2. 列表(增删改查)元组tupe

    增加:有三种,append:在后面添加.Insert按照索引添加,expend:迭代着添加.#append li = ['lishi','alex','lili'] li.append(') prin ...

  3. OpenCV - 图片二值化,计算白色像素点的个数

    直接上代码吧: import cv2 import numpy as np from PIL import Image area = def getWhitePixel(img): global ar ...

  4. 深入了解ZooKeeper(一)

    在上篇博客ZooKeeper初探之安装和配置中已经对Zookeeper这个“服务协调者”有了初步的认识和了解,一个字“美”,接下来开始深入的交往,开始了解其内心世界! 1. 内容思维导图 2. 分布式 ...

  5. web应用程序安全攻防---sql注入和xss跨站脚本攻击

    kali视频学习请看 http://www.cnblogs.com/lidong20179210/p/8909569.html 博文主要内容包括两种常见的web攻击 sql注入 XSS跨站脚本攻击 代 ...

  6. 剑指offer-第四章解决面试题的思路(从上往下打印二叉树)

    题目:从上往下打印二叉树的每一个节点,同一层的节点按照从左到右的顺序打印 思路:这是一个层序遍历的问题,因此要借用到队列.我们可以在打印第一个节点的同时将这个节点的左右子节点都放入队列,同样打印左右子 ...

  7. 【mssql】SQL Server2012编程入门经典(第四版)(上) 读书笔记

    数据库用了很久了,但好多东西很容易忘记,这次头脑发热想起来读一遍书,做点笔记! 从第五章开始参考:<SQL Server 2005 编程入门经典>学习笔记 一.RDBMS基础:SQL Se ...

  8. python-mao

    冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复 ...

  9. php调试时echo,print_r(),var_dump()的区别

    简单说: var_dump() 能打印出类型 print_r() 只能打出值echo() 是正常输出... 需要精确调试的时候用 var_dump();一般查看的时候用 print_r() 另外 , ...

  10. simple_one_for_one 和 one_for_one的区别

    参考这里http://blog.sina.com.cn/s/blog_77cb45a70102v1ja.html 用起来最直观的不同点 simple_one_for_one需要手工start_chil ...