Node.js使用Playwright自動(dòng)化測(cè)試頁(yè)面性能
概要
對(duì)于現(xiàn)在的網(wǎng)站而言,性能的重要性不言而喻,每一家公司的網(wǎng)站都在追求更快地性能,更好地體驗(yàn),但是,該怎么去找到影響網(wǎng)站速度的因素,如何優(yōu)化性能,這是一個(gè)非??简?yàn)前端工程師技術(shù)功底的時(shí)刻。
但其實(shí),現(xiàn)代瀏覽器公開了許多的性能指標(biāo),這些指標(biāo)可以幫我們快速確定需要改進(jìn)的內(nèi)容和改進(jìn)方法,今天,我想和大家介紹一種方案,使用Playwright自動(dòng)化測(cè)試頁(yè)面性能。
對(duì) Playwright 不了解的同學(xué),可以移步我的上一篇文章了解: Playwright使用指南
我們可以通過(guò) Playwright 查詢?yōu)g覽器提供的各種與性能相關(guān)的 API,然后識(shí)別導(dǎo)致網(wǎng)站速度變慢的原因。比如,Chrome 瀏覽器提供了WebVitals 指標(biāo),這些指標(biāo)包括Time to First Byte (TTFB)
、 Total BlockTime (TBT)
和 First Contentful Paint (FCP)
,這是非常好的衡量用戶體驗(yàn)的指標(biāo),很值得我們?cè)跍y(cè)試中進(jìn)行監(jiān)控。
接下來(lái),給大家介紹幾種常見(jiàn)的衡量頁(yè)面性能的方案。
導(dǎo)航和資源加載時(shí)間 API
這個(gè)API允許你檢索和頁(yè)面加載時(shí)間相關(guān)的所有事件的時(shí)間,比如domComplete time
, duration
和 connectEnd
。我們可以在測(cè)試過(guò)程中使用這些指標(biāo)來(lái)檢測(cè)網(wǎng)頁(yè)性能情況。
1. Performance 得分
我們可以使用Playwright定期檢查頁(yè)面性能,確保網(wǎng)頁(yè)的性能不低于你設(shè)置的某個(gè)特定標(biāo)準(zhǔn)。
例如下面的這段代碼,我們可以使用 Playwright 來(lái)自動(dòng)化檢測(cè)淘寶網(wǎng)的 domComplete
時(shí)間,如果它低于某一個(gè)閾值,然后會(huì)提醒我們測(cè)試用例失敗,這樣我們就可以及時(shí)去對(duì)頁(yè)面做性能回歸。
import { chromium } from 'playwright'; (async () => { const browser = await chromium.launch({ headless: true, }); const context = await browser.newContext() const page = await context.newPage() await page.goto('https://www.taobao.com/'); const navigationTimingJson = await page.evaluate(() => JSON.stringify(performance.getEntriesByType('navigation')) ) const navigationTiming = JSON.parse(navigationTimingJson) if (navigationTiming.domComplete < 2000) { console.error('ERROR: domComplete below 2 seconds') } await browser.close() })()
2. 資源加載時(shí)間 API
這個(gè)API 提供了一種可以讓我們獲取頁(yè)面特定資源加載時(shí)間的方法,方便我們衡量頁(yè)面資源加載時(shí)間。
例如,我們可以使用下面這段代碼來(lái)檢查淘寶網(wǎng)首頁(yè)的webp
格式圖片的加載時(shí)間。
import { chromium } from 'playwright'; (async () => { const browser = await chromium.launch({ headless: true, }); const context = await browser.newContext() const page = await context.newPage() await page.goto('https://www.taobao.com/'); const resourceTimingJson = await page.evaluate(() => JSON.stringify(window.performance.getEntriesByType('resource')) ) const resourceTiming = JSON.parse(resourceTimingJson) const logoResourceTiming = resourceTiming.find((element) => element.name.includes('.webp') ) console.log(logoResourceTiming) await browser.close() })()
頁(yè)面繪制時(shí)間 API
我們可以使用頁(yè)面繪制時(shí)間 API 來(lái)檢索頁(yè)面 First Paint (FP)
和 First Contentful Paint (FCP)
的時(shí)間。
import { chromium } from 'playwright'; (async () => { const browser = await chromium.launch({ headless: true, }); const context = await browser.newContext() const page = await context.newPage() await page.goto('https://www.taobao.com/'); const paintTimingJson = await page.evaluate(() => JSON.stringify(window.performance.getEntriesByType('paint')) ) const paintTiming = JSON.parse(paintTimingJson) console.log(paintTiming) await browser.close() })()
布局穩(wěn)定性 API
這個(gè)API可以提供有關(guān)頁(yè)面布局變化的信息,可以用來(lái)計(jì)算網(wǎng)頁(yè)的 Core Web Vital Cumulative Layout Shift (CLS)
數(shù)據(jù)
import { chromium } from 'playwright'; (async () => { const browser = await chromium.launch({ headless: true, }); const context = await browser.newContext() const page = await context.newPage() await page.goto('https://www.taobao.com/'); const cummulativeLayoutShift = await page.evaluate(() => { return new Promise((resolve) => { let CLS = 0 new PerformanceObserver((l) => { const entries = l.getEntries() entries.forEach(entry => { if (!entry.hadRecentInput) { CLS += entry.value } }) resolve(CLS) }).observe({ type: 'layout-shift', buffered: true }) }) }) console.log(parseFloat(cummulativeLayoutShift)) await browser.close() })()
Long Task(長(zhǎng)任務(wù)) API
Long Task API 會(huì)返回一個(gè)Javascript 執(zhí)行列表,這些列表中的執(zhí)行需要50毫秒才能完成,意味著阻塞了頁(yè)面的UI線程,造成頁(yè)面卡頓。我們可以用這個(gè)API來(lái)計(jì)算頁(yè)面的總阻塞時(shí)間 Total Blocking Time (TBT).
例如下面這段代碼,我們使用了 PerformanceObserver
來(lái)計(jì)算出頁(yè)面長(zhǎng)任務(wù)時(shí)間超過(guò)50毫秒的時(shí)間之和。
import { chromium } from 'playwright'; (async () => { const browser = await chromium.launch({ headless: true, }); const context = await browser.newContext() const page = await context.newPage() await page.goto('https://www.taobao.com/'); const totalBlockingTime = await page.evaluate(() => { return new Promise((resolve) => { let totalBlockingTime = 0 new PerformanceObserver(function (list) { const perfEntries = list.getEntries() for (const perfEntry of perfEntries) { totalBlockingTime += perfEntry.duration - 50 } resolve(totalBlockingTime) }).observe({ type: 'longtask', buffered: true }) // Resolve promise if there haven't been any long tasks setTimeout(() => resolve(totalBlockingTime), 5000) }) }) console.log(parseFloat(totalBlockingTime)) await browser.close() })()
Chrome DevTools Performance
Chrome DevTools 提供了很多非常有用的功能,我們可以充分利用起來(lái)。例如,我們可以使用Network.emulateNetworkConditions
來(lái)控制瀏覽器網(wǎng)速。
import { chromium } from 'playwright'; (async () => { const browser = await chromium.launch({ headless: true, }); const context = await browser.newContext() const page = await context.newPage() await page.goto('https://www.taobao.com/'); const context = await browser.newContext() const page = await context.newPage() await client.send('Network.enable') await client.send('Network.emulateNetworkConditions', { offline: false, downloadThroughput: (5 * 1024 * 1024) / 8, uploadThroughput: (4 * 1024 * 1024) / 8, latency: 30 ) await page.goto('https://testingbot.com/'); await browser.close() })()
以上就是Node.js使用Playwright自動(dòng)化測(cè)試頁(yè)面性能的詳細(xì)內(nèi)容,更多關(guān)于Playwright測(cè)試頁(yè)面性能的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python自動(dòng)化神器Playwright的用法詳解
- Java?Playwright實(shí)現(xiàn)瀏覽器最大化
- Node.js中Playwright庫(kù)使用指南
- Python?Playwright進(jìn)行常見(jiàn)的頁(yè)面交互操作
- 深入理解Playwright的高級(jí)功能和用法
- Playwright中Web自動(dòng)化測(cè)試的實(shí)現(xiàn)
- Python中Playwright模塊進(jìn)行自動(dòng)化測(cè)試的實(shí)現(xiàn)
- 使用Python中的Playwright制作測(cè)試視頻的實(shí)現(xiàn)步驟
- python+playwright 元素操作示例代碼
- 使用Playwright進(jìn)行視覺(jué)回歸測(cè)試詳解
- 使用Playwright模擬API的項(xiàng)目實(shí)踐
相關(guān)文章
Node.js中npx命令的使用方法及場(chǎng)景分析
NPM(Node Package Manager) 是Node.js提供的一個(gè)包管理器, 可以使用 NPM 來(lái)安裝 node.js 包 ,npm 是從5.2版開始, 增加(自帶)了 npx 命令,本文給大家分享Node.js npx命令使用,需要的朋友一起看看吧2021-08-08node.js抓取并分析網(wǎng)頁(yè)內(nèi)容有無(wú)特殊內(nèi)容的js文件
nodejs獲取網(wǎng)頁(yè)內(nèi)容綁定data事件,獲取到的數(shù)據(jù)會(huì)分幾次相應(yīng),如果想全局內(nèi)容匹配,需要等待請(qǐng)求結(jié)束,在end結(jié)束事件里把累積起來(lái)的全局?jǐn)?shù)據(jù)進(jìn)行操作,本文給大家介紹node.js抓取并分析網(wǎng)頁(yè)內(nèi)容有無(wú)特殊內(nèi)容的js文件,需要的朋友參考下2015-11-11使用node.js實(shí)現(xiàn)接口步驟詳細(xì)記錄
這篇文章主要給大家介紹了關(guān)于使用node.js實(shí)現(xiàn)接口步驟的相關(guān)資料,對(duì)于剛開始不會(huì)node寫接口和調(diào)用接口,可以通過(guò)這個(gè)清晰的初步了解到整個(gè)過(guò)程,下面需要的朋友可以參考下2023-03-03express框架中使用jwt實(shí)現(xiàn)驗(yàn)證的方法
這篇文章主要給大家介紹了關(guān)于express框架中使用jwt實(shí)現(xiàn)驗(yàn)證的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用express具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Win7系統(tǒng)只能安裝的nodejs13.14,如何安裝高版本nodejs
正常情況下,Win7支持的Node.js最高版本是V13.14,但在開發(fā)過(guò)程中,有不少Vue項(xiàng)目或其他需要依賴Node環(huán)境的項(xiàng)目,對(duì)Node版本要求都比較高,對(duì)此,我們要么重裝操作系統(tǒng)到Win8以上,要么就得想辦法在Win7中安裝高版本的Node,否則很多項(xiàng)目在編譯打包時(shí)可能會(huì)出現(xiàn)警告信息或失敗2024-11-11node操作mysql數(shù)據(jù)庫(kù)實(shí)例詳解
這篇文章主要介紹了node操作mysql數(shù)據(jù)庫(kù),結(jié)合實(shí)例形式較為詳細(xì)的分析了node操作數(shù)據(jù)庫(kù)的連接、增刪改查、事務(wù)處理及錯(cuò)誤處理相關(guān)操作技巧,需要的朋友可以參考下2017-03-03Nodejs獲取網(wǎng)絡(luò)數(shù)據(jù)并生成Excel表格
這篇文章主要為大家詳細(xì)介紹了Nodejs獲取網(wǎng)絡(luò)數(shù)據(jù)并生成Excel表格的具體實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05