基于 Python 解析 HAR 文件生成页面性能测试报告
通过 Python 解析 HAR 文件并自动生成可视化的页面性能测试报告,下面提供一套完整、可直接落地的实现方案,涵盖 HAR 解析、性能指标提取、HTML 报告生成全流程。
一、方案概述
- HAR 文件说明:HAR(HTTP Archive)是一种 JSON 格式的文件,用于记录浏览器与服务器之间的 HTTP 请求/响应详情及页面加载性能数据,可通过 Chrome、Firefox 等浏览器的开发者工具获取。
- 核心依赖库:
haralyzer:专门用于解析 HAR 文件,提取性能指标和请求数据,简化手动解析 JSON 的复杂度。jinja2:轻量级模板引擎,用于快速渲染 HTML 报告,支持自定义报告样式和结构。json:Python 内置库,辅助读取和解析 HAR 文件(haralyzer底层也依赖此库)。
- 实现流程:获取 HAR 文件 → Python 解析 HAR → 提取关键性能指标 → 渲染 HTML 模板 → 生成可视化报告。
二、环境准备
先安装所需依赖库,执行以下命令:
pip install haralyzer jinja2
三、关键步骤实现
步骤 1:获取 HAR 文件(浏览器操作)
以 Chrome 浏览器为例,获取页面 HAR 文件:
- 打开 Chrome 浏览器,访问需要测试的页面。
- 按
F12打开开发者工具,切换到Network面板。 - 勾选面板左上角的
Preserve log(保留日志)。 - 刷新页面(或重新加载目标页面),等待所有请求加载完成。
- 右键点击
Network面板中的任意请求,选择Save all as HAR with content,保存为.har格式文件(如page_perf.har)。
步骤 2:Python 解析 HAR 文件并提取性能指标
编写 Python 脚本,解析 HAR 文件,提取核心页面性能指标(如页面加载时间、DNS 查询时间、TTFB 等)和请求详情。
import json
from haralyzer import HarParser, HarPage
from datetime import datetime
def parse_har_file(har_file_path):
""" 解析 HAR 文件,提取页面性能指标和请求数据
:param har_file_path: HAR 文件路径
:return: 性能指标字典 + 详细请求列表
"""
# 读取 HAR 文件
try:
with open(har_file_path, 'r', encoding='utf-8') f:
har_data = json.load(f)
FileNotFoundError:
Exception()
json.JSONDecodeError:
Exception()
har_parser = HarParser(har_data)
har_pages = har_parser.pages
har_pages:
Exception()
target_page: HarPage = har_pages[]
perf_metrics = {
: target_page.page_title ,
: datetime.fromtimestamp((target_page.start_time.timestamp())).strftime(),
: (target_page.page_load_time, ),
: (target_page.dns_time, ),
: (target_page.tcp_time, ),
: (target_page.ttfb, ),
: (target_page.send_time, ),
: (target_page.receive_time, ),
: (target_page.ssl_time + target_page.send_time + target_page.receive_time, ),
: (target_page.requests),
: ([req req target_page.requests req.status_code >= ]),
: ([req req target_page.requests req.resource_type [, , ]])
}
request_details = []
req target_page.requests:
request_info = {
: req.url,
: req.method,
: req.status_code,
: req.resource_type ,
: (req.time, ),
: (req.dns_time, ),
: (req.tcp_time, ),
: (req.ttfb, ),
: req.response_size
}
request_details.append(request_info)
perf_metrics, request_details

