WebPageTest logo

WebPageTest

业界最强大的 Web 性能深度测试平台,支持全球多节点、多设备、多浏览器的合成测试,提供瀑布图、电影条、Trace 等高级分析能力。

性能审计深度测试合成测试瀑布图

WebPageTest 是 Web 性能测试领域最全面的工具之一,通过全球部署的测试节点启动真实浏览器进行页面加载测试,提供瀑布图、电影条、Chrome Trace 等高级分析能力,填补了 Lighthouse 和 RUM 之间的空白。

WebPageTest

业界最强大的 Web 性能深度测试平台,支持全球多节点、多设备、多浏览器的合成测试,提供瀑布图、电影条、Trace 等高级分析能力。

技术简介说明

WebPageTest(WPT)是 Web 性能测试领域最全面、最强大的工具之一。它通过在全球部署的测试节点上启动真实浏览器(Chrome、Firefox、Safari、Edge),按照预设的网络条件和设备进行页面加载测试,生成极其详细的性能分析报告。其标志性功能包括瀑布图(Waterfall)、电影条(Filmstrip)可视化、Chrome Trace 分析、HTTP/2 和 HTTP/3 对比测试等。

WebPageTest 最初由 Pat Meenan 个人开发和维护,后被 Catchpoint 收购并整合进其 Internet Performance Monitoring(IPM)平台。2025 年 10 月,WebPageTest 完成了与 Catchpoint 平台的深度整合,从独立的开源测试工具演进为 Catchpoint 生态中的核心性能分析引擎,同时保留了免费公共实例(webpagetest.org)和开源自建私有实例的能力。

WPT 的独特价值在于它填补了 Lighthouse(本地单点合成测试)和 RUM(真实用户监控)之间的空白——它提供全球多节点、可控条件的合成测试,同时通过电影条、视频回放等可视化手段让性能问题"看得见"。对于需要深度诊断性能瓶颈、验证 CDN 配置、对比不同基础设施方案的专业团队,WebPageTest 是不可替代的工具。

基本信息

  • 官网https://www.webpagetest.org/
  • GitHubhttps://github.com/WPO-Foundation/webpagetest
  • License:MIT License(开源版本)/ 商业许可(Catchpoint 平台)
  • 最新版本:持续更新(Catchpoint 平台版本)
  • 主要维护者/公司:Catchpoint(2020 年收购)/ 原 WPO Foundation
  • 开源协议:Apache 2.0(旧版开源代码)
  • 测试节点:全球 25+ 公共测试位置

快速上手

安装

方式一:使用公共实例(推荐入门)

方式二:自建私有实例(Docker)

# 克隆仓库
git clone https://github.com/WPO-Foundation/webpagetest.git
cd webpagetest
 
# 使用 Docker Compose 启动
docker-compose up -d
 
# 访问 http://localhost:8888

方式三:npm API 客户端

# 官方 Node.js 客户端
npm install webpagetest
 
# 或使用 REST API 直接调用

基础配置

Web 界面基础配置

在 Web 界面中,可以配置以下核心参数:

参数说明默认值
URL测试目标 URL-
Location测试节点(地区)自动选择
Browser测试浏览器Chrome
Connection网络条件3G / Cable / DSL 等预设
Number of Tests测试次数3
First View only仅测试首次访问否(默认测试首次+重复访问)
Video启用电影条
Capture Dev Tools Trace捕获 Chrome Trace

预设网络条件

预设带宽(下行/上行)延迟丢包率
3G Slow400/400 Kbps400ms0%
3G1.6/768 Kbps300ms0%
4G9/9 Mbps170ms0%
Cable5/1 Mbps28ms0%
DSL1.5/384 Kbps50ms0%
FIOS20/5 Mbps4ms0%
Native无限制无限制

最小示例

REST API 调用

# 提交测试
curl "https://www.webpagetest.org/runtest.php?url=https://example.com&f=json&k=YOUR_API_KEY"
 
