CasperJs 入門介紹

CasperJs 是一個(gè)基于 PhantomJs 的工具仓手,其比起 PhantomJs 可以更加方便的進(jìn)行 navigation。

1、安裝

CasperJS 依賴于 PhantomJS >= 1.3,強(qiáng)烈建議使用 PhantomJS1.5 版本菩咨,PhantomJS 的安裝非常簡(jiǎn)單,下載后解壓就可以使用陡厘,或者直接使用 npm 安裝抽米。

安裝 phantomjs 環(huán)境

$ npm install -g phantomjs

接下來(lái),我們安裝 CasperJS:

$ npm install -g casperjs

安裝 CasperJS 必須確保在 Python 環(huán)境下雏亚,Python下載之后直接安裝即可缨硝。

確認(rèn)環(huán)境是否安裝成功:

$ phantomjs --version
$ python --version
$ casperjs --version
2摩钙、一個(gè)簡(jiǎn)單的 CasperJS 代碼

創(chuàng)建一個(gè)文件 baidu.js,用來(lái)模擬我們?cè)L問百度頁(yè)面

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

casper.run();

運(yùn)行:

$ casperjs baidu.js

得到輸出結(jié)果:

"百度一下,你就知道"
3与斤、casper 的串聯(lián)執(zhí)行和生成網(wǎng)頁(yè)圖片

CasperJS 的執(zhí)行腳本是由一個(gè)一個(gè)的 Step 串聯(lián)起來(lái)的,start 表示第一步宜岛,然后后面的 step 用 then 來(lái)表示,再依次執(zhí)行:

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

casper.then(function() {
  this.capture('baidu-homepage.png'); //  生成一個(gè)png圖片
});

casper.run();

完成以后功舀,我們會(huì)在 Console 上得到一個(gè) title萍倡,同時(shí)我們也會(huì)得到在 then 中捕捉到的圖片 baidu-homepage.png。

4辟汰、form提交列敲,進(jìn)行搜索

我們想辦法讓 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'); //  生成一個(gè)png圖片
});

casper.then(function() {
   this.fill('form[action="/s"]', { wd: 'thoughtworks' }, true);//填入form,進(jìn)行搜索
});

casper.then(function() {
   this.capture('thoughtworks-search-results.png');
});

casper.run();

5帖汞、如何引入 jQuery戴而,并且進(jìn)行數(shù)據(jù)輸出保存

有時(shí)候,需要引入一些第三方插件來(lái)方便操作翩蘸,例如: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();

返回結(jié)果:

thoughtworks_百度百科
成都Thoughtworks-招聘專員--地點(diǎn):成都招聘信息|ThoughtWorks招聘...
敏捷開發(fā)和體驗(yàn)設(shè)計(jì) | ThoughtWorks
thoughtworks基本情況及待遇 【懦夫救星_職場(chǎng)古拳法】
和Thoughtworks的一次邂逅(一) - redhat - ITeye技術(shù)網(wǎng)站
thoughtworks筆試整理zz_ThoughtWorks招聘經(jīng)驗(yàn)
關(guān)于我們 | ThoughtWorks
ThoughtWorks位列面試難度最高的科技公司之首_百度文庫(kù)
透明的相冊(cè)-ThoughtWorks西安辦公室
思特沃克軟件技術(shù)(西安)有限公司ThoughtWorks Software ...

需要注意的地方:

1)create casper 的時(shí)候所意,我們 inject 了jquery,這個(gè) jquery 必須是保存在本地的催首,通過(guò) HTTP 訪問是無(wú)效的扶踊。

2)this.evaluate(getTitles) 可以理解成,我們?cè)?CasperJs 中郎任,將 getTitles 這個(gè)方法注入到了訪問的頁(yè)面中秧耗,在訪問的頁(yè)面中執(zhí)行這個(gè)方法并反問其返回值。

3)訪問頁(yè)面log的獲壤缘巍:2)中講到了getTitles其實(shí)是在被訪問頁(yè)面中執(zhí)行的绣版,如果我們?cè)趃etTitles加入一段console.log的代碼話,怎么能夠得到被訪問頁(yè)面的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'))
})

這樣就可以偵聽被訪問頁(yè)面的console.log事件杂抽,比導(dǎo)出到CasperJs中

完整案例

( 本人公司內(nèi)網(wǎng)才能訪問,各位同學(xué)可以隨意模擬一個(gè)網(wǎng)站)

// 創(chuàng)建 casper 實(shí)例
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"; //解決中文亂碼

/* 打開首頁(yè) */
casper.start('https://web.yd.sdy.ppmoney.com/', function() {
    this.echo(this.getTitle());
    this.echo(this.getCurrentUrl());
});
/* 點(diǎn)擊登錄按鈕缩麸,去到登錄頁(yè) */
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); //等待三秒赡矢,預(yù)防未登錄杭朱。

/* 充值 */
casper.then(function() {
    this.echo(this.getTitle());
    this.clickLabel('充值', 'a');

    console.log(1234);

    this.waitForSelector('input[id="monetary"]');
});

/* 設(shè)置充值金額 */
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"]');
});

/* 設(shè)置購(gòu)買金額 */
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('測(cè)試運(yùn)行完成...', 'INFO').exit();
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吹散,隨后出現(xiàn)的幾起案子弧械,更是在濱河造成了極大的恐慌,老刑警劉巖空民,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刃唐,死亡現(xiàn)場(chǎng)離奇詭異羞迷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)画饥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門衔瓮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人抖甘,你說(shuō)我怎么就攤上這事热鞍。” “怎么了衔彻?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵薇宠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我艰额,道長(zhǎng)昼接,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任悴晰,我火速辦了婚禮慢睡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铡溪。我一直安慰自己漂辐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布棕硫。 她就那樣靜靜地躺著髓涯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哈扮。 梳的紋絲不亂的頭發(fā)上纬纪,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音滑肉,去河邊找鬼包各。 笑死,一個(gè)胖子當(dāng)著我的面吹牛靶庙,可吹牛的內(nèi)容都是我干的问畅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼六荒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼护姆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起掏击,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤卵皂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后砚亭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灯变,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豺旬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柒凉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篓跛,死狀恐怖膝捞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愧沟,我是刑警寧澤蔬咬,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站沐寺,受9級(jí)特大地震影響林艘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜混坞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一狐援、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧究孕,春花似錦啥酱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至微酬,卻和暖如春绘趋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颗管。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工陷遮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垦江。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓拷呆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親疫粥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茬斧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容