Puppeteer相關介紹

最近在使用lighthouse和puppeteer進行一些性能測試相關的工作,感覺puppeteer還是很好用的翔怎,下面簡單介紹一下puppeteer的使用

概念

Headless Chrome

  • 是一種在無界面的環(huán)境中運行 Chrome,與正常Chrome的區(qū)別
    • 直接通過命令行或者程序語言操作
    • 沒有界面,少了加載 css/js讳癌、渲染頁面的工作,比真實瀏覽器更快存皂,更穩(wěn)定
  • 在啟動 Chrome 時添加參數(shù) --headless晌坤,便可以 headless 模式啟動 Chrome

Puppeteer

  • 是 Node.js 工具引擎
  • 是 Chrome Developer Protocol 的上層封裝
  • 提供了高級API來通過DevTools協(xié)議控制Chrome或Chromium
  • 默認是headless,可通過參數(shù)配置調出界面

Puppeteer可以做什么

  • 生成頁面的屏幕截圖和PDF。(包括滾動元素的全屏截圖)
  • 爬取SPA(單頁應用程序)并生成預渲染的內容(即“ SSR”(服務器端渲染))泡仗。
  • 自動進行表單提交,UI測試猜憎,鍵盤輸入等娩怎。
  • 創(chuàng)建最新的自動化測試環(huán)境。使用最新的JavaScript和瀏覽器功能胰柑,直接在最新版本的Chrome中運行測試截亦。
  • 捕獲站點的時間線跟蹤,以幫助診斷性能問題柬讨。
  • 測試Chrome擴展程序崩瓤。

文檔資源

API

結合API文檔使用


image.png
Browser: 對應一個瀏覽器實例
BrowserContext: 對應瀏覽器一個上下文會話
Page:表示一個 Tab 頁面
Frame: 一個框架
ExecutionContext: javascript 的執(zhí)行環(huán)境
ElementHandle: 對應 DOM 的一個元素節(jié)點
JsHandle:對應 DOM 中的 javascript 對象CDPSession:可以直接與原生的 CDP 進行通信
Coverage:獲取 JavaScript 和 CSS 代碼覆蓋率
Tracing:抓取性能數(shù)據(jù)進行分析
Response: 頁面收到的響應
Request: 頁面發(fā)出的請求

Puppeteer-Recoder

  • 可以直接記錄與瀏覽器進行交互,生成Puppeteer腳本踩官。
  • 可以在chrome中添加插件直接使用
  • 缺點:無法記錄滾動操作
點擊record開始記錄 生成代碼可直接運行
image.png
image.png

一些簡單的例子

網頁截圖功能

const puppeteer = require('puppeteer');

(async () => {
  // 生成browser實例
  const browser = await puppeteer.launch();  
  
  // 解析一個新的頁面却桶。頁面是在默認瀏覽器上下文創(chuàng)建的
  const page = await browser.newPage();
  
  // 設置網頁大小
  await page.setViewport({ width: 1000, height: 500 });
  
  // 跳轉到 https://example.com, 這里可以增加一些參數(shù)配置
  await page.goto('https://example.com');
  
  // 生成圖片
  await page.screenshot({path: 'example.png'});

  // 生成pdf
  await page.pdf({path: 'page.pdf'});

  await browser.close();
})();

如果想調出界面

const browserConfig = {
    headless: false 
};
const browser = await puppeteer.launch(browserConfig);

如果想截圖滾動元素

// 針對滾動元素截屏
async function scrollElementShot(page, selectorName, outputPath) {
    // 選中滾動元素
    const scrollableSectionEl = await page.waitForSelector(selectorName);
    
    // 獲取滾動元素參數(shù)
    const bounding_box = await scrollableSectionEl.boundingBox();

    await scrollableSectionEl.screenshot({
        path: outputPath,
        clip: bounding_box
    });
}

如果設置不同網絡狀態(tài)

// 一些網絡狀態(tài)
const NETWORK_PRESETS = {
    // 所有速度 / 8 是因為網絡速度通常以比特/秒,而 DevTools 預計吞吐量在字節(jié)/秒! (1字節(jié) = 8比特)
    GPRS: {
        offline: false, // 是否連接
        downloadThroughput: (50 * 1024) / 8, // 模擬下載速度
        uploadThroughput: (20 * 1024) / 8,  // 模擬上傳速度 
        latency: 500 // 模擬延遲(毫秒)
    },
    Regular2G: {
        offline: false,
        downloadThroughput: (250 * 1024) / 8,
        uploadThroughput: (50 * 1024) / 8,
        latency: 300
    },
};

