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/
- GitHub:https://github.com/WPO-Foundation/webpagetest
- License:MIT License(开源版本)/ 商业许可(Catchpoint 平台)
- 最新版本:持续更新(Catchpoint 平台版本)
- 主要维护者/公司:Catchpoint(2020 年收购)/ 原 WPO Foundation
- 开源协议:Apache 2.0(旧版开源代码)
- 测试节点:全球 25+ 公共测试位置
快速上手
安装
方式一:使用公共实例(推荐入门)
- 直接访问 https://www.webpagetest.org/ 即可使用,无需安装
方式二:自建私有实例(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 Slow | 400/400 Kbps | 400ms | 0% |
| 3G | 1.6/768 Kbps | 300ms | 0% |
| 4G | 9/9 Mbps | 170ms | 0% |
| Cable | 5/1 Mbps | 28ms | 0% |
| DSL | 1.5/384 Kbps | 50ms | 0% |
| FIOS | 20/5 Mbps | 4ms | 0% |
| 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"
fiAPI 使用最佳实践
// 封装 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 的状态
- 复杂脚本测试可能超时
- 大量并发测试可能触发限频
技术对比
| 特性 | WebPageTest | Lighthouse | PageSpeed Insights | SpeedCurve |
|---|---|---|---|---|
| 全球测试节点 | ✅ 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 是按需测试工具
最佳实践
生产环境建议
- 合理选择测试节点:选择目标用户最近的节点,或同时测试多个区域节点
- 多轮测试取中位数:设置 3-5 次测试运行,使用中间值(Median)减少波动
- 首次 vs 重复访问:同时关注首次访问(缓存未命中)和重复访问(缓存后)性能
- 视频分析:开启电影条功能,可视化定位渲染瓶颈
- 私有实例:频繁测试或测试敏感页面时,考虑部署私有实例
- 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)
学习资源
官方文档
- WebPageTest 官方文档 - 完整使用指南
- WPT API 文档 - API 参考
- WPT Script 文档 - 脚本语言参考
- Catchpoint WPT 博客 - 技术文章
教程
- WebPageTest API Recipes (GitHub) - API 使用示例
- web.dev 性能优化 - 结合 WPT 的优化指南
- Speed Index 详解 - 指标解释
社区资源
- WebPageTest Forums - 官方论坛
- WPO Foundation (GitHub) - 开源仓库
- Web Performance Slack Community - Slack 社区
- Twitter #WebPerf - 技术讨论
2026 年现状
最新版本
- Catchpoint 平台整合版:2025 年 10 月完成深度整合,WebPageTest 全面嵌入 Catchpoint IPM 平台
- 开源版本:GitHub 代码仍可用,但核心维护转向 Catchpoint
- 无代码实验:2025 年新增的无代码测试实验功能
发展趋势
- Catchpoint 深度整合:WebPageTest 从独立工具演变为 Catchpoint 平台的核心分析引擎
- 无代码实验:降低使用门槛,无需编写脚本即可配置复杂测试
- API 可用性监控:从性能测试扩展到 API 可用性和可靠性监控
- 环境间对比:支持跨办公室、云和网络的可靠性和性能对比
- 碳排放追踪:Carbon Capture 功能持续优化
社区活跃度
- 开源代码仍有社区贡献,但核心开发转向 Catchpoint
- 公共实例(webpagetest.org)持续免费可用
- Catchpoint 提供企业级 SLA 和技术支持
- WebPageTest 仍是性能测试领域事实上的标准工具之一