mcpField
V
verify-keyboard-access

verify-keyboard-access

github.com/reticlehq测试与质量1.3k64 次安装今天更新
代码仓库

关于 verify-keyboard-access

这是用于 Reticle 的技能,可检查运行中 Web 应用的键盘焦点和主要操作。它区分可验证的结果与未知项,包括 Tab 顺序。

主要功能

  1. 01检查列表中每个控件能否聚焦
  2. 02用键盘触发主要操作
  3. 03确认此前尚未成立的结果
  4. 04将 Tab 顺序标记为未知
  5. 05将不健康会话标记为受阻

适用场景

  1. 01检查控件是否响应 Enter 或 Space
  2. 02验证表单控件能否获得焦点
  3. 03记录节流或超时造成的限制

MCP 相关

此技能使用 Reticle 工具检查和操作运行中的应用;输入未说明它提供 MCP 服务。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/reticlehq/reticle --skill verify-keyboard-access

安装后在 Claude Code 中输入/verify-keyboard-access确认已加载。

详细介绍

可到达不等于可操作

样式设置得像按钮的 <div onClick> 看起来可能可以到达(不少组件库会自动提供 tabindex="0"),但按 Enter 时仍然毫无反应。能够获得焦点只能证明控件可以到达,不能证明它能正常工作。

Reticle 可以在运行中的应用里验证这两方面。还没配置?请按照 reticle 技能操作:它会安装 Reticle,在 init 更改应用文件之前征求用户同意,并验证一个工作流。

开始前请先阅读:目前无法验证 Tab 顺序

press 始终通过合成键盘事件触发,而合成的 Tab 不会移动焦点。所有模式都如此,包括 reticle drive:没有任何模式能让 Agent 验证焦点顺序。不要尝试寻找这种模式,也不要将 Tab 顺序结果报告为通过或失败,应报告为未知。

这项技能能验证的范围较窄:每个控件都可以获得焦点,并且其主要操作可以通过键盘触发。

确认会话状态正常

确认页面存在活动会话,并且可以渲染和观察:

reticle_session({ action: "list" })

在已断开连接、隐藏或受限流的标签页中,按键可能会被接受,但计时器、渲染和后续观察都不会继续,因此读回的内容都不可信。请先获取可用上下文,例如租用一个标签页:

reticle_run({ tool: "reticle_lease", args: { action: "acquire", url } })

在操作中传入 refuseWhenThrottled: true,这样暂停的标签页会明确报错,而不是静默无响应。如果无法获取状态正常的会话,应将运行结果报告为受阻,而不是通过;也不要继续针对该会话重试。

列出控件

在操作键盘之前列出所有交互式控件,否则你只会测试已知的控件:

reticle_look({ sessionId, action: "page", mode: "interactive" })

检查每个控件是否可以获得焦点

对列表中的每个控件,将焦点移至该控件并断言它已获得焦点:

reticle_act({ sessionId, ref, action: "focus" })
reticle_assert({
  sessionId,
  predicate: { kind: "element", query: { testid: "the-control" }, state: "focused" },
})

这能证明控件可以获得焦点,但不能证明控件位于 Tab 顺序中(tabindex="-1" 可以获得焦点,但会被 Tab 跳过),因此应报告为可聚焦,而不是 Tab 可到达。没有 tabindex 的 <div onClick> 无法获得焦点,这是一个确实存在的问题。

验证主要操作,而不只是焦点

焦点是前提条件,不是检查内容。先明确操作结果,再用键盘触发:

reticle_act_and_wait({
  sessionId,
  ref,
  action: "press",
  args: { text: "Enter" },
  until: { kind: "element", query: { testid: "expected-result" } },
})

按钮和链接使用 Enter。复选框和原生 <select> 使用 Space,选项还可以使用方向键。对表单控件触发合成 Enter 确实会提交表单,因此可以在此检查按 Enter 提交。自定义样式的组合框最容易出问题:它看起来与原生控件完全相同,却常常只监听 click。请按下按键。不要改用点击,并假设键盘操作也会有相同效果。

until 条件在操作前就可能已经为真,此时 already_true 无法证明你的按键产生了效果。先确认相应结果尚未出现。如果已经出现,请重置应用状态并重新开始,或将结果报告为无法确定。如果要求文本变为可见,请使用要求其可见的谓词,因为隐藏元素也满足存在性检查。使用 reticle_tools({ names: ["reticle_act_and_wait"] }) 加载确切字段,不要猜测。

应断言的内容

  1. 初步查看中发现的每个控件都可以获得焦点,分别通过 focus 操作和 state: "focused" 断言进行验证。
  2. 主要操作可以通过键盘触发,通过 reticle_act_and_wait({ until }) 验证,并明确指出一个此前尚未出现的结果。

Tab 顺序和焦点陷阱不在此列。目前两者都无法验证,因此都应报告为未知,绝不能报告为通过。

诚实

将每项结果报告为 已验证(Reticle 针对确切条件返回了肯定判定)、失败、受阻(没有健康会话)或 未知。verified: "unknown" 或 verified: "no-fault" 的判定不算通过。unknown 表示 Reticle 无法判断发生了什么。请如实报告,不要弱化检查来使其通过。观察到的证据不等于经过验证的结果,already_true 不能证明后果是由你的操作导致的,而已派发但始终未完成的按键不算完成了一次交互。

最后说明发现了哪些控件、哪些控件获得了焦点、你按下了哪个键以及等待的确切后果、Reticle 返回的判定、Tab 顺序未知,以及任何限制结果的节流或超时。


能力参考:curl https://docs.reticle.sh/capabilities.md。其他内容:curl https://docs.reticle.sh/llms.txt。

评论

支持 Markdown