# 获取测试结果
curl "https://www.webpagetest.org/jsonResult.php?test=TEST_ID&k=YOUR_API_KEY"
 
# 获取测试页面
curl "https://www.webpagetest.org/results.php?test=TEST_ID"

Node.js API 客户端

import WebPageTest from 'webpagetest';
 
const wpt = new WebPageTest('www.webpagetest.org', 'YOUR_API_KEY');
 
// 基础测试
wpt.runTest('https://example.com', {
  location: 'Dulles:Chrome',
  connectivity: 'Cable',
  runs: 3,
  video: true,
}, (err, data) => {
  if (err) {
    console.error('Test failed:', err);
    return;
  }
 
  console.log('Test ID:', data.data.testId);
  console.log('Results URL:', data.data.summaryURL);
 
  // 获取详细结果
  wpt.getTestResults(data.data.testId, (err, results) => {
    if (err) {
      console.error('Failed to get results:', err);
      return;
    }
 
    const run = results.data.runs[1]; // 第一次运行
    console.log('First View:');
    console.log('  Load Time:', run.firstView.loadTime, 'ms');
    console.log('  Speed Index:', run.firstView.SpeedIndex);
    console.log('  TTFB:', run.firstView.TTFB, 'ms');
    console.log('  LCP:', run.firstView['lastViewedCell']?.largestContentfulPaint);
 
    if (run.repeatView) {
      console.log('Repeat View:');
      console.log('  Load Time:', run.repeatView.loadTime, 'ms');
      console.log('  Speed Index:', run.repeatView.SpeedIndex);
    }
  });
});

高级测试配置

// 自定义脚本测试(模拟登录等操作)
const script = `
  navigate  https://example.com/login
  setValue  name=username testuser
  setValue  name=password testpass
  submitForm  name=loginForm
  waitForComplete
  navigate  https://example.com/dashboard
`;
 
wpt.runTest(script, {
  location: 'Dulles:Chrome',
  connectivity: 'Cable',
  runs: 3,
  video: true,
  chromeOptions: {
    mobile: {
      deviceScreen: { width: 375, height: 667 },
      emulatedDevice: 'iPhone 6/7/8',
    },
  },
}, callback);

核心概念与架构

测试架构

WebPageTest 架构
│
├── Web 界面 / API
│   ├── 公共实例 (webpagetest.org)
│   └── 私有实例 (自建 Docker)
│
├── 测试调度器
│   ├── 选择测试节点
│   ├── 队列管理
│   └── 测试重试
│
├── 测试节点(Agent)
│   ├── 全球分布式节点
│   ├── Chrome / Firefox / Safari / Edge
│   ├── 网络条件模拟(tc / Dummynet)
│   └── 数据采集(HTTP Archive、Trace、截图)
│
└── 结果处理
    ├── 瀑布图生成
    ├── 电影条处理
    ├── 指标计算(Speed Index、LCP、CLS 等)
    └── 报告渲染

测试流程

1. 提交测试请求
    ↓
2. 测试节点分配(根据位置、浏览器可用性)
    ↓
3. 浏览器启动,网络条件应用
    ↓
4. 页面加载(记录所有 HTTP 请求、响应)
    ↓
5. 数据采集(截图、Trace、HTTP Archive)
    ↓
6. 重复测试(按配置次数)
    ↓
7. 结果处理、指标计算
    ↓
8. 生成报告(瀑布图、电影条、评分)

核心指标

指标说明来源
TTFB (Time to First Byte)首字节时间HTTP 测量
Load Time页面加载完成时间onload 事件
Speed Index速度指数(页面视觉渲染速度)视觉测量
LCP (Largest Contentful Paint)最大内容绘制Chrome Trace
CLS (Cumulative Layout Shift)累积布局偏移Chrome Trace
INP (Interaction to Next Paint)交互到下一帧绘制Chrome Trace
FCP (First Contentful Paint)首次内容绘制Chrome Trace
TBT (Total Blocking Time)总阻塞时间Chrome Trace

