关于 verify-keyboard-access
这是用于 Reticle 的技能,可检查运行中 Web 应用的键盘焦点和主要操作。它区分可验证的结果与未知项,包括 Tab 顺序。
主要功能
- 01检查列表中每个控件能否聚焦
- 02用键盘触发主要操作
- 03确认此前尚未成立的结果
- 04将 Tab 顺序标记为未知
- 05将不健康会话标记为受阻
适用场景
- 01检查控件是否响应 Enter 或 Space
- 02验证表单控件能否获得焦点
- 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"] }) 加载确切字段,不要猜测。
应断言的内容
- 初步查看中发现的每个控件都可以获得焦点,分别通过
focus操作和state: "focused"断言进行验证。 - 主要操作可以通过键盘触发,通过
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。