最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js使用Playwright自動化測試頁面性能

 更新時間:2024年11月20日 11:24:26   作者:前端安迪  
對于現(xiàn)在的網(wǎng)站而言,性能的重要性不言而喻,本文將使用Playwright自動化測試頁面性能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

概要

對于現(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)文章!

相關(guān)文章

  • Node實(shí)現(xiàn)搜索框進(jìn)行模糊查詢

    Node實(shí)現(xiàn)搜索框進(jìn)行模糊查詢

    這篇文章主要為大家詳細(xì)介紹了Node實(shí)現(xiàn)搜索框進(jìn)行模糊查詢,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 基于 Node.js 實(shí)現(xiàn)前后端分離

    基于 Node.js 實(shí)現(xiàn)前后端分離

    為了解決傳統(tǒng)Web開發(fā)模式帶來的各種問題,我們進(jìn)行了許多嘗試,但由于前/后端的物理鴻溝,嘗試的方案都大同小異。痛定思痛,今天我們重新思考了“前后端”的定義,引入前端同學(xué)都熟悉的NodeJS,試圖探索一條全新的前后端分離模式。
    2016-04-04
  • express啟用https使用小記

    express啟用https使用小記

    這篇文章主要介紹了express啟用https使用小記,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • VsCode與Node.js知識點(diǎn)詳解

    VsCode與Node.js知識點(diǎn)詳解

    在本篇文章中小編給大家分享了關(guān)于VsCode與Node.js的相關(guān)知識點(diǎn)以及安裝等內(nèi)容,需要的朋友們可以參考下。
    2019-09-09
  • Node.js中的文件系統(tǒng)(file system)模塊詳解

    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)用的方法

    這篇文章主要介紹了使用NestJS開發(fā)Node.js應(yīng)用的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Express框架定制路由實(shí)例分析

    Express框架定制路由實(shí)例分析

    這篇文章主要介紹了Express定制路由,結(jié)合實(shí)例形式分析了express框架定制路由原理、用法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2023-05-05
  • nvm如何切換與管理node版本

    nvm如何切換與管理node版本

    這篇文章主要介紹了nvm如何切換與管理node版本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • ajax+node+request爬取網(wǎng)絡(luò)圖片的實(shí)例(宅男福利)

    ajax+node+request爬取網(wǎng)絡(luò)圖片的實(shí)例(宅男福利)

    下面小編就為大家?guī)硪黄猘jax+node+request爬取網(wǎng)絡(luò)圖片的實(shí)例(宅男福利)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 我的Node.js學(xué)習(xí)之路(一)

    我的Node.js學(xué)習(xí)之路(一)

    這是一篇專門Node.js初學(xué)者學(xué)習(xí)筆記。該筆記將通過具體實(shí)例,教你一步步開始Node.js之旅。
    2014-07-07

最新評論

韶山市| 日土县| 迁安市| 社会| 那曲县| 金溪县| 天柱县| 洮南市| 宜阳县| 抚州市| 盐边县| 赤城县| 宁城县| 台东市| 多伦县| 阜宁县| 南开区| 莎车县| 青铜峡市| 屏南县| 义乌市| 灵丘县| 永宁县| 施秉县| 茶陵县| 长宁区| 乡城县| 沭阳县| 云龙县| 大悟县| 西乌珠穆沁旗| 渑池县| 潞城市| 武隆县| 安溪县| 西昌市| 江华| 新乡市| 德保县| 巴楚县| 临洮县|