翼度科技»论坛 编程开发 JavaScript 查看内容

Node.js使用Playwright自动化测试页面性能

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
概要

对于现在的网站而言,性能的重要性不言而喻,每一家公司的网站都在追求更快地性能,更好地体验,但是,该怎么去找到影响网站速度的因素,如何优化性能,这是一个非常考验前端工程师技术功底的时刻。
但其实,现代浏览器公开了许多的性能指标,这些指标可以帮我们快速确定需要改进的内容和改进方法,今天,我想和大家介绍一种方案,使用Playwright自动化测试页面性能。
对 Playwright 不了解的同学,可以移步我的上一篇文章了解: Playwright使用指南
我们可以通过 Playwright 查询浏览器提供的各种与性能相关的 API,然后识别导致网站速度变慢的原因。比如,Chrome 浏览器提供了WebVitals 指标,这些指标包括
  1. Time to First Byte (TTFB)
复制代码
  1. Total BlockTime (TBT)
复制代码
  1. First Contentful Paint (FCP)
复制代码
,这是非常好的衡量用户体验的指标,很值得我们在测试中进行监控。
接下来,给大家介绍几种常见的衡量页面性能的方案。

导航和资源加载时间 API

这个API允许你检索和页面加载时间相关的所有事件的时间,比如
  1. domComplete time
复制代码
,
  1. duration
复制代码
  1. connectEnd
复制代码
。我们可以在测试过程中使用这些指标来检测网页性能情况。

1. Performance 得分

我们可以使用Playwright定期检查页面性能,确保网页的性能不低于你设置的某个特定标准。
例如下面的这段代码,我们可以使用 Playwright 来自动化检测淘宝网的
  1. domComplete
复制代码
时间,如果它低于某一个阈值,然后会提醒我们测试用例失败,这样我们就可以及时去对页面做性能回归。
  1. import { chromium } from 'playwright';

  2. (async () => {
  3.   const browser = await chromium.launch({
  4.     headless: true,
  5.   });
  6.   const context = await browser.newContext()
  7.   const page = await context.newPage()

  8.   await page.goto('https://www.taobao.com/');
  9.   
  10.   const navigationTimingJson = await page.evaluate(() =>
  11.     JSON.stringify(performance.getEntriesByType('navigation'))
  12.   )
  13.   const navigationTiming = JSON.parse(navigationTimingJson)

  14.   if (navigationTiming.domComplete < 2000) {
  15.     console.error('ERROR: domComplete below 2 seconds')
  16.   }

  17.   await browser.close()
  18. })()
复制代码
2. 资源加载时间 API

这个API 提供了一种可以让我们获取页面特定资源加载时间的方法,方便我们衡量页面资源加载时间。
例如,我们可以使用下面这段代码来检查淘宝网首页的
  1. webp
复制代码
格式图片的加载时间。
  1. import { chromium } from 'playwright';

  2. (async () => {
  3.   const browser = await chromium.launch({
  4.     headless: true,
  5.   });
  6.   const context = await browser.newContext()
  7.   const page = await context.newPage()

  8.   await page.goto('https://www.taobao.com/');
  9.   
  10.   const resourceTimingJson = await page.evaluate(() =>
  11.     JSON.stringify(window.performance.getEntriesByType('resource'))
  12.   )

  13.   const resourceTiming = JSON.parse(resourceTimingJson)
  14.   const logoResourceTiming = resourceTiming.find((element) =>
  15.     element.name.includes('.webp')
  16.   )

  17.   console.log(logoResourceTiming)

  18.   await browser.close()
  19. })()
复制代码
页面绘制时间 API

我们可以使用页面绘制时间 API 来检索页面
  1. First Paint (FP)
复制代码
  1. First Contentful Paint (FCP)
复制代码
的时间。
  1. import { chromium } from 'playwright';

  2. (async () => {
  3.   const browser = await chromium.launch({
  4.     headless: true,
  5.   });

  6.   const context = await browser.newContext()
  7.   const page = await context.newPage()

  8.   await page.goto('https://www.taobao.com/');
  9.   
  10.   const paintTimingJson = await page.evaluate(() =>
  11.     JSON.stringify(window.performance.getEntriesByType('paint'))
  12.   )
  13.   const paintTiming = JSON.parse(paintTimingJson)

  14.   console.log(paintTiming)

  15.   await browser.close()

  16. })()