核心特性

  • 🌍 全球多节点测试:25+ 全球测试位置,覆盖北美、欧洲、亚洲、南美、非洲
  • 🎬 电影条(Filmstrip):以 100ms 间隔的截图序列,可视化页面加载全过程
  • 📊 瀑布图(Waterfall):详细的 HTTP 请求瀑布图,展示每个资源的加载时间、大小、连接复用等
  • 🔬 Chrome Trace 集成:捕获完整的 Chrome Tracing 数据,在 chrome://tracing 中深度分析
  • 📱 设备模拟:支持移动设备模拟(视口、UA、DPR)、桌面浏览器测试
  • 🌐 多浏览器支持:Chrome、Firefox、Safari(iOS)、Edge、Opera
  • 🔧 自定义网络条件:预设和自定义带宽、延迟、丢包率
  • 📝 测试脚本:支持 WebPageTest Script 语言,模拟登录、点击、等待等复杂场景
  • 📈 对比测试:并排对比不同页面、不同配置的性能结果
  • 🔗 HTTP/2 vs HTTP/3 对比:支持不同协议版本的性能对比
  • ♻️ 重复访问测试:同时测试首次访问和缓存后的重复访问性能
  • 📊 Core Web Vitals:测量 LCP、CLS、INP 等核心指标
  • 🌱 Carbon Capture:碳排放估算功能(2023 年引入)
  • 🤖 无代码实验:2025 年新增,无需编写脚本即可配置测试实验

生态图

WebPageTest 生态系统
│
├── 核心平台
│   ├── WebPageTest 公共实例(webpagetest.org)
│   ├── WebPageTest 私有实例(Docker 自建)
│   └── Catchpoint IPM 平台(企业版集成)
│
├── API 生态
│   ├── REST API
│   ├── Node.js 客户端(webpagetest npm 包)
│   ├── API Recipes(GitHub: catchpoint/WebPageTest.api-recipes)
│   └── Bulk Testing API
│
├── CI/CD 集成
│   ├── GitHub Actions
│   ├── Jenkins 插件
│   └── 自定义脚本集成
│
├── 分析工具
│   ├── 瀑布图分析
│   ├── 电影条回放
│   ├── Chrome Trace Viewer
│   ├── 对比分析
│   └── HAR 导出
│
└── 相关项目
    ├── WPO-Foundation/webpagetest(GitHub 开源)
    ├── WebPageTest API 客户端库
    └── 私有 Agent 部署

适用场景

  • 🔍 深度性能诊断:通过瀑布图和 Chrome Trace 精确定位每一个资源的加载瓶颈
  • 🌐 CDN 配置验证:在全球多节点测试,验证 CDN 缓存命中率、TTFB 和边缘节点性能
  • 📱 移动性能评估:模拟不同移动设备和网络条件,评估移动用户体验
  • 🔄 A/B 性能对比:并排对比优化前后的性能差异,量化优化效果
  • 🏗️ CI/CD 性能守门:通过 API 在部署流水线中集成性能验证
  • 🔧 网络条件模拟:测试弱网环境(3G、高延迟、丢包)下的页面表现
  • 📊 竞品性能对标:对竞品网站进行标准化测试,量化性能差距

开发与工程化

CI/CD 集成

# GitHub Actions 集成
name: WebPageTest CI
on: [pull_request]
 
jobs:
  wpt-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
 
      - name: Install WebPageTest CLI
        run: npm install -g webpagetest
 
      - name: Run Performance Test
        env:
          WPT_API_KEY: ${{ secrets.WPT_API_KEY }}
        run: |
          RESULT=$(wpt https://example.com \
            --key $WPT_API_KEY \
            --server www.webpagetest.org \
            --location Dulles:Chrome \
            --connectivity Cable \
            --runs 3 \
            --json)
 
          SCORE=$(echo $RESULT | jq '.data.median.firstView.SpeedIndex')
          echo "Speed Index: $SCORE"
 
          if [ "$SCORE" -gt 3000 ]; then
            echo "::warning::Performance regression detected"
          fi