async function setNet(network, page) {
    // 添加網絡環(huán)境
    if (network !== 'default') {
        // Connect to Chrome DevTools
        await page._client.send('Network.emulateNetworkConditions', NETWORK_PRESETS[network]);
    }
}

const page = await browser.newPage();
// 添加網絡環(huán)境
// Connect to Chrome DevTools
await page._client.send('Network.emulateNetworkConditions', NETWORK_PRESETS['GPRS']);

如果設置不同GPUThrottling

await page._client.send('Emulation.setCPUThrottlingRate', { rate: 4 });

一些時間節(jié)點判斷API

// 等待3s
await page.waitForTimeout(3000);

// 等待某個元素出現(xiàn)
await page.waitForSelector('div > .m-tabwrap');

// 等待某個條件項
await page.waitForFunction('window.innerWidth < 100');

性能分析相關API

  • tracing,生成的json文件可直接拖入ChromeDevTools的performance面板中查看
await page.tracing.start({path: 'trace.json', screenshots: true});
await page.click('div > .m-tabwrap > .m-tab > li:nth-child(3) > a');
await page.waitForTimeout(3000);
await page.screenshot({
    path: 'demo1.png'
});
await page.tracing.stop();
  • 通過 page.getMetrics() 可以得到一些頁面性能數(shù)據(jù)
const metrics = await page.metrics();

<!--Timestamp The timestamp when the metrics sample was taken.-->
<!--Documents 頁面文檔數(shù)-->
<!--Frames 頁面 frame 數(shù)-->
<!--JSEventListeners 頁面內事件監(jiān)聽器數(shù)-->
<!--Nodes 頁面 DOM 節(jié)點數(shù)-->
<!--LayoutCount 頁面 layout 數(shù)-->
<!--RecalcStyleCount 樣式重算數(shù)-->
<!--LayoutDuration 頁面 layout 時間-->
<!--RecalcStyleDuration 樣式重算時長-->
<!--ScriptDuration script 時間-->
<!--TaskDuration 所有瀏覽器任務時長-->
<!--JSHeapUsedSize JavaScript 占用堆大小-->
<!--JSHeapTotalSize JavaScript 堆總量-->

更多

更多示例可參考官方示例庫

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蔗牡,一起剝皮案震驚了整個濱河市颖系,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辩越,老刑警劉巖嘁扼,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異黔攒,居然都是意外死亡趁啸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門督惰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來不傅,“玉大人,你說我怎么就攤上這事赏胚「蚯” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵栅哀,是天一觀的道長震肮。 經常有香客問我,道長留拾,這世上最難降的妖魔是什么戳晌? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮痴柔,結果婚禮上沦偎,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好豪嚎,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布搔驼。 她就那樣靜靜地躺著,像睡著了一般侈询。 火紅的嫁衣襯著肌膚如雪舌涨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天扔字,我揣著相機與錄音囊嘉,去河邊找鬼。 笑死革为,一個胖子當著我的面吹牛扭粱,可吹牛的內容都是我干的。 我是一名探鬼主播震檩,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼琢蛤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抛虏?” 一聲冷哼從身側響起虐块,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤史飞,失蹤者是張志新(化名)和其女友劉穎当凡,沒想到半個月后衫画,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叹洲,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡椭赋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年霍弹,在試婚紗的時候發(fā)現(xiàn)自己被綠了疮跑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胖喳。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡以清,死狀恐怖儿普,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情掷倔,我是刑警寧澤眉孩,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站勒葱,受9級特大地震影響浪汪,放射性物質發(fā)生泄漏。R本人自食惡果不足惜凛虽,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一死遭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凯旋,春花似錦呀潭、人聲如沸钉迷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糠聪。三九已至,卻和暖如春谐鼎,著一層夾襖步出監(jiān)牢的瞬間舰蟆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工该面, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留夭苗,地道東北人信卡。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓隔缀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親傍菇。 傳聞我的和親對象是個殘疾皇子猾瘸,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容