browser-debugger-cli 0.6.1 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -0
- package/dist/__tests__/smoke/error-handling.smoke.test.js +9 -4
- package/dist/__tests__/smoke/error-handling.smoke.test.js.map +1 -1
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.js +27 -24
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.js.map +1 -1
- package/dist/__testutils__/daemonHelpers.d.ts +13 -1
- package/dist/__testutils__/daemonHelpers.d.ts.map +1 -1
- package/dist/__testutils__/daemonHelpers.js +54 -5
- package/dist/__testutils__/daemonHelpers.js.map +1 -1
- package/dist/cdp/protocol.d.ts.map +1 -1
- package/dist/cdp/protocol.js +9 -7
- package/dist/cdp/protocol.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +21 -6
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/dom/a11y.d.ts +18 -0
- package/dist/commands/dom/a11y.d.ts.map +1 -0
- package/dist/commands/dom/a11y.js +134 -0
- package/dist/commands/dom/a11y.js.map +1 -0
- package/dist/commands/dom/evalHelpers.js +1 -1
- package/dist/commands/dom/evalHelpers.js.map +1 -1
- package/dist/commands/dom/index.d.ts.map +1 -1
- package/dist/commands/dom/index.js +41 -20
- package/dist/commands/dom/index.js.map +1 -1
- package/dist/commands/peek.d.ts.map +1 -1
- package/dist/commands/peek.js +2 -0
- package/dist/commands/peek.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +12 -4
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/types.d.ts +3 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -1
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.d.ts +19 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.d.ts.map +1 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.js +212 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.js.map +1 -0
- package/dist/daemon/launcher.d.ts.map +1 -1
- package/dist/daemon/launcher.js +4 -3
- package/dist/daemon/launcher.js.map +1 -1
- package/dist/daemon/lifecycle/workerCleanup.d.ts.map +1 -1
- package/dist/daemon/lifecycle/workerCleanup.js +1 -1
- package/dist/daemon/lifecycle/workerCleanup.js.map +1 -1
- package/dist/daemon/services/SessionService.js +1 -1
- package/dist/daemon/services/SessionService.js.map +1 -1
- package/dist/ipc/__tests__/client.contract.test.js +251 -19
- package/dist/ipc/__tests__/client.contract.test.js.map +1 -1
- package/dist/ipc/__tests__/jsonl.unit.test.js +19 -1
- package/dist/ipc/__tests__/jsonl.unit.test.js.map +1 -1
- package/dist/ipc/transport/jsonl.d.ts +16 -0
- package/dist/ipc/transport/jsonl.d.ts.map +1 -1
- package/dist/ipc/transport/jsonl.js +25 -0
- package/dist/ipc/transport/jsonl.js.map +1 -1
- package/dist/session/chrome.js +2 -2
- package/dist/session/chrome.js.map +1 -1
- package/dist/session/cleanup.d.ts +21 -0
- package/dist/session/cleanup.d.ts.map +1 -1
- package/dist/session/cleanup.js +101 -1
- package/dist/session/cleanup.js.map +1 -1
- package/dist/session/lock.js +1 -1
- package/dist/session/lock.js.map +1 -1
- package/dist/telemetry/__tests__/a11y.unit.test.d.ts +10 -0
- package/dist/telemetry/__tests__/a11y.unit.test.d.ts.map +1 -0
- package/dist/telemetry/__tests__/a11y.unit.test.js +265 -0
- package/dist/telemetry/__tests__/a11y.unit.test.js.map +1 -0
- package/dist/telemetry/a11y.d.ts +78 -0
- package/dist/telemetry/a11y.d.ts.map +1 -0
- package/dist/telemetry/a11y.js +280 -0
- package/dist/telemetry/a11y.js.map +1 -0
- package/dist/telemetry/dom.d.ts +1 -1
- package/dist/telemetry/dom.d.ts.map +1 -1
- package/dist/telemetry/dom.js +32 -1
- package/dist/telemetry/dom.js.map +1 -1
- package/dist/types.d.ts +77 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/formatters/__tests__/semantic.unit.test.d.ts +2 -0
- package/dist/ui/formatters/__tests__/semantic.unit.test.d.ts.map +1 -0
- package/dist/ui/formatters/__tests__/semantic.unit.test.js +111 -0
- package/dist/ui/formatters/__tests__/semantic.unit.test.js.map +1 -0
- package/dist/ui/formatters/a11y.d.ts +30 -0
- package/dist/ui/formatters/a11y.d.ts.map +1 -0
- package/dist/ui/formatters/a11y.js +178 -0
- package/dist/ui/formatters/a11y.js.map +1 -0
- package/dist/ui/formatters/preview.d.ts +2 -0
- package/dist/ui/formatters/preview.d.ts.map +1 -1
- package/dist/ui/formatters/preview.js +27 -4
- package/dist/ui/formatters/preview.js.map +1 -1
- package/dist/ui/formatters/semantic.d.ts +36 -0
- package/dist/ui/formatters/semantic.d.ts.map +1 -0
- package/dist/ui/formatters/semantic.js +98 -0
- package/dist/ui/formatters/semantic.js.map +1 -0
- package/dist/ui/formatters/status.js +1 -1
- package/dist/ui/formatters/status.js.map +1 -1
- package/dist/ui/messages/commands.d.ts +7 -0
- package/dist/ui/messages/commands.d.ts.map +1 -1
- package/dist/ui/messages/commands.js +9 -0
- package/dist/ui/messages/commands.js.map +1 -1
- package/dist/utils/__tests__/errors.unit.test.d.ts +12 -0
- package/dist/utils/__tests__/errors.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/errors.unit.test.js +255 -0
- package/dist/utils/__tests__/errors.unit.test.js.map +1 -0
- package/dist/utils/__tests__/http.unit.test.d.ts +12 -0
- package/dist/utils/__tests__/http.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/http.unit.test.js +218 -0
- package/dist/utils/__tests__/http.unit.test.js.map +1 -0
- package/dist/utils/__tests__/process.unit.test.d.ts +14 -0
- package/dist/utils/__tests__/process.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/process.unit.test.js +124 -0
- package/dist/utils/__tests__/process.unit.test.js.map +1 -0
- package/dist/utils/__tests__/session.contract.test.js +1 -1
- package/dist/utils/__tests__/session.contract.test.js.map +1 -1
- package/package.json +22 -1
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { callCDP } from '../ipc/client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Builds accessibility tree from raw CDP nodes.
|
|
4
|
+
*
|
|
5
|
+
* Pure function that filters out ignored nodes and builds the tree structure.
|
|
6
|
+
* Separated from collectA11yTree for easier unit testing.
|
|
7
|
+
*
|
|
8
|
+
* @param rawNodes - Raw AXNode array from CDP
|
|
9
|
+
* @returns Parsed accessibility tree
|
|
10
|
+
* @throws Error if no root node found
|
|
11
|
+
*/
|
|
12
|
+
export function buildTreeFromRawNodes(rawNodes) {
|
|
13
|
+
const nodes = new Map();
|
|
14
|
+
let root = null;
|
|
15
|
+
for (const rawNode of rawNodes) {
|
|
16
|
+
if (rawNode.ignored) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const node = parseA11yNode(rawNode);
|
|
20
|
+
nodes.set(node.nodeId, node);
|
|
21
|
+
root ??= node;
|
|
22
|
+
}
|
|
23
|
+
if (!root) {
|
|
24
|
+
throw new Error('No root node found in accessibility tree');
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
root,
|
|
28
|
+
nodes,
|
|
29
|
+
count: nodes.size,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Collects the full accessibility tree from the page via IPC.
|
|
34
|
+
*
|
|
35
|
+
* Uses the worker's persistent CDP connection through callCDP for consistency
|
|
36
|
+
* with other DOM commands and to avoid connection conflicts.
|
|
37
|
+
*
|
|
38
|
+
* @returns Parsed and filtered accessibility tree
|
|
39
|
+
* @throws Error if CDP Accessibility domain fails
|
|
40
|
+
*/
|
|
41
|
+
export async function collectA11yTree() {
|
|
42
|
+
await callCDP('Accessibility.enable', {});
|
|
43
|
+
try {
|
|
44
|
+
const response = await callCDP('Accessibility.getFullAXTree', {});
|
|
45
|
+
const result = response.data?.result;
|
|
46
|
+
if (!result?.nodes) {
|
|
47
|
+
throw new Error('Failed to get accessibility tree');
|
|
48
|
+
}
|
|
49
|
+
return buildTreeFromRawNodes(result.nodes);
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
await callCDP('Accessibility.disable', {});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parses raw CDP AXNode into simplified A11yNode format.
|
|
57
|
+
*
|
|
58
|
+
* Extracts key properties (role, name, description, value) and common
|
|
59
|
+
* ARIA properties (focusable, focused, disabled, required).
|
|
60
|
+
*
|
|
61
|
+
* @param rawNode - Raw AXNode from CDP
|
|
62
|
+
* @returns Simplified A11yNode
|
|
63
|
+
*/
|
|
64
|
+
function parseA11yNode(rawNode) {
|
|
65
|
+
const node = {
|
|
66
|
+
nodeId: rawNode.nodeId,
|
|
67
|
+
role: extractRole(rawNode),
|
|
68
|
+
};
|
|
69
|
+
if (rawNode.name?.value) {
|
|
70
|
+
node.name = String(rawNode.name.value);
|
|
71
|
+
}
|
|
72
|
+
if (rawNode.description?.value) {
|
|
73
|
+
node.description = String(rawNode.description.value);
|
|
74
|
+
}
|
|
75
|
+
if (rawNode.value?.value) {
|
|
76
|
+
node.value = String(rawNode.value.value);
|
|
77
|
+
}
|
|
78
|
+
if (rawNode.properties) {
|
|
79
|
+
const props = {};
|
|
80
|
+
for (const prop of rawNode.properties) {
|
|
81
|
+
if (prop.name === 'focusable') {
|
|
82
|
+
node.focusable = prop.value.value === true;
|
|
83
|
+
}
|
|
84
|
+
else if (prop.name === 'focused') {
|
|
85
|
+
node.focused = prop.value.value === true;
|
|
86
|
+
}
|
|
87
|
+
else if (prop.name === 'disabled') {
|
|
88
|
+
node.disabled = prop.value.value === true;
|
|
89
|
+
}
|
|
90
|
+
else if (prop.name === 'required') {
|
|
91
|
+
node.required = prop.value.value === true;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
props[prop.name] = prop.value.value;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (Object.keys(props).length > 0) {
|
|
98
|
+
node.properties = props;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (rawNode.childIds && rawNode.childIds.length > 0) {
|
|
102
|
+
node.childIds = rawNode.childIds;
|
|
103
|
+
}
|
|
104
|
+
if (rawNode.backendDOMNodeId) {
|
|
105
|
+
node.backendDOMNodeId = rawNode.backendDOMNodeId;
|
|
106
|
+
}
|
|
107
|
+
return node;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Extracts role string from AXNode.
|
|
111
|
+
*
|
|
112
|
+
* Prefers explicit role over Chrome internal role.
|
|
113
|
+
*
|
|
114
|
+
* @param rawNode - Raw AXNode from CDP
|
|
115
|
+
* @returns Role string (e.g., 'button', 'textbox', 'heading')
|
|
116
|
+
*/
|
|
117
|
+
function extractRole(rawNode) {
|
|
118
|
+
if (rawNode.role?.value) {
|
|
119
|
+
return String(rawNode.role.value);
|
|
120
|
+
}
|
|
121
|
+
return 'unknown';
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Queries accessibility tree by pattern (role, name, description).
|
|
125
|
+
*
|
|
126
|
+
* Performs case-insensitive matching with AND logic for multiple fields.
|
|
127
|
+
*
|
|
128
|
+
* @param tree - Accessibility tree to search
|
|
129
|
+
* @param pattern - Query pattern with optional role, name, description
|
|
130
|
+
* @returns Query result with matching nodes
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```typescript
|
|
134
|
+
* // Find submit buttons
|
|
135
|
+
* queryA11yTree(tree, { role: 'button', name: 'Submit' });
|
|
136
|
+
*
|
|
137
|
+
* // Find all textboxes
|
|
138
|
+
* queryA11yTree(tree, { role: 'textbox' });
|
|
139
|
+
*
|
|
140
|
+
* // Find by name only
|
|
141
|
+
* queryA11yTree(tree, { name: 'Email' });
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export function queryA11yTree(tree, pattern) {
|
|
145
|
+
const matches = [];
|
|
146
|
+
for (const node of tree.nodes.values()) {
|
|
147
|
+
if (matchesPattern(node, pattern)) {
|
|
148
|
+
matches.push(node);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
nodes: matches,
|
|
153
|
+
count: matches.length,
|
|
154
|
+
pattern,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Checks if a node matches the query pattern.
|
|
159
|
+
*
|
|
160
|
+
* All specified fields must match (AND logic).
|
|
161
|
+
* String matching is case-insensitive.
|
|
162
|
+
*
|
|
163
|
+
* @param node - A11y node to test
|
|
164
|
+
* @param pattern - Query pattern
|
|
165
|
+
* @returns True if node matches all pattern criteria
|
|
166
|
+
*/
|
|
167
|
+
function matchesPattern(node, pattern) {
|
|
168
|
+
if (pattern.role) {
|
|
169
|
+
if (node.role.toLowerCase() !== pattern.role.toLowerCase()) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (pattern.name) {
|
|
174
|
+
if (!node.name) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
if (!node.name.toLowerCase().includes(pattern.name.toLowerCase())) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (pattern.description) {
|
|
182
|
+
if (!node.description) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
if (!node.description.toLowerCase().includes(pattern.description.toLowerCase())) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Parses query pattern string into A11yQueryPattern object.
|
|
193
|
+
*
|
|
194
|
+
* Supports format: "role:button name:Submit description:Main"
|
|
195
|
+
* Fields are separated by spaces, case-insensitive.
|
|
196
|
+
*
|
|
197
|
+
* @param patternString - Query pattern string
|
|
198
|
+
* @returns Parsed query pattern
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```typescript
|
|
202
|
+
* parseQueryPattern('role:button name:Submit')
|
|
203
|
+
* // => { role: 'button', name: 'Submit' }
|
|
204
|
+
*
|
|
205
|
+
* parseQueryPattern('role:textbox')
|
|
206
|
+
* // => { role: 'textbox' }
|
|
207
|
+
*
|
|
208
|
+
* parseQueryPattern('name:Email')
|
|
209
|
+
* // => { name: 'Email' }
|
|
210
|
+
* ```
|
|
211
|
+
*/
|
|
212
|
+
export function parseQueryPattern(patternString) {
|
|
213
|
+
const pattern = {};
|
|
214
|
+
const parts = patternString.trim().split(/\s+/);
|
|
215
|
+
for (const part of parts) {
|
|
216
|
+
const [key, ...valueParts] = part.split(':');
|
|
217
|
+
const value = valueParts.join(':');
|
|
218
|
+
if (!value) {
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (!key) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const normalizedKey = key.toLowerCase();
|
|
225
|
+
if (normalizedKey === 'role') {
|
|
226
|
+
pattern.role = value;
|
|
227
|
+
}
|
|
228
|
+
else if (normalizedKey === 'name') {
|
|
229
|
+
pattern.name = value;
|
|
230
|
+
}
|
|
231
|
+
else if (normalizedKey === 'description' || normalizedKey === 'desc') {
|
|
232
|
+
pattern.description = value;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return pattern;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Gets accessibility properties for a DOM node by CSS selector via IPC.
|
|
239
|
+
*
|
|
240
|
+
* Uses the worker's persistent CDP connection through callCDP for consistency.
|
|
241
|
+
*
|
|
242
|
+
* @param selector - CSS selector
|
|
243
|
+
* @returns A11y node or null if not found
|
|
244
|
+
* @throws Error if selector is invalid or element not found
|
|
245
|
+
*/
|
|
246
|
+
export async function getA11yNodeBySelector(selector) {
|
|
247
|
+
await callCDP('Accessibility.enable', {});
|
|
248
|
+
try {
|
|
249
|
+
const docResponse = await callCDP('DOM.getDocument', {});
|
|
250
|
+
const doc = docResponse.data?.result;
|
|
251
|
+
if (!doc?.root?.nodeId) {
|
|
252
|
+
throw new Error('Failed to get document root');
|
|
253
|
+
}
|
|
254
|
+
const nodeResponse = await callCDP('DOM.querySelector', {
|
|
255
|
+
nodeId: doc.root.nodeId,
|
|
256
|
+
selector,
|
|
257
|
+
});
|
|
258
|
+
const nodeResult = nodeResponse.data?.result;
|
|
259
|
+
if (!nodeResult?.nodeId) {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
const a11yResponse = await callCDP('Accessibility.getPartialAXTree', {
|
|
263
|
+
nodeId: nodeResult.nodeId,
|
|
264
|
+
fetchRelatives: false,
|
|
265
|
+
});
|
|
266
|
+
const a11yResult = a11yResponse.data?.result;
|
|
267
|
+
if (!a11yResult?.nodes) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
const rawNode = a11yResult.nodes.find((n) => !n.ignored);
|
|
271
|
+
if (!rawNode) {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
return parseA11yNode(rawNode);
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
await callCDP('Accessibility.disable', {});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=a11y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y.js","sourceRoot":"","sources":["../../src/telemetry/a11y.ts"],"names":[],"mappings":"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"}
|
package/dist/telemetry/dom.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export declare function prepareDOMCollection(cdp: CDPConnection): Promise<Cleanu
|
|
|
15
15
|
* Called during session shutdown to get the final state of the page.
|
|
16
16
|
*
|
|
17
17
|
* @param cdp - CDP connection instance
|
|
18
|
-
* @returns DOM data including URL, title, and
|
|
18
|
+
* @returns DOM data including URL, title, full HTML, and A11y tree
|
|
19
19
|
*/
|
|
20
20
|
export declare function collectDOM(cdp: CDPConnection): Promise<DOMData>;
|
|
21
21
|
//# sourceMappingURL=dom.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/telemetry/dom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/telemetry/dom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAY,MAAM,SAAS,CAAC;AASlE;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAcvF;AAmGD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBrE"}
|
package/dist/telemetry/dom.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getErrorMessage } from '../connection/errors.js';
|
|
2
2
|
import { createLogger } from '../ui/logging/index.js';
|
|
3
|
+
import { buildTreeFromRawNodes } from './a11y.js';
|
|
3
4
|
import { withTimeout } from './utils.js';
|
|
4
5
|
const log = createLogger('dom');
|
|
5
6
|
const CDP_TIMEOUT = 5000;
|
|
@@ -65,13 +66,41 @@ async function getDocumentTitle(cdp) {
|
|
|
65
66
|
}
|
|
66
67
|
return 'Untitled';
|
|
67
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Capture accessibility tree from the current page.
|
|
71
|
+
*
|
|
72
|
+
* @param cdp - CDP connection instance
|
|
73
|
+
* @returns A11y tree with nodes serialized as plain object, or undefined on error
|
|
74
|
+
*/
|
|
75
|
+
async function collectA11yTree(cdp) {
|
|
76
|
+
try {
|
|
77
|
+
await cdp.send('Accessibility.enable');
|
|
78
|
+
const response = (await withTimeout(cdp.send('Accessibility.getFullAXTree', {}), CDP_TIMEOUT, 'Accessibility.getFullAXTree'));
|
|
79
|
+
if (!response.nodes) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const tree = buildTreeFromRawNodes(response.nodes);
|
|
83
|
+
await cdp.send('Accessibility.disable').catch(() => {
|
|
84
|
+
/* Ignore errors */
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
root: tree.root,
|
|
88
|
+
nodes: Object.fromEntries(tree.nodes),
|
|
89
|
+
count: tree.count,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
log.debug(`A11y tree capture failed: ${getErrorMessage(error)}`);
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
68
97
|
/**
|
|
69
98
|
* Capture a complete DOM snapshot of the current page.
|
|
70
99
|
*
|
|
71
100
|
* Called during session shutdown to get the final state of the page.
|
|
72
101
|
*
|
|
73
102
|
* @param cdp - CDP connection instance
|
|
74
|
-
* @returns DOM data including URL, title, and
|
|
103
|
+
* @returns DOM data including URL, title, full HTML, and A11y tree
|
|
75
104
|
*/
|
|
76
105
|
export async function collectDOM(cdp) {
|
|
77
106
|
try {
|
|
@@ -79,10 +108,12 @@ export async function collectDOM(cdp) {
|
|
|
79
108
|
const outerHTML = await getOuterHTML(cdp, root.nodeId);
|
|
80
109
|
const frame = await getMainFrame(cdp);
|
|
81
110
|
const title = await getDocumentTitle(cdp);
|
|
111
|
+
const a11yTree = await collectA11yTree(cdp);
|
|
82
112
|
return {
|
|
83
113
|
url: frame.url,
|
|
84
114
|
title,
|
|
85
115
|
outerHTML,
|
|
116
|
+
...(a11yTree && { a11yTree }),
|
|
86
117
|
};
|
|
87
118
|
}
|
|
88
119
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/telemetry/dom.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/telemetry/dom.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -10,6 +10,11 @@ export interface DOMData {
|
|
|
10
10
|
url: string;
|
|
11
11
|
title: string;
|
|
12
12
|
outerHTML: string;
|
|
13
|
+
a11yTree?: {
|
|
14
|
+
root: A11yNode;
|
|
15
|
+
nodes: Record<string, A11yNode>;
|
|
16
|
+
count: number;
|
|
17
|
+
};
|
|
13
18
|
}
|
|
14
19
|
export interface NetworkRequest {
|
|
15
20
|
requestId: string;
|
|
@@ -49,4 +54,76 @@ export interface BdgOutput {
|
|
|
49
54
|
partial?: boolean;
|
|
50
55
|
}
|
|
51
56
|
export type TelemetryType = 'dom' | 'network' | 'console';
|
|
57
|
+
/**
|
|
58
|
+
* Accessibility tree node with filtered and formatted data.
|
|
59
|
+
*
|
|
60
|
+
* This is a simplified representation of Protocol.Accessibility.AXNode
|
|
61
|
+
* optimized for agent consumption and semantic queries.
|
|
62
|
+
*/
|
|
63
|
+
export interface A11yNode {
|
|
64
|
+
/** Unique node identifier from CDP */
|
|
65
|
+
nodeId: string;
|
|
66
|
+
/** ARIA role (button, textbox, heading, etc.) */
|
|
67
|
+
role: string;
|
|
68
|
+
/** Accessible name (computed label) */
|
|
69
|
+
name?: string;
|
|
70
|
+
/** Accessible description */
|
|
71
|
+
description?: string;
|
|
72
|
+
/** Node value (for inputs, textareas, etc.) */
|
|
73
|
+
value?: string;
|
|
74
|
+
/** Whether node is focusable */
|
|
75
|
+
focusable?: boolean;
|
|
76
|
+
/** Whether node is currently focused */
|
|
77
|
+
focused?: boolean;
|
|
78
|
+
/** Whether node is disabled */
|
|
79
|
+
disabled?: boolean;
|
|
80
|
+
/** Whether field is required (forms) */
|
|
81
|
+
required?: boolean;
|
|
82
|
+
/** Additional ARIA properties */
|
|
83
|
+
properties?: Record<string, unknown>;
|
|
84
|
+
/** Child node IDs */
|
|
85
|
+
childIds?: string[];
|
|
86
|
+
/** Associated DOM node ID for querying */
|
|
87
|
+
backendDOMNodeId?: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Accessibility tree data structure.
|
|
91
|
+
*/
|
|
92
|
+
export interface A11yTree {
|
|
93
|
+
/** Root node of the tree */
|
|
94
|
+
root: A11yNode;
|
|
95
|
+
/** All nodes indexed by nodeId for fast lookup */
|
|
96
|
+
nodes: Map<string, A11yNode>;
|
|
97
|
+
/** Total node count */
|
|
98
|
+
count: number;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Query pattern for searching accessibility tree.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* { role: 'button', name: 'Submit' }
|
|
106
|
+
* { role: 'textbox' }
|
|
107
|
+
* { name: 'Email' }
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export interface A11yQueryPattern {
|
|
111
|
+
/** Filter by ARIA role */
|
|
112
|
+
role?: string;
|
|
113
|
+
/** Filter by accessible name (case-insensitive) */
|
|
114
|
+
name?: string;
|
|
115
|
+
/** Filter by accessible description (case-insensitive) */
|
|
116
|
+
description?: string;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Result from A11y query operation.
|
|
120
|
+
*/
|
|
121
|
+
export interface A11yQueryResult {
|
|
122
|
+
/** Matching nodes */
|
|
123
|
+
nodes: A11yNode[];
|
|
124
|
+
/** Total matches found */
|
|
125
|
+
count: number;
|
|
126
|
+
/** Query pattern used */
|
|
127
|
+
pattern: A11yQueryPattern;
|
|
128
|
+
}
|
|
52
129
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D;;;;;GAKG;AACH,YAAY,EACV,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,MAAM,EACN,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/ui/formatters/__tests__/semantic.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { describe, test } from 'node:test';
|
|
3
|
+
import { semantic } from '../../../ui/formatters/semantic.js';
|
|
4
|
+
describe('semantic formatter', () => {
|
|
5
|
+
test('formats simple tree with indentation', () => {
|
|
6
|
+
const tree = {
|
|
7
|
+
root: { nodeId: '1', role: 'RootWebArea', name: 'Test Page' },
|
|
8
|
+
nodes: new Map([
|
|
9
|
+
['1', { nodeId: '1', role: 'RootWebArea', name: 'Test Page', childIds: ['2'] }],
|
|
10
|
+
['2', { nodeId: '2', role: 'button', name: 'Click me', focusable: true }],
|
|
11
|
+
]),
|
|
12
|
+
count: 2,
|
|
13
|
+
};
|
|
14
|
+
const output = semantic(tree);
|
|
15
|
+
assert.equal(output, '[RootWebArea] "Test Page"\n [Button] "Click me" (focusable)');
|
|
16
|
+
});
|
|
17
|
+
test('handles heading levels', () => {
|
|
18
|
+
const tree = {
|
|
19
|
+
root: { nodeId: '1', role: 'heading', properties: { level: '1' } },
|
|
20
|
+
nodes: new Map([
|
|
21
|
+
['1', { nodeId: '1', role: 'heading', name: 'Main Title', properties: { level: '1' } }],
|
|
22
|
+
]),
|
|
23
|
+
count: 1,
|
|
24
|
+
};
|
|
25
|
+
const output = semantic(tree);
|
|
26
|
+
assert.equal(output, '[Heading L1] "Main Title"');
|
|
27
|
+
});
|
|
28
|
+
test('shows multiple properties', () => {
|
|
29
|
+
const node = {
|
|
30
|
+
nodeId: '1',
|
|
31
|
+
role: 'textbox',
|
|
32
|
+
name: 'Email',
|
|
33
|
+
focusable: true,
|
|
34
|
+
required: true,
|
|
35
|
+
disabled: false,
|
|
36
|
+
};
|
|
37
|
+
const tree = {
|
|
38
|
+
root: node,
|
|
39
|
+
nodes: new Map([['1', node]]),
|
|
40
|
+
count: 1,
|
|
41
|
+
};
|
|
42
|
+
const output = semantic(tree);
|
|
43
|
+
assert.equal(output, '[Textbox] "Email" (focusable, required)');
|
|
44
|
+
});
|
|
45
|
+
test('omits name when not present', () => {
|
|
46
|
+
const tree = {
|
|
47
|
+
root: { nodeId: '1', role: 'generic' },
|
|
48
|
+
nodes: new Map([
|
|
49
|
+
['1', { nodeId: '1', role: 'generic', childIds: ['2'] }],
|
|
50
|
+
['2', { nodeId: '2', role: 'paragraph', name: 'Text' }],
|
|
51
|
+
]),
|
|
52
|
+
count: 2,
|
|
53
|
+
};
|
|
54
|
+
const output = semantic(tree);
|
|
55
|
+
assert.equal(output, '[Generic]\n [Paragraph] "Text"');
|
|
56
|
+
});
|
|
57
|
+
test('handles deep nesting', () => {
|
|
58
|
+
const tree = {
|
|
59
|
+
root: { nodeId: '1', role: 'RootWebArea', childIds: ['2'] },
|
|
60
|
+
nodes: new Map([
|
|
61
|
+
['1', { nodeId: '1', role: 'RootWebArea', childIds: ['2'] }],
|
|
62
|
+
['2', { nodeId: '2', role: 'main', childIds: ['3'] }],
|
|
63
|
+
['3', { nodeId: '3', role: 'navigation', childIds: ['4'] }],
|
|
64
|
+
['4', { nodeId: '4', role: 'link', name: 'Home' }],
|
|
65
|
+
]),
|
|
66
|
+
count: 4,
|
|
67
|
+
};
|
|
68
|
+
const output = semantic(tree);
|
|
69
|
+
assert.equal(output, '[RootWebArea]\n [Main]\n [Navigation]\n [Link] "Home"');
|
|
70
|
+
});
|
|
71
|
+
test('handles all boolean properties', () => {
|
|
72
|
+
const node = {
|
|
73
|
+
nodeId: '1',
|
|
74
|
+
role: 'button',
|
|
75
|
+
name: 'Submit',
|
|
76
|
+
focusable: true,
|
|
77
|
+
focused: true,
|
|
78
|
+
disabled: true,
|
|
79
|
+
required: true,
|
|
80
|
+
};
|
|
81
|
+
const tree = {
|
|
82
|
+
root: node,
|
|
83
|
+
nodes: new Map([['1', node]]),
|
|
84
|
+
count: 1,
|
|
85
|
+
};
|
|
86
|
+
const output = semantic(tree);
|
|
87
|
+
assert.equal(output, '[Button] "Submit" (focusable, focused, disabled, required)');
|
|
88
|
+
});
|
|
89
|
+
test('handles nodes without children', () => {
|
|
90
|
+
const tree = {
|
|
91
|
+
root: { nodeId: '1', role: 'button', name: 'Click' },
|
|
92
|
+
nodes: new Map([['1', { nodeId: '1', role: 'button', name: 'Click' }]]),
|
|
93
|
+
count: 1,
|
|
94
|
+
};
|
|
95
|
+
const output = semantic(tree);
|
|
96
|
+
assert.equal(output, '[Button] "Click"');
|
|
97
|
+
});
|
|
98
|
+
test('capitalizes role names', () => {
|
|
99
|
+
const tree = {
|
|
100
|
+
root: { nodeId: '1', role: 'navigation' },
|
|
101
|
+
nodes: new Map([
|
|
102
|
+
['1', { nodeId: '1', role: 'navigation', childIds: ['2'] }],
|
|
103
|
+
['2', { nodeId: '2', role: 'searchbox', name: 'Search' }],
|
|
104
|
+
]),
|
|
105
|
+
count: 2,
|
|
106
|
+
};
|
|
107
|
+
const output = semantic(tree);
|
|
108
|
+
assert.equal(output, '[Navigation]\n [Searchbox] "Search"');
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=semantic.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.unit.test.js","sourceRoot":"","sources":["../../../../src/ui/formatters/__tests__/semantic.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { A11yTree, A11yQueryResult, A11yNode } from '../../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Format accessibility tree for human-readable output.
|
|
4
|
+
*
|
|
5
|
+
* Displays the tree structure with role, name, and key properties.
|
|
6
|
+
* Shows up to 50 nodes by default for manageable output.
|
|
7
|
+
*
|
|
8
|
+
* @param tree - Accessibility tree data
|
|
9
|
+
* @returns Formatted output string
|
|
10
|
+
*/
|
|
11
|
+
export declare function formatA11yTree(tree: A11yTree): string;
|
|
12
|
+
/**
|
|
13
|
+
* Format query result for human-readable output.
|
|
14
|
+
*
|
|
15
|
+
* Shows matching nodes with their role, name, and properties.
|
|
16
|
+
*
|
|
17
|
+
* @param result - Query result with matching nodes
|
|
18
|
+
* @returns Formatted output string
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatA11yQueryResult(result: A11yQueryResult): string;
|
|
21
|
+
/**
|
|
22
|
+
* Format single accessibility node for human-readable output.
|
|
23
|
+
*
|
|
24
|
+
* Shows detailed properties including role, name, description, value, and states.
|
|
25
|
+
*
|
|
26
|
+
* @param node - Accessibility node
|
|
27
|
+
* @returns Formatted output string
|
|
28
|
+
*/
|
|
29
|
+
export declare function formatA11yNode(node: A11yNode): string;
|
|
30
|
+
//# sourceMappingURL=a11y.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../../src/ui/formatters/a11y.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AActE;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAmBrD;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAyBrE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CA8CrD"}
|