API 使用最佳实践

// 封装 WPT API 调用
class WPTClient {
  constructor(server = 'www.webpagetest.org', apiKey = '') {
    this.server = server;
    this.apiKey = apiKey;
    this.baseUrl = `https://${server}`;
  }
 
  async runTest(url, options = {}) {
    const params = new URLSearchParams({
      url,
      f: 'json',
      k: this.apiKey,
      location: options.location || 'Dulles:Chrome',
      connectivity: options.connectivity || 'Cable',
      runs: options.runs || 3,
      video: options.video ? 1 : 0,
      ...options,
    });
 
    // 提交测试
    const submitRes = await fetch(`${this.baseUrl}/runtest.php?${params}`);
    const submitData = await submitRes.json();
 
    if (submitData.statusCode !== 100) {
      throw new Error(`WPT submit failed: ${submitData.statusText}`);
    }
 
    const testId = submitData.data.testId;
 
    // 轮询等待结果
    return this.waitForResults(testId);
  }
 
  async waitForResults(testId, maxWait = 300000) {
    const startTime = Date.now();
 
    while (Date.now() - startTime < maxWait) {
      await this.delay(10000); // 每 10 秒轮询
 
      const res = await fetch(
        `${this.baseUrl}/jsonResult.php?test=${testId}&k=${this.apiKey}`
      );
      const data = await res.json();
 
      if (data.statusCode === 200) {
        return data.data;
      } else if (data.statusCode >= 400) {
        throw new Error(`WPT test failed: ${data.statusText}`);
      }
    }
 
    throw new Error('WPT test timed out');
  }
 
  delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
  }
}

性能预算集成

// 定义性能预算
const budgets = {
  speedIndex: { firstView: 3000, repeatView: 1500 },
  ttfb: { firstView: 800 },
  lcp: { firstView: 2500 },
  cls: { firstView: 0.1 },
  requests: { firstView: 50 },
  bytesIn: { firstView: 3000000 }, // 3MB
};
 
function checkBudgets(results) {
  const fv = results.median.firstView;
  const violations = [];
 
  for (const [metric, budget] of Object.entries(budgets)) {
    const value = fv[metric] || fv[metric + 'Ms'];
    const threshold = budget.firstView || budget;
 
    if (value && value > threshold) {
      violations.push(`${metric}: ${value} > ${threshold}`);
    }
  }
 
  return {
    passed: violations.length === 0,
    violations,
    summary: results,
  };
}

性能与安全

性能特点

  • 测试耗时:单次测试(3 次运行)约 2-5 分钟
  • 全球延迟:远程节点测试可能增加额外延迟
  • 队列等待:公共实例高峰期可能需要排队等待

安全注意事项

  • API Key 应妥善保管,不要公开暴露
  • 测试数据默认公开(公共实例),敏感页面应使用私有实例
  • 私有实例部署时应配置网络访问控制
  • 测试脚本中可能包含凭据,注意安全隔离

已知性能瓶颈

  • 公共实例在高峰期响应较慢
  • 全球节点的可用性取决于各地 Agent 的状态
  • 复杂脚本测试可能超时
  • 大量并发测试可能触发限频

技术对比

特性WebPageTestLighthousePageSpeed InsightsSpeedCurve
全球测试节点✅ 25+ 节点❌ 本地❌ 单点(CrUX 全球)✅ 有限节点
多浏览器✅ Chrome/FF/Safari/Edge❌ 仅 Chrome❌ 仅 Chrome✅ Chrome
电影条✅(部分)
瀑布图✅ 高级✅ 基础✅ 基础
Chrome Trace有限
网络模拟✅ 精细控制✅ 预设❌ 固定✅ 预设
API 支持✅ REST API✅ Node.js API✅ REST API✅ REST API
私有实例✅ Docker 自建
CI/CD 集成✅ API✅ 原生 LHCI✅ API 调用✅ API
费用免费 + 付费计划免费免费付费($90/月起)
视频分析✅ 完整电影条
重复访问测试❌(仅首次)❌(仅首次)
开源

