Node.js使用Playwright自動化測試頁面性能
概要
對于現(xiàn)在的網(wǎng)站而言,性能的重要性不言而喻,每一家公司的網(wǎng)站都在追求更快地性能,更好地體驗(yàn),但是,該怎么去找到影響網(wǎng)站速度的因素,如何優(yōu)化性能,這是一個非常考驗(yàn)前端工程師技術(shù)功底的時刻。
但其實(shí),現(xiàn)代瀏覽器公開了許多的性能指標(biāo),這些指標(biāo)可以幫我們快速確定需要改進(jìn)的內(nèi)容和改進(jìn)方法,今天,我想和大家介紹一種方案,使用Playwright自動化測試頁面性能。
對 Playwright 不了解的同學(xué),可以移步我的上一篇文章了解: Playwright使用指南
我們可以通過 Playwright 查詢?yōu)g覽器提供的各種與性能相關(guān)的 API,然后識別導(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),很值得我們在測試中進(jìn)行監(jiān)控。
接下來,給大家介紹幾種常見的衡量頁面性能的方案。
導(dǎo)航和資源加載時間 API
這個API允許你檢索和頁面加載時間相關(guān)的所有事件的時間,比如domComplete time , duration 和 connectEnd。我們可以在測試過程中使用這些指標(biāo)來檢測網(wǎng)頁性能情況。
1. Performance 得分
我們可以使用Playwright定期檢查頁面性能,確保網(wǎng)頁的性能不低于你設(shè)置的某個特定標(biāo)準(zhǔn)。
例如下面的這段代碼,我們可以使用 Playwright 來自動化檢測淘寶網(wǎng)的 domComplete 時間,如果它低于某一個閾值,然后會提醒我們測試用例失敗,這樣我們就可以及時去對頁面做性能回歸。
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. 資源加載時間 API
這個API 提供了一種可以讓我們獲取頁面特定資源加載時間的方法,方便我們衡量頁面資源加載時間。
例如,我們可以使用下面這段代碼來檢查淘寶網(wǎng)首頁的webp格式圖片的加載時間。
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()
})()
頁面繪制時間 API
我們可以使用頁面繪制時間 API 來檢索頁面 First Paint (FP)和 First Contentful Paint (FCP)的時間。
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
這個API可以提供有關(guān)頁面布局變化的信息,可以用來計(jì)算網(wǎng)頁的 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(長任務(wù)) API
Long Task API 會返回一個Javascript 執(zhí)行列表,這些列表中的執(zhí)行需要50毫秒才能完成,意味著阻塞了頁面的UI線程,造成頁面卡頓。我們可以用這個API來計(jì)算頁面的總阻塞時間 Total Blocking Time (TBT).
例如下面這段代碼,我們使用了 PerformanceObserver 來計(jì)算出頁面長任務(wù)時間超過50毫秒的時間之和。
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 提供了很多非常有用的功能,我們可以充分利用起來。例如,我們可以使用Network.emulateNetworkConditions 來控制瀏覽器網(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自動化測試頁面性能的詳細(xì)內(nèi)容,更多關(guān)于Playwright測試頁面性能的資料請關(guān)注腳本之家其它相關(guān)文章!
- Python使用Playwright進(jìn)行API接口測試
- 基于Python Playwright進(jìn)行前端性能測試的腳本實(shí)現(xiàn)
- Playwright中Web自動化測試的實(shí)現(xiàn)
- Python中Playwright模塊進(jìn)行自動化測試的實(shí)現(xiàn)
- 使用Python中的Playwright制作測試視頻的實(shí)現(xiàn)步驟
- 一款強(qiáng)大的端到端測試工具Playwright介紹
- 如何使用Playwright對Java API實(shí)現(xiàn)自動視覺測試
- 使用Playwright進(jìn)行移動端模擬測試的實(shí)現(xiàn)
相關(guān)文章
Node實(shí)現(xiàn)搜索框進(jìn)行模糊查詢
這篇文章主要為大家詳細(xì)介紹了Node實(shí)現(xiàn)搜索框進(jìn)行模糊查詢,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06
Node.js中的文件系統(tǒng)(file system)模塊詳解
Node.js文件系統(tǒng)模塊提供了豐富的方法,用于讀取、寫入、操作文件和目錄,文件系統(tǒng)模塊是Node.js強(qiáng)大而靈活的一部分,為文件操作提供了方便的API,本文給大家介紹Node.js中的文件系統(tǒng)(file system)模塊,感興趣的朋友一起看看吧2023-11-11
使用NestJS開發(fā)Node.js應(yīng)用的方法
這篇文章主要介紹了使用NestJS開發(fā)Node.js應(yīng)用的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
ajax+node+request爬取網(wǎng)絡(luò)圖片的實(shí)例(宅男福利)
下面小編就為大家?guī)硪黄猘jax+node+request爬取網(wǎng)絡(luò)圖片的實(shí)例(宅男福利)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08

