@crowecawcaw/xa11y (英语)
用于Node.js的跨平台无障碍库. 一个API用于macOS,Windows,
和 Linux —— 建在 Rust上方 xa11y
箱子,通过 美洲狮。 。 。 .
使用大小写 : UI 测试, AI代理工具, 桌面自动化, 可访问性 审计.
文档 • 妇女 Java 脚本 API • 妇女 烂API • 妇女 Python API 密码
快速实例
import { App } from '@crowecawcaw/xa11y';
const safari = await App.byName('Safari');
// Find elements with CSS-like selectors via locator
for (const button of await safari.locator('button').elements()) {
console.log(button.name);
}
// Interact with elements (re-resolves on every call)
await safari.locator('button[name="Submit"]').press();
await safari.locator('text_field[name^="Search"]').setValue('hello world');
安装
npm install @crowecawcaw/xa11y
要求节点.js 18或更新. 为 Linux (x64/arm64), macOS (x64/arm64), 和 Windows (x64/arm64).
马可斯: 授予您的终端( 或运行节点的进程) 2 权限 内 系统设置 ~ 隐私和安全数字 : 无障碍 财务报告和审定财务报表 屏幕 系统音频记录( S) (macOS 26+). 无障碍让xa11y读取 AX 树。 二是需要读取窗口内容. 没有它,只有菜单 栏是可见的。 关于macOS 27和较新的,无障碍提供生活 设备控制和数据访问 窗关.
默认自动同步
触摸无障碍树的每个操作都是同步运行的
因此,节点事件循环永远不会被阻断。 财产获取器
打开 Element 截图是同步的,因为数据在前面被捕获.
const app = await App.byName('com.example.MyApp');
const submit = await app.locator('button[name="Submit"]').element();
console.log(submit.role); // sync — already captured
console.log(submit.enabled); // sync
await submit.children(); // async — re-queries the provider
自动等待定位器
行动方法 Locator 在元素出现之前对树进行投票 可见 财务报告和审定财务报表
启用最多5秒钟的预算,然后才采取行动。 这样一来
测试对UI的适应能力 同步地充斥.
// Waits until the dialog appears AND its OK button is enabled, then clicks it.
await app.locator('dialog[name="Save Changes?"] button[name="OK"]').press();
订阅事件
订阅扩展节点 EventEmitter这样你就可以使用熟悉的
.on() 编号 : .once() 编号 : .off() API (英语). 事件在以下两种情况下都被释放:
特定类型名称和覆盖 'event' 名称。 打电话 close() (或
通过一个 AbortSignal),以拆掉订阅.
const sub = await app.subscribe();
sub.on('focusChanged', (ev) => console.log('focus moved to', ev.target?.name));
sub.on('event', (ev) => console.log(ev.type, ev.appName));
// ... later
sub.close();
等待一个单一的事件
使用 waitForEvent() 用于 Playwright 风格的一发相等选项
上游和超时 :
const [opened] = await Promise.all([
app.waitForEvent('windowOpened'),
app.locator('button[name="Settings"]').press(),
]);
// With predicate + timeout
const ev = await sub.waitForEvent('focusChanged', {
predicate: (e) => e.target?.role === 'button',
timeout: 3000,
});
中止符号支持
两者 subscribe() 财务报告和审定财务报表 waitForEvent() 接受一个 AbortSignal 页:1
取消 :
const ctrl = new AbortController();
const sub = await app.subscribe({ signal: ctrl.signal });
sub.on('focusChanged', (ev) => { /* ... */ });
// ctrl.abort() closes the subscription automatically
错误
所有操作投放子类 XA11yError数字 :
| 类 | 何时 |
|---|---|
PermissionDeniedError | 未获得无障碍许可(macOS) |
SelectorNotMatchedError | element() / 动作未找到 |
ActionNotSupportedError | 元素不支持动作 |
TimeoutError | A 类 wait* 或自动等待预算已过期 |
InvalidSelectorError | 错误的选择器或动作数据 |
PlatformError | 其他操作系统级失败 |
抓住一个特定的子类,让其余的传播:
import { App, SelectorNotMatchedError } from '@crowecawcaw/xa11y';
try {
await app.locator('button[name="Submit"]').press();
} catch (err) {
if (err instanceof SelectorNotMatchedError) {
/* expected miss */
} else {
throw err;
}
}
许可证
麻省理工学院——见 自由主义。 。 。 .