You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Playwright在不同网络条件下开展Web Vitals的E2E性能检测

使用Playwright实现E2E测试中的Web Vitals检测与网络节流

一、配置网络节流(以慢3G为例)

Playwright支持通过setNetworkConditions方法模拟不同网络环境,慢3G的标准参数为下载3Mbps、上传1.5Mbps、延迟150ms,实际测试中建议乘以0.8的系数模拟真实网络损耗。

方式1:单测试用例内设置

import { test, expect } from '@playwright/test';

test('慢3G网络下的性能测试', async ({ page }) => {
  // 配置慢3G网络
  await page.context().setNetworkConditions({
    download: ((3 * 1024 * 1024) / 8) * 0.8, // 转换为字节/秒,约2.4Mbps
    upload: ((1.5 * 1024 * 1024) / 8) * 0.8, // 约1.2Mbps
    latency: 150, // 网络延迟150ms
  });

  await page.goto('https://你的目标页面.com');
  // 后续测试逻辑
});

方式2:全局配置(所有测试生效)

在playwright.config.ts中设置默认网络条件:

import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  use: {
    ...devices['Desktop Chrome'],
    networkConditions: {
      download: ((3 * 1024 * 1024) / 8) * 0.8,
      upload: ((1.5 * 1024 * 1024) / 8) * 0.8,
      latency: 150,
    },
  },
});

二、检测FCP、TTI等Web Vitals分数

1. 获取First Contentful Paint (FCP)

FCP属于浏览器paint类型的性能条目,可直接通过performance.getEntriesByType获取:

test('检测页面FCP指标', async ({ page }) => {
  await page.goto('https://你的目标页面.com', { waitUntil: 'load' });

  const fcp = await page.evaluate(() => {
    const paintEntries = performance.getEntriesByType('paint');
    const fcpEntry = paintEntries.find(entry => entry.name === 'first-contentful-paint');
    return fcpEntry ? fcpEntry.startTime : null;
  });

  console.log(`First Contentful Paint: ${fcp}ms`);
  // 断言FCP符合优秀标准(<2000ms)
  expect(fcp).toBeLessThan(2000);
});

2. 获取Time to Interactive (TTI)

TTI计算逻辑复杂,推荐使用官方web-vitals库来捕获:

步骤1:安装web-vitals

npm install web-vitals --save-dev

步骤2:在测试中注入并监听TTI

test('检测页面TTI指标', async ({ page }) => {
  // 注入本地web-vitals库
  await page.addScriptTag({ path: './node_modules/web-vitals/dist/web-vitals.umd.js' });

  let ttiValue: number | null = null;

  // 暴露回调函数接收TTI值
  await page.exposeFunction('onTTI', (value: number) => {
    ttiValue = value;
  });

  // 初始化TTI监听
  await page.evaluate(() => {
    // @ts-ignore
    webVitals.onTTI(metric => onTTI(metric.value));
  });

  await page.goto('https://你的目标页面.com', { waitUntil: 'networkidle' });
  // 额外等待确保TTI指标完成计算
  await page.waitForTimeout(1000);

  console.log(`Time to Interactive: ${ttiValue}ms`);
  // 断言TTI符合优秀标准(<3800ms)
  expect(ttiValue).toBeLessThan(3800);
});

3. 结合网络节流的完整测试示例

import { test, expect } from '@playwright/test';

test('慢3G下检测Web Vitals', async ({ page }) => {
  // 配置慢3G网络
  await page.context().setNetworkConditions({
    download: ((3 * 1024 * 1024) / 8) * 0.8,
    upload: ((1.5 * 1024 * 1024) / 8) * 0.8,
    latency: 150,
  });

  // 注入web-vitals库
  await page.addScriptTag({ path: './node_modules/web-vitals/dist/web-vitals.umd.js' });

  let fcpValue: number | null = null;
  let ttiValue: number | null = null;

  // 暴露回调函数接收指标
  await page.exposeFunction('onFCP', (value: number) => fcpValue = value);
  await page.exposeFunction('onTTI', (value: number) => ttiValue = value);

  // 初始化指标监听
  await page.evaluate(() => {
    // @ts-ignore
    webVitals.onFCP(metric => onFCP(metric.value));
    // @ts-ignore
    webVitals.onTTI(metric => onTTI(metric.value));
  });

  // 访问页面并等待网络空闲
  await page.goto('https://你的目标页面.com', { waitUntil: 'networkidle' });
  await page.waitForTimeout(1000);

  // 输出结果并断言
  console.log(`FCP: ${fcpValue}ms | TTI: ${ttiValue}ms`);
  expect(fcpValue).toBeLessThan(2000);
  expect(ttiValue).toBeLessThan(3800);
});

内容的提问来源于stack exchange,提问作者KnightCrawler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:45:29