puppeteer 是一個經過DevTools 協議提供高級API 來控制 chrome,chromium 的 NODE庫; puppeteer默認運行在 headless 模式, 也可配置後運行在全模式(non-headless).javascript
大部分在瀏覽器裏手動執行的動做均可以經過puppeteer實現! 這裏有幾個列子來讓你開始.java
爲了在你的項目裏使用puppeteer, 執行:node
npm i puppeteer # 或者 yarn add puppeteer
提示: 安裝puppeteer是,會下載最新版本的chromium(Mac下170 M, Windows下282M))以保證API正常工做. 要跳過這一步,請參閱環境變量().git
提示: puppeteer須要 Node V6.4.0及以上版本, 但如下例子中使用了在Node V7.60及以上版本中的 async/await .github
使用過其它瀏覽器測試框架的人對puppeteer也會熟悉. 建立Browser實列, 打開頁面,而後使用puppeteer API操做頁面.web
保存以下文件爲 example.jschrome
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); await page.screenshot({path: 'example.png'}); await browser.close(); })();
執行下面命令 node example.js
npm
puppeteer 設置出時頁面尺寸爲 800 x 600px ,截圖尺寸也是這個. 經過Page.setViewport() 設置個性化頁面尺寸.json
文件保存爲hn.jsapi
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://news.ycombinator.com', {waitUntil: 'networkidle2'}); await page.pdf({path: 'hn.pdf', format: 'A4}'); await browser.close(); })();
執行以下命令 node hn.js
, 查看 Page.pdf() API 尋找更多關於建立PDF的信息.
保存爲 get-dimensions.js
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); const dimensions = await page.evaluate(() => { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight, deviceScaleFactor: window.devicePixelRatio } }) })()
執行以下命令 node get-dimensions.js
, 查看Page.evaluate() API 獲取關於evaluate和相關方法 (如:evaluateOnNewDocument, exposeFunction)的詳細信息.
puppeteer 運行chromium 在headless模式下. 當運行瀏覽器時設置'headless' 選項使chromium運行在全模式下.
const browser = await puppeteer.launch({headless: false});
默認狀況下,puppeteer下載使用指定版本的 chromium 以保證全部的API正常工做. 建立Browser實例時指定 executablePath值來以使用不一樣瀏覽器.
const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'})
查看puppeteer.launch() API瞭解更多信息.
閱讀這篇文章瞭解chromium和 Chrome 的不一樣, 描述了Chrome和 chromium 在Linux下的不一樣.
puppeteer每次運行時先建立一個 chromium 用戶, 運行結束後就清除用戶信息.
探索API 文檔和例子來學習更多.
const browser = await puppeteer.launch({headless: false,})
const browser = await puppeteer.launch({ headless: false, slowMo: 250 //減慢puppeteer 250ms });
page.on('console', msg => console.log('頁面log', msg.text())); await page.evaluate(() => console.log(`url is ${location.href}`))
const browser = await puppeteer.launch({devtools: true});
jest.setTimeout(100000);
jasmine.DEFAULT_TIME_INTERVAL = 100000;
this.timeout(100000);
(改變測試時使用 function 不能使用箭頭函數)debugger
語句, 在已存在的evaluate環境中添加 debugger
await page.evaluate(() => { debugger; });
puppeteer測試將會中止在上面這條語句, chromium也將停留在 debugger 模式.
puppeteer
命名空間下的 debug
模塊記錄# 基本的詳細記錄 env DEBUG="puppeteer:*" node script.js # 調試輸出可經過命名空間來開關 env DEBUG="puppeteer:*,-puppeteer:protocol" node script.js # 記錄除了協議信息的全部信息 env DEBUG="puppeteer:session" node script.js # 記錄會話協議(protocol messages) env DEBUG="puppeteer:mouse,puppeteer:keyboard" node script.js # 只記錄鼠標和鍵盤API調用 # 傳輸協議記錄的比較繁雜. 下面例子過濾全部網絡信息. env DEBUG="puppeteer:*" env DEBUG_COLORS=true node script.js 2>&1 | grep -v '"Network'
查看貢獻指南 以瞭解puppeteer開發概述
Chrome DevTools團隊維護這個庫, 同時歡迎你們的參與!
這個項目的目標是:
咱們採用chromium職責來幫助咱們驅動產品作決定:
不是, 這兩個項目由於一些不一樣的緣由都是有價值的.
puppeteer做爲 chromium 不可分割的一部分. 每一個版本的puppeteer綁定於一個特定版本的 chromium以保證 puppeteer工做.
着並非經過人工來約束,許多puppeteer工做確實在 chromium 倉庫裏.下面時典型故事:
然而,一般人們更願意將puppeteer 和官方的Google Chrome一同使用.這種狀況下須要選擇特定版本的puppeteer以使chromium版本接近chrome.
在puppeteer相關版本的package.json文件裏查看.
在puppeteer觀點中, '導航(navigation)' 是全部改變頁面URL的事物. 除了常規的導航外,在瀏覽器中點擊網絡從web服務器中獲取新文檔, 包含a標籤導航和history API
在這個navigation定義中, puppeteer和單頁面應用無縫銜接.
在瀏覽器中輸入事件被分爲兩大類: 信任的和不被信任的.
網站可以區分這兩類事件:
Event.isTrusted
事件標誌.爲了自動化的目的, 生成可信任事件是比較重要的. 經過puppeteer生成的輸入事件都是可信任事件和觸發適當的伴隨事件.若是須要非信任事件,須要經過page.evaluate
在頁面上下文中生成模擬事件:
await page.evaluate(() => { document.querySelector('button[type=submit]').click(); })
你也許會發現當puppeteer控制包含audio和video的頁面時一些行爲不是預期的.(例如, 視頻播放時截圖會失敗), 這有如下兩個緣由:
咱們有一份針對不一樣操做系統的排錯指南需求列表.
npm i --save puppeteer@next
提示: 提早版本可能不穩定和包含bugs.
這裏有許多關於puppeteer幫助的路徑:
確保在提交你的問題以前在這些頻道里搜索問題.