基于 Chrome Manifest V3 的测试辅助工具集,专为 Web 测试人员打造。可在设置页自主选择启用哪些工具,侧边栏形式随时可用。
加载扩展、侧边栏使用、设置页等详见下方「操作指南」章节。
注意:扩展重载后需刷新目标网页,否则旧页面的捕获脚本已失效(会提示刷新)。
chrome://extensions/
mynatest/
├── manifest.json # MV3 清单(content_scripts 声明式注入 MAIN/ISOLATED world)
├── background.js # Service Worker:侧栏 + Port 中转 + 截图
├── sidepanel.html/css/js # 侧边栏 UI 框架
├── options.html/css/js # 设置页(Tab 式,按分类管理工具)
├── core/ # 共享核心模块(全局脚本,挂 window)
│ ├── storage.js # chrome.storage 封装 + 启用工具管理
│ ├── diff.js # diffJSON / diffLines / parseJSONRobust
│ └── utils.js # escapeHtml / flashMessage
├── content/ # ⭐ Content Scripts(注入页面,manifest 声明式)
│ ├── injected.js # MAIN world:hook fetch/XHR,捕获请求/响应
│ ├── content.js # ISOLATED world:Port 长连接转发
│ ├── env-banner-content.js # 环境横幅:域名匹配 + 顶部横幅注入
│ ├── bug-report-content.js # Bug 报告:框选 + Canvas 标注 + 环境采集
│ ├── mock-interceptor-main.js # Mock:MAIN world 独立 hook fetch/XHR
│ ├── mock-interceptor-bridge.js # Mock:ISOLATED world 读 storage → postMessage 下发配置
│ └── snapshot-picker.js # 快照:元素选择器 + 自动比对 + DOM 徽章
├── tools/ # 所有工具集中在这里(全局 IIFE 自注册)
│ ├── request-diff.js # 请求对比
│ ├── stress-test.js # 轻量压测
│ ├── timestamp.js # 时间戳转换
│ ├── json-formatter.js # JSON 格式化
│ ├── data-diff.js # 数据对比
│ ├── storage-manager.js # Cookie/Storage 管理
│ ├── jwt-parser.js # JWT 解析
│ ├── regex-tester.js # 正则测试
│ ├── env-banner.js # 测试环境横幅
│ ├── bug-report.js # Bug 报告助手
│ ├── mock-interceptor.js # 接口 Mock 拦截器
│ ├── link-checker.js # 链接可用性检查
│ ├── snapshot-diff.js # 元素快照对比
│ ├── ip-generator.js # IP 地址生成
│ ├── ua-generator.js # User-Agent 生成
│ ├── user-generator.js # 用户信息生成
│ ├── file-generator.js # 文件生成
│ ├── vehicle-generator.js # 车辆信息生成
│ ├── contract-generator.js # 合同票据生成
│ ├── product-generator.js # 商品信息生成
│ ├── color-picker-tool.js # 取色器
│ ├── code-generator.js # 请求转代码
│ ├── web-vitals.js # 性能面板
│ ├── selector-generator.js # 选择器生成
│ ├── resource-checker.js # 资源检查
│ ├── screen-capture.js # 截图录屏
│ ├── table-export.js # 表格导出
│ ├── checklist.js # 测试检查清单
│ ├── snippet-manager.js # 脚本片段管理
│ ├── api-docs.js # 接口文档生成
│ ├── keyboard-nav.js # 键盘导航测试
│ ├── timing-breakdown.js # 请求耗时分解
│ └── upload-audit.js # 上传漏洞辅助
├── vendor/ # 第三方库(Chrome 扩展离线使用)
│ └── xlsx.full.min.js # SheetJS — Excel 解析 / 生成(MIT, ~880KB)
├── icons/ # 工具图标(16×16 PNG)
├── assets/ # 静态资源(收款码等)
| 工具 | 分类 | 说明 |
|---|---|---|
| 请求对比 | 网络工具 | 捕获两次接口响应 → 自动 diff(JSON 路径级 / 行级文本) |
| 轻量压测 | 测试工具 | 捕获接口一键填入;数据统计、响应断言、响应查看、报告下载 |
| 请求转代码 | 网络工具 | 捕获请求一键生成 cURL、fetch、axios、Python requests、Playwright |
| 性能面板 | 网络工具 | LCP/CLS/INP 实时监控;慢请求 TOP 10;资源瀑布图;资源大小按类型分布 |
| 接口文档生成 | 网络工具 | 实时捕获接口请求,勾选后一键生成 Markdown 文档或 OpenAPI 3.0 JSON |
| 请求耗时分解 | 网络工具 | 基于 Performance API 分解每个请求的 DNS / TCP / TLS / TTFB / 内容下载各阶段耗时 |
| 时间戳转换 | 格式转换 | 时间与时间戳互转,支持秒/毫秒级 |
| JSON 格式化 | 格式转换 | 格式化 / 压缩 / 转义 / 反转义 |
| 数据对比 | 格式转换 | JSON / 文本行级 diff |
| Cookie/Storage 管理 | 开发工具 | 登录态快照切换 |
| 正则测试 | 开发工具 | 实时匹配结果,内置邮箱/手机号/IP 等常用正则速查 |
| 环境横幅 | 开发工具 | 域名规则匹配 + 页面顶部彩色横幅 |
| 截图 & 录屏 | 开发工具 | 可见区域截图 + 全页截图 + 录屏 |
| 脚本片段 | 开发工具 | 常用注入脚本管理:内置预设 + 自定义;一键注入执行 |
| 取色器 | 开发工具 | 拾取页面任意像素颜色 |
| JWT 解析 | 开发工具 | 解码 JWT 的 Header / Payload |
| Bug 报告助手 | 测试工具 | 页面框选区域 + Canvas 标注(箭头/矩形/文字/序号)+ 环境信息采集(URL/UserAgent/分辨率) |
| Mock 拦截器 | 测试工具 | 拦截指定 URL 返回自定义响应;多套场景一键切换 |
| 链接检查 | 测试工具 | 批量扫描页面 a 标签,校验可访问性与跳转地址 |
| 快照对比 | 测试工具 | 捕获元素基准图,自动像素比对 UI 变更;差异高亮红色标注 |
| 选择器生成 | 测试工具 | 点击页面元素生成 CSS/XPath/Playwright 选择器;自动校验唯一性;逐级增强直到唯一 |
| 资源检查 | 测试工具 | 检测页面中图片/JS/CSS/字体的加载失败(404 等) |
| 键盘导航测试 | 测试工具 | 扫描页面全部可聚焦元素;监控 Tab/Enter/Space/Esc 按键行为是否被 preventDefault 拦截 |
| 测试检查清单 | 测试工具 | 发布前 checklist:内置 7 组 24 项模板(功能/接口/兼容/安全/性能/上线/文档);自定义项添加;进度条跟踪 |
| 上传漏洞辅助 | 测试工具 | 文件上传测试辅助:文件名/扩展名绕过清单一键复制;上传点安全检查清单(仅授权测试) |
| IP 地址生成 | 数据工具 | 随机生成 IPv4/IPv6;显示本机内外网 IP |
| UA 生成 | 数据工具 | 随机生成 User-Agent(多浏览器 × 多平台);显示本机当前 UA |
| 用户信息生成 | 数据工具 | 用户信息随机生成;支持文本/JSON/YAML 导出 |
| 文件生成 | 数据工具 | 自定义文件(文本/二进制/BMP);生成后自动下载 |
| 商品信息生成 | 数据工具 | 商品电商数据随机生成(名称/编码/类目/价格/SKU/图片/视频/状态/物流等) |
| 车辆信息生成 | 数据工具 | 车辆信息随机生成(车牌/VIN/颜色/品牌/证件/车主/驾驶证等) |
| 合同票据生成 | 数据工具 | 合同票据信息随机生成(合同主体/甲乙双方/金额/日期/票据/备注) |
| 表格导出 | 格式转换 | 扫描页面所有 <table>,逐个导出 CSV/Excel/JSON |
| Excel↔JSON 转换 | 格式转换 | .xlsx/.xls/.csv ↔ JSON 双向互转;多 Sheet 支持;首行可做 key 或纯数组 |
工具以全局脚本(IIFE)形式自注册到 window.MynaTools。
⚠️ 不要使用 ES modules —— <script type="module"> 在 Side Panel 中会静默失败。
tools/ 下创建新模块// tools/my-tool.js
(function () {
const flashMessage = window.MynaUtils.flashMessage;
const meta = {
id: 'my-tool',
name: '我的工具',
desc: '一句话描述',
iconUrl: 'icons/my-tool.png', // PNG 图标(侧边栏/设置页统一使用)
category: 'dev', // 分类 key
categoryName: '开发工具' // 分类显示名(设置页按此分组)
};
function render(container) {
container.innerHTML = `
<h2><img src="${meta.iconUrl}" alt=""> ${meta.name}</h2>
<button class="btn" id="btn">点我</button>
`;
}
function mount(context) {
context.container.querySelector('#btn')?.addEventListener('click', () => {
flashMessage('Hello!');
});
// 订阅捕获的网络请求
const off = context.events.on('network:request', (payload) => { /* ... */ });
return () => off(); // 可选:返回 cleanup 函数
}
// 注册到全局,侧边栏与设置页自动出现
window.MynaTools = window.MynaTools || [];
window.MynaTools.push({ meta, render, mount });
})();
<!-- sidepanel.html 和 options.html 的 <body> 末尾,必须在 sidepanel.js / options.js 之前 -->
<script src="tools/my-tool.js"></script>
完成!侧边栏和设置页自动多出对应图标和勾选项。
| 字段 | 必填 | 说明 |
|---|---|---|
meta |
✅ | { id, name, desc, icon, iconUrl, category, categoryName } |
render(container) |
✅ | 往 container DOM 填 HTML |
mount(context) |
✅ | 绑定事件 / 订阅总线;可返回 cleanup 函数 |
cleanup() |
❌ | 预留 |
mount 的 context:
{
container, // HTMLElement — 工具根 DOM
events: {
on(event, fn) // 订阅事件,返回取消函数
emit(event, payload)
}
}
| 事件 | payload |
|---|---|
network:request |
{ url, method, status, duration, success, requestHeaders, responseHeaders, requestBody, responseBody, timestamp } |
url已归一化为绝对地址(new URL(u, location.href)),可直接用于压测重放。
页面 fetch/XHR(MAIN world,injected.js hook,manifest content_scripts 声明注入 @document_start)
↓ window.postMessage
content.js(ISOLATED world)── Port 'content-relay' ──→ background.js
↓ (缓冲最近 100 条请求)
background.js ── Port 'sidepanel' 广播 ──→ sidepanel.js(eventBus)──→ 各 tool.mount() 订阅
链路的健壮性设计:
chrome.storage.onChanged 兜底通道兼容旧脚本chrome.webRequest 拿不到 response body,注入 MAIN world 脚本才能完整劫持 fetch/XHR(通过 manifest content_scripts 的 world: "MAIN" 声明注入,非 executeScript)loadend:它覆盖 success / error / abort 所有终止状态,避免错误场景重复上报| 权限 | 用途 |
|---|---|
storage |
持久化启用的工具列表 + 捕获消息兜底通道 + Storage 管理登录态快照 |
sidePanel |
打开侧边栏 |
scripting |
Cookie/Storage 管理器注入 MAIN world 读写 localStorage/sessionStorage |
activeTab |
获取当前标签页 URL |
cookies |
Cookie/Storage 管理器读写 Cookie |
tabs |
查询活动标签页 URL 和 ID |
<all_urls> |
host_permissions — 声明式注入捕获脚本 + 压测工具直接 fetch 任意 URL(绕过 CORS)+ Storage 管理注入 |
MIT