基于puppeteer的前端性能測(cè)試解決方案

需求調(diào)研

最近有接手一個(gè)新項(xiàng)目需要獲取一系列的性能指標(biāo):建連時(shí)間? ssl握手時(shí)長(zhǎng) 首包時(shí)間? 首屏?xí)r間? 下載時(shí)長(zhǎng)? 下載總時(shí)間? 下載速率? 穆桂,需要模擬一系列的測(cè)試場(chǎng)景:需要對(duì)比1k,10k,100k,1m,10m,100m需要對(duì)比視頻流播放城豁,需要對(duì)比文件下載咪啡,需要對(duì)比多路重傳

手工測(cè)試方案:使用chrome的dev tool查看記錄數(shù)據(jù)

圖1


圖2
圖3

解決方案:

1狭魂、獲取性能指標(biāo):

使用window.performance.timing API

(https://developer.mozilla.org/zh-CN/docs/Web/API/PerformanceTiming)

圖4

PerformanceTiming.navigationStart 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)萍鲸,表征了從同一個(gè)瀏覽器上下文的上一個(gè)文檔卸載(unload)結(jié)束時(shí)的UNIX時(shí)間戳趟妥。如果沒有上一個(gè)文檔钝侠,這個(gè)值會(huì)和PerformanceTiming.fetchStart相同脱柱。

PerformanceTiming.unloadEventStart 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)伐弹,表征了unload事件拋出時(shí)的UNIX時(shí)間戳。如果沒有上一個(gè)文檔,or if the previous document, or one of the needed redirects, is not of the same origin, 這個(gè)值會(huì)返回0.

PerformanceTiming.unloadEventEnd 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)惨好,表征了unload事件處理完成時(shí)的UNIX時(shí)間戳煌茴。如果沒有上一個(gè)文檔,or if the previous document, or one of the needed redirects, is not of the same origin, 這個(gè)值會(huì)返回0.

PerformanceTiming.redirectStart 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)日川,表征了第一個(gè)HTTP重定向開始時(shí)的UNIX時(shí)間戳蔓腐。如果沒有重定向,或者重定向中的一個(gè)不同源龄句,這個(gè)值會(huì)返回0.

PerformanceTiming.redirectEnd 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)回论,表征了最后一個(gè)HTTP重定向完成時(shí)(也就是說是HTTP響應(yīng)的最后一個(gè)比特直接被收到的時(shí)間)的UNIX時(shí)間戳。如果沒有重定向分歇,或者重定向中的一個(gè)不同源傀蓉,這個(gè)值會(huì)返回0.

PerformanceTiming.fetchStart 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù),表征了瀏覽器準(zhǔn)備好使用HTTP請(qǐng)求來獲取(fetch)文檔的UNIX時(shí)間戳职抡。這個(gè)時(shí)間點(diǎn)會(huì)在檢查任何應(yīng)用緩存之前葬燎。

PerformanceTiming.domainLookupStart 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù),表征了域名查詢開始的UNIX時(shí)間戳缚甩。如果使用了持續(xù)連接(persistent connection)谱净,或者這個(gè)信息存儲(chǔ)到了緩存或者本地資源上,這個(gè)值將和 PerformanceTiming.fetchStart一致擅威。

PerformanceTiming.domainLookupEnd 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)壕探,表征了域名查詢結(jié)束的UNIX時(shí)間戳。如果使用了持續(xù)連接(persistent connection)郊丛,或者這個(gè)信息存儲(chǔ)到了緩存或者本地資源上浩蓉,這個(gè)值將和 PerformanceTiming.fetchStart一致。

PerformanceTiming.connectStart 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)宾袜,返回HTTP請(qǐng)求開始向服務(wù)器發(fā)送時(shí)的Unix毫秒時(shí)間戳捻艳。如果使用持久連接(persistent connection),則返回值等同于fetchStart屬性的值庆猫。

PerformanceTiming.connectEnd 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)认轨,返回瀏覽器與服務(wù)器之間的連接建立時(shí)的Unix毫秒時(shí)間戳。如果建立的是持久連接月培,則返回值等同于fetchStart屬性的值嘁字。連接建立指的是所有握手和認(rèn)證過程全部結(jié)束。

PerformanceTiming.secureConnectionStart 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)杉畜,返回瀏覽器與服務(wù)器開始安全鏈接的握手時(shí)的Unix毫秒時(shí)間戳纪蜒。如果當(dāng)前網(wǎng)頁不要求安全連接,則返回0此叠。

PerformanceTiming.requestStart 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)纯续,返回瀏覽器向服務(wù)器發(fā)出HTTP請(qǐng)求時(shí)(或開始讀取本地緩存時(shí))的Unix毫秒時(shí)間戳。

PerformanceTiming.responseStart 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù),返回瀏覽器從服務(wù)器收到(或從本地緩存讀肉怼)第一個(gè)字節(jié)時(shí)的Unix毫秒時(shí)間戳窗看。如果傳輸層在開始請(qǐng)求之后失敗并且連接被重開,該屬性將會(huì)被數(shù)制成新的請(qǐng)求的相對(duì)應(yīng)的發(fā)起時(shí)間倦炒。

PerformanceTiming.responseEnd 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)显沈,返回瀏覽器從服務(wù)器收到(或從本地緩存讀取,或從本地資源讀确昊健)最后一個(gè)字節(jié)時(shí)(如果在此之前HTTP連接已經(jīng)關(guān)閉拉讯,則返回關(guān)閉時(shí))的Unix毫秒時(shí)間戳。