关键差异说明

  • WPT vs Lighthouse:WPT 提供全球多节点、多浏览器测试和电影条可视化,更适合深度诊断;Lighthouse 更适合本地快速审计和 CI/CD 守门
  • WPT vs PSI:PSI 提供真实用户数据(CrUX),但测试条件固定;WPT 提供可控的合成测试条件,但不含真实用户数据
  • WPT vs SpeedCurve:SpeedCurve 是商业监控平台(基于 WPT 引擎),提供持续监控和仪表板;WPT 是按需测试工具

最佳实践

生产环境建议

  1. 合理选择测试节点:选择目标用户最近的节点,或同时测试多个区域节点
  2. 多轮测试取中位数:设置 3-5 次测试运行,使用中间值(Median)减少波动
  3. 首次 vs 重复访问:同时关注首次访问(缓存未命中)和重复访问(缓存后)性能
  4. 视频分析:开启电影条功能,可视化定位渲染瓶颈
  5. 私有实例:频繁测试或测试敏感页面时,考虑部署私有实例
  6. API 限频管理:实现请求间隔和指数退避重试

常见陷阱

  • 忽略测试次数:单次测试结果波动大,至少运行 3 次取中位数
  • 只看首次访问:真实用户大部分是重复访问,重复访问性能同样重要
  • 网络条件不匹配:测试条件应反映目标用户的真实网络环境
  • 公共实例高峰期排队:重要测试避开高峰期或使用付费优先级
  • 忽略 DNS 时间:TTFB 包含 DNS 解析,使用预热 DNS 或重复访问测试排除 DNS 影响

推荐模式

  • 开发阶段:本地 Lighthouse 快速迭代
  • 预发布验证:WebPageTest 全球多节点测试
  • 持续监控:SpeedCurve 或 Catchpoint 持续追踪
  • 深度诊断:WebPageTest 瀑布图 + Chrome Trace 组合分析

技术局限与边界

已知限制

局限详细说明
公共实例排队高峰期需要等待,影响测试效率
无真实用户数据只提供合成测试数据,不含真实用户数据
API 限频免费 API 有请求限制
脚本学习曲线WPT Script 语言需要学习成本
测试条件限制无法模拟所有真实网络条件(如 Wi-Fi 切换)
iOS 测试有限Safari 测试依赖特定节点,可用性不如 Chrome
结果保留时间公共实例结果有保留期限
Catchpoint 整合后部分功能商业化部分高级功能需要付费

不适用场景

  • 需要真实用户数据的场景(应使用 CrUX 或 RUM 工具)
  • 需要持续 24/7 性能监控(应使用 SpeedCurve、Calibre 等监控平台)
  • 需要测试应用内页面(应使用本地 Lighthouse + Puppeteer)

学习资源

官方文档

教程

社区资源

2026 年现状

最新版本

  • Catchpoint 平台整合版:2025 年 10 月完成深度整合,WebPageTest 全面嵌入 Catchpoint IPM 平台
  • 开源版本:GitHub 代码仍可用,但核心维护转向 Catchpoint
  • 无代码实验:2025 年新增的无代码测试实验功能

发展趋势

  1. Catchpoint 深度整合:WebPageTest 从独立工具演变为 Catchpoint 平台的核心分析引擎
  2. 无代码实验:降低使用门槛,无需编写脚本即可配置复杂测试
  3. API 可用性监控:从性能测试扩展到 API 可用性和可靠性监控
  4. 环境间对比:支持跨办公室、云和网络的可靠性和性能对比
  5. 碳排放追踪:Carbon Capture 功能持续优化

社区活跃度

  • 开源代码仍有社区贡献,但核心开发转向 Catchpoint
  • 公共实例(webpagetest.org)持续免费可用
  • Catchpoint 提供企业级 SLA 和技术支持
  • WebPageTest 仍是性能测试领域事实上的标准工具之一