Chrome Headless 模式

Chrome Headless 模式

前言 Headless Browser

Headless Browser的定義是無界面的瀏覽器。多用於測試web應用,自動截圖,測試js代碼,爬蟲抓取信息等等。

簡而言之,現代瀏覽器是給用戶使用,而Headless Browser則更多的是給程序使用。

Chrome的Headless模式出來之前,其他現代瀏覽器也都是沒有提供Headless模式。現有的Headless Browser都是基於現有的幾個瀏覽器內核來封裝開發的。

比較常見的幾個Headless Browser:

  • PhantomJS - QtWebKit內核

  • SlimerJS - Gecko內核

  • TrifleJS - IE內核

因為畢竟不是真實的用戶瀏覽器環境,使用起來還是有不少的詬病。此前一段時間研究使用過PhantomJS,功能雖然夠用,不過對比在真實的瀏覽器裡面訪問的數據信息還是有所差別。

最近Chrome Headless模式的發布(雖然還是開發版本里的,不過終究會變成穩定版本的功能),使得許多使用Headless Browser的紛紛替換成了Chrome,優勢不言自明。

Headless Chrome

Chrome 59 beta版本開始支持Headless mode,過不久就會是穩定版本的功能。Chrome Platform Status中有詳細的每個版本新增的功能。

Headless模式可以讓Chrome無界面的運行,相當於開了一個無界面的瀏覽器的進程,然後可以通過介面或者Chrome開發者調試工具來操作Chrome,包括載入頁面、獲取元數據(DOM信息等)等等,所有Chrome提供的功能都可以使用。

啟動Headless模式

chrome --headless --remote-debugging-port=9222 https://chromium.org --disable-gpu

--disable-gpu ,Linux伺服器一般沒有GPU,所以不禁用可能會產生一些錯誤。

DevTools - Chrome的開發者調試工具

用正常的Chrome瀏覽器打開http://localhost:9222, 就能看到用開發者調試工具可以操作你正在打開的頁面。

Node.js API

需要使用到一個Node.js的庫,chrome-remote-interface

使用該庫獲取載入一個頁面然後獲取它的DOM信息:

const CDP = require(chrome-remote-interface);CDP((client) => { // Extract used DevTools domains. const {Page, Runtime} = client; // Enable events on domains we are interested in. Promise.all([ Page.enable() ]).then(() => { return Page.navigate({url: Example Domain}); }); // Evaluate outerHTML after page has loaded. Page.loadEventFired(() => { Runtime.evaluate({expression: document.body.outerHTML}).then((result) => { console.log(result.result.value); client.close(); }); });}).on(error, (err) => { console.error(Cannot connect to browser:, err);});

該庫實現的各個模塊詳細的文檔:Chrome debugger protocol viewer

Chrome debugging protocol

chrome-remote-interface其實是Chrome debugging protocol的實現,它才是基石。我在另外一篇文章里有簡單介紹它的使用。 Chrome之遠程調試協議(Remote debugging protocol)

Chrome Developer Tools是用HTML,Javascript,CSS編寫的chrome開發者工具,然而Remote debugging protocol就是它用來與瀏覽器頁面(pages)交互和調試的協議通道。採用websocket來與頁面建立通信通道,由發送給頁面的commands和它所產生的events組成。chrome的開發者工具是這個協議主要的使用者,第三方開發者也可以調用這個協議來與頁面交互調試。

總結

Chrome Headless模式的出現讓PhantomJS的作者停止維護了他的項目,可以預見不久所有主流的瀏覽器也會提供Headless模式,從而現有的Headless Browser的項目都會慢慢停止維護。

各大瀏覽器提供Headless模式可以讓程序運行的環境更貼近用戶訪問的真實環境,得出的數據也會更加準確可靠。

參考文章

  • Chrome之遠程調試協議(Remote debugging protocol

  • Headless Chromium

  • Chrome Debugging Protocol

  • chrome-remote-interface

  • Chrome debugger protocol viewer

推薦閱讀:

如何將喜歡的響應式網站變成APP – manifest icon製作教程無標題文章
Web App防坑手冊
認識node核心模塊--深入EventEmitter
記一次前端面試
(四)一份友好樣式的緣起與歸宿

TAG:前端開發 | 前端性能優化 |