📦 browser-testing — 浏览器视觉稳定性测试

v0.1.0

验证你的更改是否有效。测量 CLS(累积布局偏移),检测主题闪烁,测试视觉稳定性和检查性能。在修改前后使用以确认修复是否有效。包含可直接运行的脚本:measure-cls.ts、detect-flicker.ts。

0· 32·0 当前·0 累计
wu-uk 头像by @wu-uk·MIT-0
下载技能包
License
MIT-0
最后更新
2026/4/15
0
安全扫描
VirusTotal
无害
查看报告
OpenClaw
安全
high confidence
该技能的代码、指令和要求与基于浏览器的视觉稳定性和性能测试工具一致——捆绑包中没有发现隐藏的数据窃取或无关操作,尽管它需要 Node/Playwright 运行时,并且会访问目标 URL 并将屏幕截图写入 /tmp。
评估建议
这似乎是一个用于测量性能、CLS 和检测主题闪烁的 Playwright 脚本工具。运行前请确保你有一个可信的 Node 环境(Node、ts-node 或编译后的 JS)并安装了 Playwright,或者准备好让 npx 安装运行时包。只对可信的 URL 运行这些脚本(它们会加载并渲染页面并将屏幕截图保存到 /tmp)。如果你想确认没有额外的遥测数据,请查看包含的 TypeScript;避免将其指向包含敏感数据的生产端点。如果你在 CI 中需要这个工具,考虑将 TypeScript 转换为固定的包或构建工件,这样你可以完全控制运行的内容。...
详细分析 ▾
用途与能力
名称/描述与包含的脚本(measure.ts、measure-cls.ts、detect-flicker.ts)相匹配。SKILL.md 声称 Playwright 已预装,但注册表元数据中没有列出所需的二进制文件;实际上这些脚本需要 Node、npx/ts-node(或预编译的 JS)以及 Playwright 和 PNG 库(pngjs)。这种不匹配(未声明的运行时依赖)是一个小的不一致,但可以解释。
指令范围
指令范围狭窄:针对 URL 运行提供的 TypeScript 脚本以测量网络时间、CLS 和主题闪烁。脚本通过 Playwright 启动 Chromium,捕获 CDP 指标,并将屏幕截图保存到 /tmp。它们不读取无关的文件或环境变量,也不会将结果传输到外部端点。注意事项:它们会导航你提供的任意 URL——对不受信任的目标运行可能会触及内部服务(根据你的环境存在类似 SSRF 的风险)并捕获页面提供的任何内容的屏幕截图。
安装机制
没有安装规范(仅指令)。代码文件已包含,旨在使用 npx ts-node 或现有的 Node+Playwright 设置运行。这对技能包本身风险较低;请注意,如果尚未安装,运行 npx ts-node 可能会在运行时拉取包。
凭证需求
该技能不请求环境变量或凭证,其操作(浏览器自动化、屏幕捕获、CDP 指标)与声明的目的成比例。没有请求意外的密钥或无关的凭证。
持久化与权限
always 为 false,代理调用正常,技能不尝试持久化配置或修改其他技能。它将临时屏幕截图文件写入 /tmp,这对此用例是预期的。
安全有层次,运行前请审查代码。

License

MIT-0

可自由使用、修改和再分发,无需署名。

运行时依赖

无特殊依赖

版本

latestv0.1.02026/4/15

从所有任务技能中批量发布,去重处理

无害

安装命令

点击复制
官方npx clawhub@latest install fix-visual-stability-browser-testing
镜像加速npx clawhub@latest install fix-visual-stability-browser-testing --registry https://cn.longxiaskill.com

技能文档

通过测量实际加载时间和网络活动来诊断性能问题。Playwright 已预装。只需使用测量脚本。

快速开始

此技能的目录中包含一个 measure.ts 脚本。找到它并运行:

# 测量页面(输出包含瀑布数据的 JSON)
npx ts-node /measure.ts http://localhost:3000

# 测量 API 端点 npx ts-node /measure.ts http://localhost:3000/api/products

脚本与此 SKILL.md 文件位于同一目录。

理解输出

脚本输出包含以下 JSON 数据:

{
  "url": "http://localhost:3000",
  "totalMs": 1523,
  "requests": [
    { "url": "http://localhost:3000/", "ms": 45.2 },
    { "url": "http://localhost:3000/api/products", "ms": 512.3 },
    { "url": "http://localhost:3000/api/featured", "ms": 301.1 }
  ],
  "metrics": {
    "JSHeapUsedSize": 4521984,
    "LayoutCount": 12,
    "ScriptDuration": 0.234
  }
}

