最近沒什么重要的任務,就抽空看了看項目組爬蟲小組的代碼,因為我們的爬蟲主要是以python的scrapy框架為主,看起來比較方便。在看代碼的時候看到一個叫phantomjs的東西,蠻新鮮的,就去問了下爬蟲開發,這貨是干嘛用的?開發告訴我這個東西是一個js引擎,我們在抓取ajax頁面的時候用的,你們QA不是一直用selenium對付那些js渲染的東西么,可以去試試這個,不需要用瀏覽器的。於是,回去查了一下phantomjs這個東西,學習了下,感覺還是蠻容易上手的。
Phantomjs是一個輕量的瀏覽器引擎,官網介紹中提到,它主要用在這幾個場合:官網地址:http://phantomjs.org/
- web測試,主要是可以又輕又快捷的進行web測試,還不用去再去依賴瀏覽器,用過selenium的朋友都知道,打開一個瀏覽器是多么痛苦的事,特別是FireFox,並且他支持很多測試框架,比如RobotFrame, WebDrive等。
- 頁面自動化渲染.可以通過標准的domApi來操作頁面元素,並且,你也可以注入Jquery,這樣就可以通過jquery來操作頁面元素了.
- 屏幕捕捉,這個好。有的時候case失敗了,想捕捉屏幕的時候,用selenium自帶的捕捉老是遇到瀏覽器兼容問題,用這個來捕捉應該會穩定很多、
- 網絡監視.這個我接觸的不多,主要說是可以自動分析頁面的加載速度,並且還可以導出標准的HAR格式文件。
使用方法:
運行命令就是 phtntomsjs + js 腳本就可以
Phtntomsjs用的是commonjs的實現方法,關於commonjs,可以看下http://wiki.commonjs.org/wiki/Modules/1.1.1#Require.
Phtntomsjs自帶是有幾個模塊,System,Webpage,Child_Process,WebServer
具體應用:
1.簡單的訪問環境變量的例子
var system = require('system'); //通過require返回一個外部模塊的接口,這里的外部模塊接口是system var env=require('system').env; if (system.args.length === 1) { Object.keys(env).forEach(function(key) { console.log(key + '=' + env[key]); } )} else { system.args.forEach(function (arg, i) { console.log(i + ': ' + arg); }); } phantom.exit();
2.網頁截圖,網頁截圖用到了webpage模塊,比如我想把博客園首頁截圖下來
var page = require('webpage').create(); page.open('http://cnblogs.com/', function () { page.render('cnblog.png'); phantom.exit(); });
3.網頁加載的例子
var page = require('webpage').create(), system = require('system'), t, address; if (system.args.length === 1) { console.log('Usage: loadspeed.js <some URL>'); phantom.exit(1); } else { t = Date.now(); address = system.args[1]; //打開一個地址 page.open(address, function (status) { if (status !== 'success') { console.log('FAIL to load the address'); } else { t = Date.now() - t; //evaluate用來執行一個方法 console.log('Page title is ' + page.evaluate(function () { return document.title; })); console.log('Loading time ' + t + ' msec'); } phantom.exit(); }); }
其實這個網頁加載的最好應用就是測試網頁的各種性能,不需要打開瀏覽器去查詢,如果配合雅虎的Yslow工具,加上hudson(jenkins)就能把網頁的加載也進入到持續繼承測試里面。
畢竟在linux下面,很多時候是沒有圖形界面的,phantomjs+Yslow+hudson的超級組合:http://yslow.org/phantomjs/
總之:phantomjs是一個很強大的瀏覽器引擎,因為我也剛剛接觸沒多久,很多地方還不是很熟悉,不過幸好他的文檔很多,例子也很豐富,基本上自帶的例子都可以當做一個api來調用,上手也很簡單,對js有點基礎的朋友都可以馬上上手。