复制代码
布局稳定性 API

这个API可以提供有关页面布局变化的信息,可以用来计算网页的
  1. Core Web Vital Cumulative Layout Shift (CLS)
复制代码
数据
  1. import { chromium } from 'playwright';

  2. (async () => {
  3.   const browser = await chromium.launch({
  4.     headless: true,
  5.   });

  6.   const context = await browser.newContext()
  7.   const page = await context.newPage()

  8.   await page.goto('https://www.taobao.com/');
  9.   
  10.   const cummulativeLayoutShift = await page.evaluate(() => {
  11.     return new Promise((resolve) => {
  12.       let CLS = 0

  13.       new PerformanceObserver((l) => {
  14.         const entries = l.getEntries()

  15.         entries.forEach(entry => {
  16.           if (!entry.hadRecentInput) {
  17.             CLS += entry.value
  18.           }
  19.         })

  20.         resolve(CLS)
  21.       }).observe({
  22.         type: 'layout-shift',
  23.         buffered: true
  24.       })
  25.     })
  26.   })

  27.   console.log(parseFloat(cummulativeLayoutShift))

  28.   await browser.close()

  29. })()
复制代码
Long Task(长任务) API

Long Task API 会返回一个Javascript 执行列表,这些列表中的执行需要50毫秒才能完成,意味着阻塞了页面的UI线程,造成页面卡顿。我们可以用这个API来计算页面的总阻塞时间 Total Blocking Time (TBT).
例如下面这段代码,我们使用了
  1. PerformanceObserver
复制代码
来计算出页面长任务时间超过50毫秒的时间之和。
  1. import { chromium } from 'playwright';

  2. (async () => {
  3.   const browser = await chromium.launch({
  4.     headless: true,
  5.   });

  6.   const context = await browser.newContext()
  7.   const page = await context.newPage()

  8.   await page.goto('https://www.taobao.com/');
  9.   

  10.   const totalBlockingTime = await page.evaluate(() => {
  11.     return new Promise((resolve) => {
  12.       let totalBlockingTime = 0
  13.       new PerformanceObserver(function (list) {
  14.         const perfEntries = list.getEntries()
  15.         for (const perfEntry of perfEntries) {
  16.           totalBlockingTime += perfEntry.duration - 50
  17.         }
  18.         resolve(totalBlockingTime)
  19.       }).observe({ type: 'longtask', buffered: true })

  20.       // Resolve promise if there haven't been any long tasks
  21.       setTimeout(() => resolve(totalBlockingTime), 5000)
  22.     })
  23.   })

  24.   console.log(parseFloat(totalBlockingTime))

  25.   await browser.close()

  26. })()
复制代码
Chrome DevTools Performance

Chrome DevTools 提供了很多非常有用的功能,我们可以充分利用起来。例如,我们可以使用
  1. Network.emulateNetworkConditions
复制代码
来控制浏览器网速。
  1. import { chromium } from 'playwright';

  2. (async () => {
  3.   const browser = await chromium.launch({
  4.     headless: true,
  5.   });

  6.   const context = await browser.newContext()
  7.   const page = await context.newPage()

  8.   await page.goto('https://www.taobao.com/');
  9.   
  10.   const context = await browser.newContext()
  11.   const page = await context.newPage()

  12.   await client.send('Network.enable')
  13.   await client.send('Network.emulateNetworkConditions', {
  14.     offline: false,
  15.     downloadThroughput: (5 * 1024 * 1024) / 8,
  16.     uploadThroughput: (4 * 1024 * 1024) / 8,
  17.     latency: 30
  18.   )

  19.   await page.goto('https://testingbot.com/');
  20.   await browser.close()


  21. })()
复制代码
以上就是Node.js使用Playwright自动化测试页面性能的详细内容,更多关于Playwright测试页面性能的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/javascript/331060i6d.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具