用真实浏览器给网页做移动端交付质检并留下证据
30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/6 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/ROY32172310/qa.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
面向 AI 生成网页的确定性、MCP 原生交付质检
README
由 DeepSeek 最新模型翻译生成收录于 TensorBlock MCP Index
Qa MCP 在 AI Agents Listing 上的评分
ego-webqa
面向 AI 生成的网页、H5 演示和 PWA,做确定性的粗粒度交付质检。
给它一个 URL 就行。默认用真实 Chromium 浏览器打开页面,跑一套零配置的窄屏移动端矩阵,安全地探测主行动按钮,最后留下截图和机器可读的证据。Firefox 和 Playwright WebKit 可以按引擎逐个选用。默认的八个变体组合如下:
- 360px 和 390px 两种宽度;
- 1.0x 和 1.5x 两种文字缩放;
- 0px 和 34px 两种模拟底部安全区。
30 秒看结果
想先看一次完整跑完的效果?打开在线前后对比证据板。
python -m pip install ego-webqa
ego-webqa setup
ego-webqa https://your-preview.example --out .qa/first
setup 先检查选定的浏览器。如果它已经能启动,setup 直接退出,不下载任何东西;否则用当前 ego-webqa 所在的 Python 解释器安装固定版本的 Playwright headless shell,并验证一次真实的无头启动。
展开完整文档(README 剩余 1 节)
收录于 TensorBlock MCP Index
Qa MCP 在 AI Agents Listing 上的评分
ego-webqa
面向 AI 生成的网页、H5 演示和 PWA,做确定性的粗粒度交付质检。
给它一个 URL 就行。默认用真实 Chromium 浏览器打开页面,跑一套零配置的窄屏移动端矩阵,安全地探测主行动按钮,最后留下截图和机器可读的证据。Firefox 和 Playwright WebKit 可以按引擎逐个选用。默认的八个变体组合如下:
- 360px 和 390px 两种宽度;
- 1.0x 和 1.5x 两种文字缩放;
- 0px 和 34px 两种模拟底部安全区。
30 秒看结果
想先看一次完整跑完的效果?打开在线前后对比证据板。
python -m pip install ego-webqa
ego-webqa setup
ego-webqa https://your-preview.example --out .qa/first
setup 先检查选定的浏览器。如果它已经能启动,setup 直接退出,不下载任何东西;否则用当前 ego-webqa 所在的 Python 解释器安装固定版本的 Playwright headless shell,并验证一次真实的无头启动。首次 Chromium 安装会跳过完整的带界面浏览器构建,因为审计只在无头模式下跑。普通的 doctor 和审计命令从不隐式下载浏览器。审计命令的退出码:通过或有警告为 0,存在阻断交付的缺陷为 1,审计或浏览器出错为 2。每次运行都会留下截图和结构化证据:
.qa/first/
├── agent_summary.json # one aggregated, repair-ready item per root cause
├── feedback_bundle.json # privacy-safe summary for external issue reports
├── report.json
├── junit.xml
├── report.sarif
└── screenshots/
一次真实的内部试用发现长这样:
{
"dimension_id": "text_scale_layout_break",
"selector": "body > div:nth-of-type(2) > div:nth-of-type(2) > a",
"text_snippet": "我也要创建 →", "problem": "page is 9px wider than the viewport at 1.5x text scale", "trigger": "mobile-360-150-safe0 (360x800); mobile-360-150-safe34 (360x800)", "severity": "block" } 报告说明哪里坏了、坏在什么地方、影响了哪些视口组合,并给智能体一条能复现故障的命令。
真实页面暴露了什么
v0.8.2 内部试用(dogfood)轮次审计了 Ego 自有的全部 20 个生产页面或规范生成页面,运行时错误为零。把对网络敏感的性能观察与确定性的交付问题分开后,十个页面干净,十个页面有可处理的结构性问题。稳定复现的失败包括:六处文字放大导致的布局破坏、四处底部安全区侵入、五个文字裁剪根因、四组尺寸不足的点击目标,以及一个生成页面加载了缺失的 service worker。在这批语料里,目前没有已知的稳定阻塞性误报。这是一批规模小、已公开的语料,不代表对全市场的准确率声明;完整证据、原始混合配置档计数和局限说明见 docs/real-world-dogfood-2026-10-31-v0.8.2.md。
布局失败现在会定位到真正造成溢出的最深层未裁剪元素,智能体拿到的是具体的修复选择器,而不是 html。
看一个生成页面如何从三个根因降到零阻塞缺陷:词汇表修复案例研究。
想在你自己某个页面上跑同样的闭环,按 15 分钟首次试用流程操作。
现场反馈流程定义了如何对真实案例分类,并转成干净的对照用例或基准测试夹具。
为什么
生成页面常常通过单元测试,却仍然带着明显的交付缺陷上线:内容比手机屏幕宽、按钮看不见、图片裂了、控制台报错、行动号召点了没反应,或者用户正要点击时页面发生位移。
ego-webqa 把这些变成确定性检查。它不是视觉回归服务,也不需要写测试或保存已批准的截图。
安装
从 PyPI 安装已发布的包:
python -m pip install ego-webqa
ego-webqa setup
想在发版前安装当前检出:
git clone https://github.com/ROY32172310/qa.git
cd qa
python -m pip install .
ego-webqa setup
开发时使用仓库里提交的锁文件:
uv lock --check
uv sync --locked --all-extras
uv run --locked ego-webqa setup
没有 uv 时,仍支持 python -m pip install -e '.[dev]'。
如果装了 uv,又不想长期安装 Python 包,可以用隔离且版本固定的 uvx 环境跑同样的命令:
uvx --from ego-webqa==0.8.2 ego-webqa setup
uvx --from ego-webqa==0.8.2 ego-webqa https://your-preview.example
Playwright 由包固定版本,浏览器二进制放在 Playwright 的共享缓存里,所以临时的 uvx 环境和之后启动的 MCP 会复用同一个浏览器版本。
如果 doctor 报告缺少 Linux 系统库,就让 setup 去安装:
ego-webqa setup --with-deps
setup 特意做成一条独立、显式的命令:wheel 安装保持离线安全,而浏览器下载和操作系统改动都是用户可见、可重试的操作。setup 是幂等的,会复用已经通过真实启动检查的浏览器。用 setup --dry-run 查看绑定到具体解释器的确切命令,或用 --force 重装损坏的浏览器版本。
需要更底层的修复或显式安装命令时,用:
ego-webqa install-browser
ego-webqa doctor
Chromium 默认只安装 headless 版本。如果同一台机器上别的工具需要完整的带界面 Chromium 构建,显式开启:
ego-webqa setup --full-chromium
改用系统 Chrome,不下载 Chromium:
ego-webqa https://example.com --browser-channel chrome
Firefox 和 WebKit
只安装你需要的额外引擎,然后为整次审计选中它:
ego-webqa setup --browser-engine firefox
ego-webqa https://example.com --browser-engine firefox
ego-webqa setup --browser-engine webkit
ego-webqa https://example.com --browser-engine webkit
Chromium 仍是默认引擎。每次审计只跑一个引擎;这不会悄悄放大浏览器开销,也不声称跨引擎结果一致。webkit 选项使用 Playwright 的 WebKit 构建,能提供有用的 Safari 引擎证据,但它不是真实的 iPhone、iPad 或 macOS Safari 运行。交付决策需要时,请用真机测试。
用法
ego-webqa https://example.com
ego-webqa --dir ./dist --file index.html
ego-webqa https://example.com --preset quick
ego-webqa http://127.0.0.1:8000 --viewports 390x844:mobile@1.5~34,1280x800:desktop
ego-webqa https://example.com --browser-engine firefox
ego-webqa https://example.com --profile performance \
--ready-selector "#app-ready" --wait-for-network-idle
ego-webqa https://example.com --smoke-success-selector "#thank-you"
ego-webqa https://example.com --smoke-scope all --smoke-require-assertion \
--smoke-success-selector "#thank-you"
ego-webqa --dir examples/demo --config examples/webqa-demo-flow.json
ego-webqa https://example.com --profile accessibility
ego-webqa https://example.com --profile performance
ego-webqa https://example.com --profile full
退出码:
- 0:通过,或仅有警告
- 1:至少一个阻断性错误
- 2:调用无效,或浏览器/运行时故障
--viewports 接受 WIDTHxHEIGHT[:NAME][@TEXT_SCALE][~SAFE_BOTTOM_PX]。显式指定的视口会替换默认矩阵。文字缩放必须在 1.0 到 2.0 之间;模拟的底部安全区必须在 0 到 100px 之间。
--preset quick 选出四个两两均衡的移动端变体,用于快速智能体循环:每个宽度都覆盖两种文字缩放和两种安全区状态,而交叉的缩放/安全区组合按宽度交替。--preset full 显式选择默认的八变体矩阵。预设不能与 --viewports 组合使用。
每次运行都会写入自包含的证据。JSON 中的截图引用相对于报告目录,因此智能体和 CI 可以移动整个产物目录,无需重写路径:
webqa-report/
├── report.json
├── agent_summary.json
├── feedback_bundle.json
├── junit.xml
├── report.sarif
└── screenshots/
为要求报告完全干净的 CI 门禁加上 --fail-on-warn。
agent_summary.json 是面向智能体的精简视图。重复发现按注册维度聚合,因此同一根因跨多个视口只产生一个修复项,附带受影响的触发条件和可复现命令。MCP 调用方会收到同一份摘要,既有结构化内容,也有简短文本结果。
feedback_bundle.json 是外部反馈视图。默认包含维度 id、计数、脱敏后的视口几何信息、浏览器引擎和目标类型,但省略目标 URL、本地路径、自定义视口名称、选择器、页面文本、消息、原始证据、截图和配置内容。分享前请先审阅。如需为私有 issue 刻意补充上下文:
ego-webqa feedback --report webqa-report/report.json
ego-webqa feedback --report webqa-report/report.json \
--include-target --include-selectors --include-messages \
--out webqa-report/feedback-with-context.json
第一条命令在报告旁边重新生成默认 bundle。第二条是显式选择加入,可能包含页面敏感数据。
基线与回归门禁
将一次运行与已知良好的报告对比,无需维护截图。稳定指纹由注册维度及其选择器或根因组合而成:
ego-webqa https://your-preview.example \
--out .qa/current \
--baseline-report .qa/known-good/report.json \
--gate new
ego-webqa delta \
--baseline .qa/known-good/report.json \
--current .qa/current/report.json
运行会写入 delta.json,包含 new、persistent、changed 和 resolved 根因。--gate new 仅在以下情况失败:阻塞根因是新增的、变为阻塞、阻塞出现次数增加,或影响额外视口。已有的未解决阻塞仍会显示,但不会让未改动的构建再次失败。加上 --fail-on-warn 可同时门禁新增或变更的警告。
两份报告必须使用相同的目标源、配置档、视口矩阵、浏览器引擎和浏览器通道。有意进行跨目标或跨配置比较时,需要 --allow-target-change 和/或 --allow-configuration-change。这是确定性的发现差异,不是视觉回归基线。
每个修复项保留首个证据对象以保持兼容,并提供 evidence_by_viewport 映射以承载完整的跨视口证据。网络失败还会附带 failure_details,包含资源类型、frame URL、同源状态、重定向来源、HTTP 状态或浏览器错误,以及出现次数。所有上报的 URL 都会移除查询字符串和凭据。
检查项
阻断性错误:
- 页面横向溢出
- 放大文字后布局错乱
- 底部控件侵入设备安全区
- JavaScript 页面错误和 console.error
- 资源加载失败和 HTTP 错误
- 页面几乎空白
- 文字小于 10px 无法阅读
- 可见图片损坏
- canvas/图片/视频宽高比失真
- 主 CTA 失效
- 配置的 smoke-flow 目标或操作后断言失败
- 严重的意外布局偏移
警告:
- DOM 已渲染,但 load 事件超出限定截止时间
- 点击目标小于 44px
- 次要文字小于 12px
- 固定浮层过大
- 首次内容绘制过慢
- 中等布局偏移
- 首屏字节数或请求数过多
浏览器探测只报告事实。所有阈值和通过/失败判定都在 src/ego_webqa/config.py。
宽高比检查只评估渲染尺寸至少为 aspect_min_rendered_px(默认 48px)的媒体,避免小图标因像素取整产生噪声。
维度
问题代码属于一个封闭、带版本的注册表,位于 src/ego_webqa/dimensions.py。报告会拒绝未注册的代码,每条 Agent 摘要项都带有维度 id、版本、检测器和默认严重级别。文档和集成可以查询同一份事实来源,无需解析文字说明:
ego-webqa --list-dimensions
配置档
baseline 是默认交付配置档。它检查页面能否渲染、响应、适配视口,以及主操作是否可用。它有意把网络敏感的观测排除在交付门禁之外:首次绘制、 load 事件截止时间、网络空闲超时、传输/请求预算在 baseline 中都不会产生问题项。
performance 保留全部 baseline 检查,并增加这四项网络敏感观测。当审计在受控网络中运行,或调用方明确需要观测性的性能门禁时使用它。
accessibility 保留全部 baseline 检查,并增加以下确定性检查:
- 缺少文档语言或页面标题
- 控件没有可访问名称
- 可见图片缺少 alt 属性
- aria-hidden 容器内存在交互内容
- 重复 ID 和跳级标题
- 正数 tabindex 值覆盖自然焦点顺序
这个配置档能捕获常见的机器可检测缺陷。它不是 WCAG 合规审计,也不能替代键盘和辅助技术测试。
full 同时启用 baseline、performance 和 accessibility 三类检查。
原始计时数据在所有配置档下都保留在 report.json 中;所选配置档决定哪些已注册维度可以产生问题项。
配置
ego-webqa https://example.com --config examples/webqa.json
{
"profile": "full",
"viewport_preset": "full",
"min_tap_target_px": 44,
"min_font_px": 12,
"ready_selector": "#app-ready",
"wait_for_network_idle": true,
"smoke_mode": "safe",
"smoke_scope": "all",
"smoke_settle_ms": 800,
"smoke_require_assertion": true,
"smoke_success_selector": "#thank-you",
"smoke_success_url_pattern": "/complete$",
"ignore_selectors": [".third-party-chat-widget"],
"ignore_console_patterns": ["third-party-widget"],
"ignore_request_patterns": ["/analytics/"]
}
第一道关卡要跑四种变体,用 "viewport_preset": "quick";如果项目有专门的矩阵,就换成显式的 "viewports" 列表。预设和显式列表互斥,只能二选一。
主操作按钮的文字不在默认 CTA 词表里时,用 --smoke-selector "#checkout" 指定。安全冒烟模式会在初次加载后中止 HTTP 请求,并把隔离的浏览器上下文切到离线。只有确实需要真实副作用时才用 --smoke-mode live;连纯 DOM 点击都不想触发,就用 --no-smoke。
smoke_success_selector 和 smoke_success_url_pattern 用明确的点击后契约,替代笼统的「有东西变了」启发式判断。两个都配置时,必须双双从「未匹配」变为「匹配」。
smoke_scope 设为 all,会在每个视口里独立跑一遍 CTA。交付关卡不能把含糊的 DOM 变化当成成功,这种场景用 smoke_require_assertion。
有界冒烟流程
客户端路径较短时,smoke_flow 可以描述一串有序的确定性动作。它最多接受八个步骤,动作取自封闭集合:
- click:点击某个选择器;
- fill:填写某个选择器,值在报告中脱敏;
- press:在某个选择器上按键;
- expect_visible:要求某个选择器变为可见;
- expect_url:要求当前 URL 匹配正则表达式;
- expect_text:要求可见元素的渲染文本,或表单控件的当前值,匹配不区分大小写的正则表达式。
json
{
"smoke_mode": "safe",
"smoke_flow": [
{"action": "fill", "selector": "#email", "value": "qa@example.com"},
{"action": "click", "selector": "#continue"},
{"action": "expect_visible", "selector": "#success"},
{"action": "expect_url", "pattern": "#complete$"},
{"action": "expect_text", "selector": "#status", "pattern": "^Ready$"}
]
}
流程里必须包含 click、fill 或 press 动作,后面至少跟一条 expect_visible、expect_url 或 expect_text 断言。流程不能和单 CTA 的选择器/断言字段混用。默认的 safe 模式在初次页面加载后阻断 HTTP,所以除非显式把 smoke_mode 改成 live,流程只能做确定性的客户端行为。任意 JavaScript 和自定义检测器一律不接受。
expect_text 通过以下方式读取 input、textarea 和 select 的值 Playwright;其余元素一律使用可见元素渲染后的文本。隐藏的后代元素不算作已交付内容。报告保留模式、来源类型和观测长度,但绝不把观测到的文本复制进证据。这样文本断言保持确定性,又不会暴露输入页面的值。
流程失败时,report.json 会列出每个已完成的步骤、失败的步骤及其错误。智能体摘要会点名具体动作,而不是笼统地报告按钮失效。
项目可以在一个配置里保留多个封闭流程,并按名称选择一个: json { "smoke_flow_name": "checkout",
"smoke_flows": {
"login": [
{"action": "fill", "selector": "#email", "value": "qa@example.com"},
{"action": "click", "selector": "#continue"},
{"action": "expect_visible", "selector": "#welcome"}
],
"checkout": [
{"action": "click", "selector": "#buy"},
{"action": "expect_text", "selector": "#status", "pattern": "^paid$"}
]
}
}
流程名是封闭标识符,须匹配 [A-Za-z0-9][A-Za-z0-9._-]{0,63};最多接受 16 个定义。每个定义都会校验,但只运行选中的流程。smoke_flows 与单个内联的 smoke_flow 互斥;命名流程与单步的 smoke_selector / 成功断言也互斥,因为每个命名流程都必须自带交互和断言。用 --smoke-flow-name checkout 覆盖配置的默认值;报告会保留选中的名称,并像以前一样对 fill 值做脱敏。
SPA 内容在 load 事件之后才出现时,用 ready_selector。已知的第三方控制台和请求噪音可以用正则模式排除,同时不会掩盖基于 DOM 的发现。被忽略的响应不计入请求数和传输字节预算。报告会记录是否到达了就绪内容、字体和有界网络空闲。
带认证的预览
HTTP Basic 认证、请求头或已登录浏览器会话之后的预览,可以通过 JSON 配置或环境变量支持: bash
export EGO_WEBQA_HTTP_USERNAME=preview-user
export EGO_WEBQA_HTTP_PASSWORD=preview-password
export EGO_WEBQA_EXTRA_HTTP_HEADERS='{"X-Preview-Key":"agent-key"}'
ego-webqa "$PREVIEW_URL" --storage-state ./auth/storage-state.json
凭据和请求头值会从 JSON 报告中脱敏。通过环境变量传入还能让它们不出现在命令行的进程参数列表里。
平台与多智能体使用
审计引擎可在 Linux、macOS 和 Windows 上运行,需要 Python 3.10 或更高版本。CI 在三个操作系统上跑同一套测试。
每次 audit() 或命令行调用都独占自己的浏览器生命周期、浏览器上下文、静态本地服务器和输出目录。不存在共享的可变审计状态,因此多个智能体可以并发运行,只要各自提供唯一的 --out 目录: bash
ego-webqa "$PREVIEW_URL" --out "webqa/$AGENT_ID" --json \
--smoke-scope all --smoke-require-assertion \
--smoke-success-selector "#thank-you"
--json 打印与写入 report.json 的稳定载荷相同。schema_version 决定兼容性;JUnit 和 SARIF 由同一份内存中的问题列表派生。智能体应把退出码 0 视为通过/警告,1 视为阻断性问题,2 视为调用或浏览器失败。
八个公开 JSON 载荷都附带打包好的 Draft 2020-12 schema。用 ego-webqa --print-schema report 打印其中一个;名称与兼容策略见 docs/json-contracts.md。
一次审计中,最多三个视口在隔离的浏览器里并发渲染。这样能限制慢站点的实际耗时,同时视口之间不共享 cookie、网络状态、截图或可变证据。
MCP 服务器
在 AI 编码智能体里直接暴露这道门禁:
python -m pip install ego-webqa
ego-webqa setup
ego-webqa mcp
ego-webqa-mcp 仍作为兼容别名保留。MCP 客户端可以通过 stdio 启动任一命令。兼容 registry 的一次性形式是 uvx ego-webqa@0.8.2 mcp。服务器对外声明一个工具 audit_web_page,返回结构化的成功结果与阻断性错误结果:
{
"mcpServers": {
"ego-webqa": {
"command": "uvx",
"args": ["ego-webqa@0.8.2", "mcp"]
}
}
}
典型的工具参数如下:
{
"url": "http://127.0.0.1:5173",
"out_dir": ".qa/agent-a",
"config": "/workspace/webqa-flow.json",
"profile": "accessibility",
"browser_engine": "webkit",
"viewport_preset": "quick",
"smoke_flow_name": "checkout",
"smoke_scope": "all"
}
config 路径是 MCP 的集成点,用来配置有界的 smoke_flow 序列、带认证的请求、忽略策略,以及其他不必在每次工具调用里重复的设置。
报告状态为 fail 时,MCP 结果标记为错误,完整报告仍以结构化内容提供。认证环境变量由服务器进程读取,不作为工具参数传入。这个适配器刻意只做交付可用性门禁;它不是安全扫描器、WCAG 认证工具,也不是视觉回归系统。
受治理的值覆盖
项目可以临时调整某个已注册维度,而不必禁用该维度或添加任意断言。每次覆盖都需要负责人、原因和到期时间;它还可以改变生效的 block/warn 严重级别,并且只能使用该维度声明的、可安全覆盖的阈值:
{
"overrides": [
{
"dimension_id": "tiny_fonts",
"reason": "Typography migration tracked in DS-142",
"owner": "design-system",
"expires": "2026-11-30",
"severity": "warn",
"parameters": {
"min_font_px": 13
}
}
]
}
UTC 审计日期就是到期时钟。覆盖在其 expires 日期,次日自动回退到注册表默认值。未知维度、未知或不安全参数、重复维度条目,以及共享阈值的冲突值,都会被拒绝。
report.json 在每个受影响的 issue 中记录覆盖,并新增 governance 块,包含生效中和已过期的声明以及实际生效参数。agent_summary.json 携带相同的来源元数据,并报告 overridden_dimensions、downgraded_blocks 和 expired_overrides。JUnit 和 SARIF 使用实际生效的严重级别。过期覆盖仍保留可见以供审计,但不再改变检测结果或状态。参见 examples/webqa-governed.json。
DeepSeek Harness 可以通过独立的声明式 dsh-ego-webqa bundle 安装同一个 MCP 工具。它复用 DSH 原生 MCP 客户端,而不是再增加一套 QA 实现;边界与验收标准参见 docs/dsh-integration.md。
GitHub Actions
本仓库同时也是一个复合 GitHub Action。该 Action 从 Action ref 安装包,安装选定的浏览器引擎(默认 Chromium),运行审计,即使审计失败也上传报告,并向 job summary 写入一张简洁、隐私安全的根因表:
jobs:
delivery-qa:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: ROY32172310/qa@v0.8.2
with:
url: ${{ vars.PREVIEW_URL }}
browser-engine: webkit
profile: accessibility
viewport-preset: quick
smoke-flow-name: checkout
fail-on-warn: "true"
smoke-scope: all
baseline-report: .qa/known-good/report.json
delta-gate: new
http-username: ${{ secrets.PREVIEW_USERNAME }}
http-password: ${{ secrets.PREVIEW_PASSWORD }}
extra-http-headers: ${{ secrets.PREVIEW_HEADERS_JSON }}
artifact-name: webqa-${{ github.run_id }}
在本地检出本仓库时,checkout 之后使用 uses: ./。Action 的 safe smoke 模式是默认值;只有明确允许点击产生真实副作用时,才设置 smoke-mode: live。完整输入集参见 examples/github-action.yml 和 action.yml。@v0.8.2 标签只在同一提交通过完整跨平台 CI 矩阵后才创建。
Python API
from ego_webqa import Settings, SmokeStep, audit
settings = Settings(
smoke_flow=(
SmokeStep("click", selector="#continue"),
SmokeStep("expect_visible", selector="#success"),
)
)
report = audit("https://example.com", settings=settings, output_dir="qa")
print(report.status)
范围与独立性
这是一道确定性的粗粒度闸门,用来拦截明显的交付失败。有界 smoke flow 可以证明:一条配置好的短客户端路径能够到达其声明的可见状态、文本/值或 URL;它不证明业务正确性,不证明所有受支持的浏览器都表现一致,也不证明页面安全。
固定报告范围:
本报告仅覆盖多终端几何与基础体验的确定性粗检;业务主路径、跨浏览器兼容、安全合规需另行验证。
本仓库是对通用交付检查的独立提取,这些检查最初在 ego 项目内得到验证。它不依赖 ego_protocol、ego_uri、ego 分享、部署、小程序或产品外壳语义。产品特有的检查应放在插件里,而不是核心中。
基准与可信度
仓库把受控的本地回归基准与真实公网观测分开:
- benchmarks/ 在窄屏、移动端、平板和桌面变体上运行 128 个独立合成用例。它是串行 Chromium 延迟基线,也是全部 38 个已注册维度的正确性语料。
- dogfood/ 运行固定的真实页面样本,分别报告 url 和 local 结果。它属于观测证据,不是延迟阈值,因为网络和目标站点行为的变化不受工具控制。
基准场景逐一声明基准真值;评估器不导入检测器阈值来判断结果是否正确。
python benchmarks/run.py
评估器报告精确维度匹配、用例 precision/recall/F1、阻断级误报率与漏报率、维度级 TP/FP/FN,以及完整审计延迟。它写出机器可读证据和 Markdown 摘要。0.7.0 基线在串行本地 Chromium 下为 128/128 精确匹配,阻断级 FP/FN 为 0%,P50 357ms,P95 1147ms,最大 3615ms: docs/benchmark-2026-10-30-v0.7.0.md。
这些结果衡量的是 Chromium 中精选的合成夹具,不是真实站点覆盖率,也不是跨引擎一致性。Firefox 和 WebKit 另有一套真实浏览器 CI 夹具,覆盖干净页面和确定性溢出失败。基准的价值在于回归压力:首次运行就暴露了 accessibility 配置档在标准 标记上的真实崩溃,以及重复的 CTA 根因报告;两者都在记录基线之前修复。测量契约和两类证据见 docs/performance-baselines.md。
开发
uv sync --locked --all-extras
uv run --locked ego-webqa setup
uv run --locked python scripts/dev.py test
uv run --locked python scripts/dev.py coverage
uv run --locked python scripts/dev.py lint
uv run --locked python scripts/dev.py format-check
uv run --locked python scripts/dev.py typecheck
uv run --locked python scripts/dev.py benchmark
uv run --locked python scripts/dev.py package
uv run --locked python scripts/dev.py check # lint + format + MyPy + coverage
uv run --locked python scripts/dev.py full # check + Chromium benchmark
GitHub Actions 使用同一个 scripts/dev.py 入口和锁文件在 Linux、macOS 和 Windows 上,防止本地与 CI 的依赖或命令出现漂移。覆盖率强制要求行/分支不低于 90%。新增规则前先看 CONTRIBUTING.md。每条规则都要有正向对照和实际观察到的失败模式。
许可证
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
ROY32172310/qa
用真实浏览器给网页做移动端交付质检并留下证据
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,891已汉化DeepSeek 客户端
74.4
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,884已汉化DSH
72.2
花束设计alchaincyf/huashu-design
一句话生成网页、原型、PPT 与信息图等可交付设计
★ 28,638已汉化DSH
71.7
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,410已汉化DSH
71.7
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,330已汉化DSH
71.3
这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。