Phantom JS是一個服務(wù)器端的 JavaScript API 的 WebKit。其支持各種Web標(biāo)準(zhǔn): DOM 處理, CSS 選擇器, JSON, Canvas, 和 SVG,解壓到任意目錄,并將包含phantomjs.exe的目錄添加到系統(tǒng)路徑。
PhantomJS 是一個基于 WebKit 的服務(wù)器端 JavaScript API。它全面支持web而不需瀏覽器支持,其快速,原生支持各種Web標(biāo)準(zhǔn): DOM 處理, CSS 選擇器, JSON, Canvas, 和 SVG。 PhantomJS 可以用于 頁面自動化 , 網(wǎng)絡(luò)監(jiān)測 , 網(wǎng)頁截屏 ,以及 無界面測試 等。
安裝
自行選擇對應(yīng) 版本下載解壓即可( 為方便使用,可自已為phantomjs設(shè)置環(huán)境變量 ),其中帶有一個example文件夾,里面有很多已經(jīng)寫好的代碼供使用。本文假設(shè)phantomjs已經(jīng)安裝好并已設(shè)置了環(huán)境變量。
使用場景:
無需瀏覽器的 Web 測試
頁面訪問自動化
屏幕捕獲
網(wǎng)絡(luò)監(jiān)控.
phantom對象
之前的例子中我們已經(jīng)初步認(rèn)識了phantom對象。它的功能是定義和控制phantom運行環(huán)境的參數(shù)和流程。關(guān)鍵的API有:
phantom.args String[]
獲取傳給本JS程序的參數(shù),需要與 system.args 進(jìn)行區(qū)分(system模塊詳見下文),后者表示傳給phantomjs引擎的參數(shù)。例如 phantomjs ./test.js http://baidu.com 這句語句,通過 phantom.args ,我們能得到的參數(shù)列表為["http://baidu.com"] ,而通過 system.args 則得到 ["./test.js", "http://baidu.com"] 這樣的參數(shù)列表。差異就在于是否包含當(dāng)前腳本名稱。不過 phantom.scriptName 這個API提供了獲取腳本名稱的功能。
phantom.cookies Object[]
獲取或設(shè)置cookies,不過對于設(shè)置建議使用其他的API完成。同時相關(guān)的API還有:
phantom.addCookie(Object) Boolean:添加cookie值
phantom.deleteCookie(cookieName) Boolean:刪除指定Cookie值
phantom.clearCookies() :清空所有的cookie
phantom.cookiesEnabled Boolean:獲取或設(shè)置是否支持cookie
phantom.injectJs(fileName) Boolean:
把指定的外部JS文件注入到當(dāng)前環(huán)境。執(zhí)行這個方法時,phantomjs首先會從當(dāng)前目錄檢索此文件,如果找不到,則再到 phantom.libraryPath 指定的路徑尋找。 phantom.libraryPath 這個API基本上就是為 phantom.injectJs() 服務(wù)的。
phantom.onError
當(dāng)頁面存在js錯誤,且沒有被 page.onError 處理,則會被此handler捕獲。下面是使用此API的一個例子。由于phantom環(huán)境下代碼調(diào)試很困難,了解這些錯誤捕獲的API也許會對我們的實際使用有所幫助。
phantom.onError = function(msg, trace) { var msgStack = ['PHANTOM ERROR: ' + msg]; if (trace && trace.length) { msgStack.push('TRACE:'); trace.forEach(function(t) { msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function +')' : '')); }); } console.error(msgStack.join('\n')); phantom.exit(1); };
phantom.exit(returnValue)
這個API已經(jīng)見過多次了,它的作用是退出程序,可以設(shè)置一個退出代碼,默認(rèn)是0。