Web自動(dòng)化
這里所說(shuō)的Web自動(dòng)化是所有跟頁(yè)面相關(guān)的自動(dòng)化爸黄,比如頁(yè)面爬取滞伟,數(shù)據(jù)抓取,頁(yè)面內(nèi)容檢測(cè)炕贵,頁(yè)面功能測(cè)試梆奈,頁(yè)面加載性能測(cè)試,頁(yè)面回歸測(cè)試等等称开,當(dāng)前主要由如下幾種解決方式:
文本數(shù)據(jù)獲取
這就是各種request
庫(kù)或者類似curl
這樣的工具做的事情亩钟,拿到的是頁(yè)面的文本,然后進(jìn)行XML文檔解析鳖轰,獲得相應(yīng)的內(nèi)容清酥。但如果頁(yè)面有一些動(dòng)態(tài)執(zhí)行的內(nèi)容,比如JavaScript生成跳轉(zhuǎn)URL蕴侣,這樣就搞不定了焰轻,需要有JS引擎的工具來(lái)搞,比如再配合JS引擎自行實(shí)現(xiàn)的工具睛蛛,或者直接使用瀏覽器內(nèi)核來(lái)搞的工具鹦马。
按照瀏覽器的方式來(lái)執(zhí)行
這就是各種使用瀏覽器內(nèi)核來(lái)實(shí)現(xiàn)的工具,比如基于Webkit
的PhantomJS
, 基于Gecko
的SlimerJS
, 經(jīng)過(guò)包裝的CasperJS
兼容PhantomJS
和SlimerJS
忆肾,以及基于v8
JS引擎和.net
平臺(tái)的trifleJS
等荸频。這些工具更新迭代跟不上Web標(biāo)準(zhǔn)的發(fā)展,新的Web標(biāo)準(zhǔn)無(wú)法得到良好的支持客冈。
通過(guò)協(xié)議直接操作真實(shí)瀏覽器
這就是Selenium
的實(shí)現(xiàn)方式旭从,通過(guò)WebDriver
協(xié)議進(jìn)行通信,瀏覽器和瀏覽器驅(qū)動(dòng)都實(shí)現(xiàn)了C/S結(jié)構(gòu)的WebDriver
協(xié)議,Selenium
通過(guò)瀏覽器的驅(qū)動(dòng)包场仲,來(lái)發(fā)送操作請(qǐng)求和悦,瀏覽器根據(jù)請(qǐng)求響應(yīng)相應(yīng)的操作。這樣實(shí)現(xiàn)有一個(gè)問(wèn)題是始終有一個(gè)真實(shí)瀏覽器的界面在渲染和變化渠缕,一方面效率低下鸽素,另一方面在服務(wù)端環(huán)境無(wú)法運(yùn)行。于是就衍生出了使用Xvfb(virtual framebuffer X Server)
來(lái)配合實(shí)現(xiàn)在服務(wù)器環(huán)境下的運(yùn)行亦鳞,基本解決了問(wèn)題馍忽。但每一種瀏覽器的特性支持都依賴于相應(yīng)的驅(qū)動(dòng)的實(shí)現(xiàn)和支持情況棒坏。
無(wú)界面瀏覽器
前面的實(shí)現(xiàn)方式都或多或少有自己的問(wèn)題或者局限,如果瀏覽器本身支持在服務(wù)端環(huán)境運(yùn)行遭笋,這將是一個(gè)近乎完美的解決思路坝冕。Chrome
59開(kāi)始支持無(wú)界面模式,F(xiàn)irefox 55支持Linux版的無(wú)界面模式瓦呼,F(xiàn)irefox 56支持全平臺(tái)的無(wú)界面模式喂窟,這樣一來(lái),使用方不用被動(dòng)等待瀏覽器的WebDriver
的實(shí)現(xiàn)央串。
Headless Chrome相關(guān)的對(duì)比
Headless 是一種在無(wú)圖形界面環(huán)境運(yùn)行的一種能力磨澡,比如高性能的服務(wù)器端環(huán)境,參考Healess Software蹋辅。
PhantomJS的問(wèn)題
- 使用老版本的Webkit钱贯,不支持新的Web標(biāo)準(zhǔn),跟真實(shí)瀏覽器存在差異
- 開(kāi)發(fā)者維護(hù)難度大侦另,主要維護(hù)者不干了秩命,起因是Chrome 將支持 Headless模式
- 要解決的問(wèn)題多,1800+
- 內(nèi)存占用高褒傅,并發(fā)有問(wèn)題弃锐,不穩(wěn)定,有些奇奇怪怪的bug
Selenium的問(wèn)題
- 使用WebDriver接口和瀏覽器驅(qū)動(dòng)來(lái)操作真實(shí)瀏覽器殿托,帶界面渲染霹菊,速度慢
- 需要有圖形界面,顯示設(shè)備的支持
- 需要使用Xvfb(virtual framebuffer X Server)
- X是架構(gòu)無(wú)關(guān)的遠(yuǎn)程圖形界面和輸入設(shè)備兼容的系統(tǒng)支竹,C/S架構(gòu)
- 在沒(méi)有物理輸入和顯示設(shè)備的機(jī)器上運(yùn)行
- 這里可以簡(jiǎn)單理解為虛擬顯示器或者顯示器模擬器
- 也支持Headless實(shí)現(xiàn)旋廷,實(shí)現(xiàn)跟Web標(biāo)準(zhǔn)有差異
- 通過(guò)ChromeDriver(WebDriver的Chrome實(shí)現(xiàn))的來(lái)操作Chrome,需要依賴ChromeDriver的更新
- 可以在ChromeDriver下載查看支持的Chrome版本
Headless Chrome帶來(lái)的優(yōu)勢(shì)
- 資源占用少(相對(duì)于PhantomJS)
- 服務(wù)端環(huán)境(命令行礼搁,無(wú)圖形界面)
- 支持現(xiàn)代Web標(biāo)準(zhǔn)和技術(shù)(ES6,ServiceWorkers,WebGL...)
- 行為符合Web規(guī)范饶碘、版本能自動(dòng)更新
- Chronium/Chrome團(tuán)隊(duì)維護(hù)