阅读瀑布图

requests 数组显示网络时间。寻找顺序模式

错误(顺序 - 每个都等待前一个):
/api/products |████████| 512ms
/api/featured |██████| 301ms(在 products 之后开始)
/api/categories |████| 201ms(在 featured 之后开始)
总计:1014ms

正确(并行 - 全部同时开始): /api/products |████████| 512ms /api/featured |██████| 301ms(同时开始) /api/categories |████| 201ms(同时开始) 总计:512ms(只是最慢的一个)

关键指标

指标含义红色警报
totalMs页面总加载时间> 1000ms
JSHeapUsedSizeJS 使用的内存随时间增长
LayoutCount布局重计算次数每页 > 50 次
ScriptDurationJS 执行时间> 0.5s

需要关注的问题

症状可能原因修复方法
请求按顺序进行顺序的 await 语句使用 Promise.all()
同一 URL 被请求两次在缓存检查前获取先检查缓存
响应开始前时间长发送前有阻塞操作使其异步/非阻塞
LayoutCount 高组件重新渲染添加 React.memouseMemo

直接测量 API 端点

无需浏览器开销,快速测量 API 时间:

async function measureAPI(url: string) {
  const start = Date.now();
  const response = await fetch(url);
  const elapsed = Date.now() - start;
  return { url, time_ms: elapsed, status: response.status };
}

// 示例 const endpoints = [ 'http://localhost:3000/api/products', 'http://localhost:3000/api/products?cache=false', 'http://localhost:3000/api/checkout', ];

for (const endpoint of endpoints) { const result = await measureAPI(endpoint); console.log(${endpoint}: ${result.time_ms}ms); }

测量脚本的工作原理

脚本使用 Chrome 开发者工具协议(CDP)来拦截浏览器内部:

  • Network.requestWillBeSent - 请求开始时触发的事件,我们记录时间戳
  • Network.responseReceived - 响应到达时触发的事件,我们计算持续时间
  • Performance.getMetrics - 返回 Chrome 的内部计数器(内存、布局、脚本时间)

这为你提供了与 Chrome DevTools Network 标签相同的数据,但是通过程序方式。

视觉稳定性测量

测量 CLS(累积布局偏移)

npx ts-node /measure-cls.ts http://localhost:3000

输出:

{
  "url": "http://localhost:3000",
  "cls": 0.42,
  "rating": "poor",
  "shifts": [
    {
      "value": 0.15,
      "hadRecentInput": false,
      "sources": [
        { "nodeId": 42, "previousRect": {...}, "currentRect": {...} }
      ]
    }
  ]
}

CLS 阈值

CLS 分数评级操作
< 0.1良好无需操作
0.1 - 0.25需要改进审查偏移源
> 0.25立即修复

检测主题闪烁

npx ts-node /detect-flicker.ts http://localhost:3000

检测深色主题在加载前是否闪烁白色。在导航前设置 localStorage 主题,并在首次绘制时检查背景颜色。

准确的 CLS 测量

CLS 只测量视口内的偏移。折叠下方加载的内容不会贡献 CLS,直到你滚动。为了准确测量:

推荐的测试序列:

  • 加载页面
  • 等待 3 秒(让延迟加载的内容出现)
  • 滚动到底部
  • 等待 2 秒
  • 触发 1-2 个 UI 操作(主题切换、筛选点击等)
  • 等待 2 秒
  • 读取最终 CLS
# 基本测量(可能会错过延迟内容的偏移)
npx ts-node /measure-cls.ts http://localhost:3000

# 带滚动(捕获更多偏移) npx ts-node /measure-cls.ts http://localhost:3000 --scroll

为什么测量值会变化:

  • 生产版本 vs 开发版本有不同的时序
  • 视口大小影响偏移时"在视口内"的内容
  • setTimeout 延迟在运行之间略有不同
  • 网络条件影响内容加载时间

相对差异(修复前/后)比绝对值更重要。

常见 CLS 原因

偏移源可能原因修复方法
元素缺少宽度/高度添加尺寸或使用 next/image
主题包装器水合闪烁在 React 之前使用内联脚本
骨架屏加载器尺寸不匹配使骨架与最终内容尺寸匹配
动态横幅没有预留空间为容器添加 min-height
延迟加载的侧边栏内容出现并推动主内容用 CSS 预留空间或显示占位符
分页/结果栏数据加载后出现 UI 元素立即显示加载状态
字体加载自定义字体导致文本回流使用 font-display: swap 或预加载字体
数据来源ClawHub ↗ · 中文优化:龙虾技能库