PerformanceTiming.domLoading 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)鳖藕,返回當(dāng)前網(wǎng)頁DOM結(jié)構(gòu)開始解析時(shí)(即Document.readyState屬性變?yōu)椤發(fā)oading”遂唧、相應(yīng)的 readystatechange事件觸發(fā)時(shí))的Unix毫秒時(shí)間戳。

PerformanceTiming.domInteractive 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)吊奢,返回當(dāng)前網(wǎng)頁DOM結(jié)構(gòu)結(jié)束解析盖彭、開始加載內(nèi)嵌資源時(shí)(即Document.readyState屬性變?yōu)椤癷nteractive”、相應(yīng)的readystatechange事件觸發(fā)時(shí))的Unix毫秒時(shí)間戳页滚。

PerformanceTiming.domContentLoadedEventStart 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)召边,返回當(dāng)解析器發(fā)送DOMContentLoaded 事件,即所有需要被執(zhí)行的腳本已經(jīng)被解析時(shí)的Unix毫秒時(shí)間戳裹驰。

PerformanceTiming.domContentLoadedEventEnd 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù)隧熙,返回當(dāng)所有需要立即執(zhí)行的腳本已經(jīng)被執(zhí)行(不論執(zhí)行順序)時(shí)的Unix毫秒時(shí)間戳。

PerformanceTiming.domComplete 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù),返回當(dāng)前文檔解析完成,即Document.readyState 變?yōu)?'complete'且相對(duì)應(yīng)的``readystatechange 被觸發(fā)時(shí)的Unix毫秒時(shí)間戳油宜。

PerformanceTiming.loadEventStart 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù),返回該文檔下躏敢,load事件被發(fā)送時(shí)的Unix毫秒時(shí)間戳。如果這個(gè)事件還未被發(fā)送整葡,它的值將會(huì)是0件余。

PerformanceTiming.loadEventEnd 只讀

是一個(gè)無符號(hào)long long 型的毫秒數(shù),返回當(dāng)load事件結(jié)束遭居,即加載事件完成時(shí)的Unix毫秒時(shí)間戳啼器。如果這個(gè)事件還未被發(fā)送,或者尚未完成俱萍,它的值將會(huì)是0.

自動(dòng)化:puppeteer支持chrome devtool protocol獲取協(xié)議名稱

(https://chromedevtools.github.io/devtools-protocol/)

圖5

調(diào)用過程

圖6

使用tracing api獲取性能指標(biāo)

開啟端壳,關(guān)閉tracing:

圖7

解析tracing:

圖8

2、性能數(shù)據(jù)入庫

nodejs+sqlite3方案;

圖9

數(shù)據(jù):

圖10

3枪蘑、可視化展示

Django+layui+echarts

圖11

使用puppteer測(cè)試框架损谦,基于它對(duì)chrome的良好支持岖免,可以把很多chrome調(diào)試的手工工作實(shí)現(xiàn)自動(dòng)化,大家對(duì)puppeteer有什么妙用呢成翩?歡迎回復(fù)和討論!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赦役,一起剝皮案震驚了整個(gè)濱河市麻敌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掂摔,老刑警劉巖术羔,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乙漓,居然都是意外死亡级历,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門叭披,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寥殖,“玉大人,你說我怎么就攤上這事涩蜘〗拦保” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵同诫,是天一觀的道長(zhǎng)粤策。 經(jīng)常有香客問我,道長(zhǎng)误窖,這世上最難降的妖魔是什么叮盘? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮霹俺,結(jié)果婚禮上柔吼,老公的妹妹穿的比我還像新娘。我一直安慰自己丙唧,他們只是感情好嚷堡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艇棕,像睡著了一般蝌戒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沼琉,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天北苟,我揣著相機(jī)與錄音,去河邊找鬼打瘪。 笑死友鼻,一個(gè)胖子當(dāng)著我的面吹牛傻昙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彩扔,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼妆档,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了虫碉?” 一聲冷哼從身側(cè)響起贾惦,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敦捧,沒想到半個(gè)月后须板,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兢卵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年习瑰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秽荤。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甜奄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窃款,到底是詐尸還是另有隱情贺嫂,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布雁乡,位于F島的核電站第喳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏踱稍。R本人自食惡果不足惜曲饱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望珠月。 院中可真熱鬧扩淀,春花似錦、人聲如沸啤挎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庆聘。三九已至胜臊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伙判,已是汗流浹背象对。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宴抚,地道東北人勒魔。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓甫煞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親冠绢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抚吠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,954評(píng)論 6 13
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,744評(píng)論 0 10
  • 參考基礎(chǔ)教程的整理弟胀,方便記憶 一楷力、Object對(duì)象 (O大寫) 所有其他對(duì)象都繼承自這個(gè)對(duì)象。Object本身也是...
    Viaphlyn閱讀 2,320評(píng)論 0 0
  • 原文 http://renyuzhuo.cn/rgithub 說明 RGitHub 是一個(gè) GitHub 客戶端邮利,...
    我是任玉琢閱讀 583評(píng)論 0 1
  • 前不久母親告訴我弥雹,家里的煙筒差點(diǎn)被拆了垃帅。村子里最近都在打掃衛(wèi)生延届,挨家挨戶檢查,若是院子外有草垛贸诚,也會(huì)被要求全部拉到...
    陪月亮摘星星閱讀 591評(píng)論 4 13