当前位置: 代码网 > it编程>编程语言>Javascript > Node.js使用Playwright自动化测试页面性能

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

2024年11月25日 Javascript 我要评论
概要对于现在的网站而言,性能的重要性不言而喻,每一家公司的网站都在追求更快地性能,更好地体验,但是,该怎么去找到影响网站速度的因素,如何优化性能,这是一个非常考验前端工程师技术功底的时刻。但其实,现代

概要

对于现在的网站而言,性能的重要性不言而喻,每一家公司的网站都在追求更快地性能,更好地体验,但是,该怎么去找到影响网站速度的因素,如何优化性能,这是一个非常考验前端工程师技术功底的时刻。

但其实,现代浏览器公开了许多的性能指标,这些指标可以帮我们快速确定需要改进的内容和改进方法,今天,我想和大家介绍一种方案,使用playwright自动化测试页面性能。

对 playwright 不了解的同学,可以移步我的上一篇文章了解: playwright使用指南

我们可以通过 playwright 查询浏览器提供的各种与性能相关的 api,然后识别导致网站速度变慢的原因。比如,chrome 浏览器提供了webvitals 指标,这些指标包括time to first byte (ttfb)total blocktime (tbt) first contentful paint (fcp),这是非常好的衡量用户体验的指标,很值得我们在测试中进行监控。

接下来,给大家介绍几种常见的衡量页面性能的方案。

导航和资源加载时间 api

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

1. performance 得分

我们可以使用playwright定期检查页面性能,确保网页的性能不低于你设置的某个特定标准。

例如下面的这段代码,我们可以使用 playwright 来自动化检测淘宝网的 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 提供了一种可以让我们获取页面特定资源加载时间的方法,方便我们衡量页面资源加载时间。

例如,我们可以使用下面这段代码来检查淘宝网首页的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()

})()

布局稳定性 api

这个api可以提供有关页面布局变化的信息,可以用来计算网页的 core web vital cumulative layout shift (cls) 数据

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(长任务) api

long task api 会返回一个javascript 执行列表,这些列表中的执行需要50毫秒才能完成,意味着阻塞了页面的ui线程,造成页面卡顿。我们可以用这个api来计算页面的总阻塞时间 total blocking time (tbt).

例如下面这段代码,我们使用了 performanceobserver 来计算出页面长任务时间超过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 来控制浏览器网速。

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自动化测试页面性能的详细内容,更多关于playwright测试页面性能的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com