craftdriver 0.1.0 → 0.2.0
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/CHANGELOG.md +104 -0
- package/README.md +157 -45
- package/bin/craftdriver.mjs +26 -0
- package/dist/cli/client.d.ts +17 -0
- package/dist/cli/client.d.ts.map +1 -0
- package/dist/cli/client.js +88 -0
- package/dist/cli/client.js.map +1 -0
- package/dist/cli/daemon.d.ts +15 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +145 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/defaults.d.ts +10 -0
- package/dist/cli/defaults.d.ts.map +1 -0
- package/dist/cli/defaults.js +42 -0
- package/dist/cli/defaults.js.map +1 -0
- package/dist/cli/dispatcher.d.ts +28 -0
- package/dist/cli/dispatcher.d.ts.map +1 -0
- package/dist/cli/dispatcher.js +319 -0
- package/dist/cli/dispatcher.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +404 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +24 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +192 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/mcp/artifacts.d.ts +43 -0
- package/dist/cli/mcp/artifacts.d.ts.map +1 -0
- package/dist/cli/mcp/artifacts.js +104 -0
- package/dist/cli/mcp/artifacts.js.map +1 -0
- package/dist/cli/mcp/server.d.ts +34 -0
- package/dist/cli/mcp/server.d.ts.map +1 -0
- package/dist/cli/mcp/server.js +214 -0
- package/dist/cli/mcp/server.js.map +1 -0
- package/dist/cli/mcp/tools.d.ts +34 -0
- package/dist/cli/mcp/tools.d.ts.map +1 -0
- package/dist/cli/mcp/tools.js +236 -0
- package/dist/cli/mcp/tools.js.map +1 -0
- package/dist/cli/parseArgs.d.ts +37 -0
- package/dist/cli/parseArgs.d.ts.map +1 -0
- package/dist/cli/parseArgs.js +215 -0
- package/dist/cli/parseArgs.js.map +1 -0
- package/dist/cli/protocol.d.ts +34 -0
- package/dist/cli/protocol.d.ts.map +1 -0
- package/dist/cli/protocol.js +2 -0
- package/dist/cli/protocol.js.map +1 -0
- package/dist/cli/selector.d.ts +29 -0
- package/dist/cli/selector.d.ts.map +1 -0
- package/dist/cli/selector.js +100 -0
- package/dist/cli/selector.js.map +1 -0
- package/dist/cli/snapshot.d.ts +48 -0
- package/dist/cli/snapshot.d.ts.map +1 -0
- package/dist/cli/snapshot.js +179 -0
- package/dist/cli/snapshot.js.map +1 -0
- package/dist/index.d.ts +14 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/a11y.d.ts +81 -0
- package/dist/lib/a11y.d.ts.map +1 -0
- package/dist/lib/a11y.js +171 -0
- package/dist/lib/a11y.js.map +1 -0
- package/dist/lib/bidi/index.d.ts +26 -1
- package/dist/lib/bidi/index.d.ts.map +1 -1
- package/dist/lib/bidi/index.js +49 -0
- package/dist/lib/bidi/index.js.map +1 -1
- package/dist/lib/bidi/logs.d.ts +2 -2
- package/dist/lib/bidi/logs.d.ts.map +1 -1
- package/dist/lib/bidi/logs.js +2 -2
- package/dist/lib/bidi/logs.js.map +1 -1
- package/dist/lib/bidi/network.d.ts +74 -1
- package/dist/lib/bidi/network.d.ts.map +1 -1
- package/dist/lib/bidi/network.js +222 -4
- package/dist/lib/bidi/network.js.map +1 -1
- package/dist/lib/bidi/storage.d.ts +5 -3
- package/dist/lib/bidi/storage.d.ts.map +1 -1
- package/dist/lib/bidi/storage.js +14 -7
- package/dist/lib/bidi/storage.js.map +1 -1
- package/dist/lib/bidi/types.d.ts +27 -6
- package/dist/lib/bidi/types.d.ts.map +1 -1
- package/dist/lib/browser.d.ts +637 -16
- package/dist/lib/browser.d.ts.map +1 -1
- package/dist/lib/browser.js +1428 -102
- package/dist/lib/browser.js.map +1 -1
- package/dist/lib/browserContext.d.ts +486 -0
- package/dist/lib/browserContext.d.ts.map +1 -0
- package/dist/lib/browserContext.js +937 -0
- package/dist/lib/browserContext.js.map +1 -0
- package/dist/lib/builder.d.ts +3 -0
- package/dist/lib/builder.d.ts.map +1 -1
- package/dist/lib/builder.js +31 -4
- package/dist/lib/builder.js.map +1 -1
- package/dist/lib/by.d.ts +18 -2
- package/dist/lib/by.d.ts.map +1 -1
- package/dist/lib/by.js +20 -2
- package/dist/lib/by.js.map +1 -1
- package/dist/lib/chrome.d.ts +13 -1
- package/dist/lib/chrome.d.ts.map +1 -1
- package/dist/lib/chrome.js +13 -17
- package/dist/lib/chrome.js.map +1 -1
- package/dist/lib/clock.d.ts +115 -0
- package/dist/lib/clock.d.ts.map +1 -0
- package/dist/lib/clock.js +407 -0
- package/dist/lib/clock.js.map +1 -0
- package/dist/lib/driver.d.ts +43 -0
- package/dist/lib/driver.d.ts.map +1 -1
- package/dist/lib/driver.js +120 -0
- package/dist/lib/driver.js.map +1 -1
- package/dist/lib/driverManager.d.ts +25 -0
- package/dist/lib/driverManager.d.ts.map +1 -0
- package/dist/lib/driverManager.js +399 -0
- package/dist/lib/driverManager.js.map +1 -0
- package/dist/lib/elementHandle.d.ts +67 -3
- package/dist/lib/elementHandle.d.ts.map +1 -1
- package/dist/lib/elementHandle.js +209 -67
- package/dist/lib/elementHandle.js.map +1 -1
- package/dist/lib/errors.d.ts +71 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +73 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/expect.d.ts +6 -1
- package/dist/lib/expect.d.ts.map +1 -1
- package/dist/lib/expect.js +55 -37
- package/dist/lib/expect.js.map +1 -1
- package/dist/lib/firefox.d.ts +18 -0
- package/dist/lib/firefox.d.ts.map +1 -0
- package/dist/lib/firefox.js +33 -0
- package/dist/lib/firefox.js.map +1 -0
- package/dist/lib/frame.d.ts +57 -0
- package/dist/lib/frame.d.ts.map +1 -0
- package/dist/lib/frame.js +277 -0
- package/dist/lib/frame.js.map +1 -0
- package/dist/lib/keyboard.d.ts +1 -1
- package/dist/lib/keyboard.d.ts.map +1 -1
- package/dist/lib/keyboard.js +1 -1
- package/dist/lib/keyboard.js.map +1 -1
- package/dist/lib/locator.d.ts +71 -2
- package/dist/lib/locator.d.ts.map +1 -1
- package/dist/lib/locator.js +289 -31
- package/dist/lib/locator.js.map +1 -1
- package/dist/lib/mouse.d.ts +1 -1
- package/dist/lib/mouse.d.ts.map +1 -1
- package/dist/lib/mouse.js +1 -1
- package/dist/lib/mouse.js.map +1 -1
- package/dist/lib/page.d.ts +107 -0
- package/dist/lib/page.d.ts.map +1 -0
- package/dist/lib/page.js +388 -0
- package/dist/lib/page.js.map +1 -0
- package/dist/lib/tracing.d.ts +128 -0
- package/dist/lib/tracing.d.ts.map +1 -0
- package/dist/lib/tracing.js +272 -0
- package/dist/lib/tracing.js.map +1 -0
- package/dist/lib/wait.d.ts.map +1 -1
- package/dist/lib/wait.js +14 -1
- package/dist/lib/wait.js.map +1 -1
- package/dist/lib/webelement.d.ts +2 -0
- package/dist/lib/webelement.d.ts.map +1 -1
- package/dist/lib/webelement.js +18 -0
- package/dist/lib/webelement.js.map +1 -1
- package/docs/accessibility.md +177 -0
- package/docs/api-reference.md +71 -0
- package/docs/assertions.md +182 -0
- package/docs/bidi-features.md +462 -0
- package/docs/browser-api.md +673 -0
- package/docs/browser-context.md +522 -0
- package/docs/cli.md +233 -0
- package/docs/clock.md +245 -0
- package/docs/dialogs.md +143 -0
- package/docs/driver-configuration.md +64 -0
- package/docs/element-api.md +219 -0
- package/docs/emulation.md +155 -0
- package/docs/error-codes.md +67 -0
- package/docs/getting-started.md +168 -0
- package/docs/keyboard-mouse.md +250 -0
- package/docs/mcp.md +250 -0
- package/docs/mobile-emulation.md +194 -0
- package/docs/screenshots.md +146 -0
- package/docs/selectors.md +382 -0
- package/docs/session-management.md +229 -0
- package/docs/tracing.md +282 -0
- package/package.json +23 -6
- package/skills/craftdriver/SKILL.md +84 -0
- package/skills/craftdriver/cheatsheet.md +194 -0
- package/skills/craftdriver/cli.md +104 -0
- package/skills/craftdriver/patterns.md +139 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracer — append-only, crash-resilient session recorder for bug
|
|
3
|
+
* investigation.
|
|
4
|
+
*
|
|
5
|
+
* Streams events to `<outDir>/trace.ndjson` synchronously, one line per
|
|
6
|
+
* event. Screenshots are written to `<outDir>/screenshots/NNNN.png` as
|
|
7
|
+
* their captures resolve. There is **no finalisation step** — if the
|
|
8
|
+
* test throws (or the process is killed) every event up to that point is
|
|
9
|
+
* already on disk and the partial file is still valid NDJSON.
|
|
10
|
+
*
|
|
11
|
+
* **BiDi-only.** Tracing relies on the same subscriptions that power
|
|
12
|
+
* `browser.logs` and `browser.network` and is unavailable in Classic mode.
|
|
13
|
+
*/
|
|
14
|
+
import { mkdirSync, writeFileSync, openSync, writeSync, closeSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
export class Tracer {
|
|
17
|
+
browser;
|
|
18
|
+
conn;
|
|
19
|
+
startedAtMs = 0;
|
|
20
|
+
startedAtIso = '';
|
|
21
|
+
outDir = '';
|
|
22
|
+
fd = null;
|
|
23
|
+
unsubs = [];
|
|
24
|
+
screenshotIndex = 0;
|
|
25
|
+
screenshotDirEnsured = false;
|
|
26
|
+
running = false;
|
|
27
|
+
actionsEnabled = true;
|
|
28
|
+
screenshotMode = 'auto';
|
|
29
|
+
actionIndex = 0;
|
|
30
|
+
/** Tracks in-flight screenshot captures so `stop()` can drain them. */
|
|
31
|
+
pendingCaptures = [];
|
|
32
|
+
constructor(browser, conn) {
|
|
33
|
+
this.browser = browser;
|
|
34
|
+
this.conn = conn;
|
|
35
|
+
}
|
|
36
|
+
get isRunning() {
|
|
37
|
+
return this.running;
|
|
38
|
+
}
|
|
39
|
+
async start(opts) {
|
|
40
|
+
if (this.running) {
|
|
41
|
+
throw new Error('Tracer is already running. Call stopTrace() first.');
|
|
42
|
+
}
|
|
43
|
+
if (!opts || typeof opts.outDir !== 'string' || opts.outDir.length === 0) {
|
|
44
|
+
throw new Error('startTrace() requires { outDir: string }.');
|
|
45
|
+
}
|
|
46
|
+
this.running = true;
|
|
47
|
+
this.startedAtMs = Date.now();
|
|
48
|
+
this.startedAtIso = new Date(this.startedAtMs).toISOString();
|
|
49
|
+
this.outDir = opts.outDir;
|
|
50
|
+
this.screenshotIndex = 0;
|
|
51
|
+
this.screenshotDirEnsured = false;
|
|
52
|
+
this.actionIndex = 0;
|
|
53
|
+
this.pendingCaptures = [];
|
|
54
|
+
this.actionsEnabled = opts.actions ?? true;
|
|
55
|
+
const networkOn = opts.network ?? true;
|
|
56
|
+
const consoleOn = opts.console ?? true;
|
|
57
|
+
this.screenshotMode = normalizeScreenshotMode(opts.screenshots);
|
|
58
|
+
mkdirSync(this.outDir, { recursive: true });
|
|
59
|
+
this.fd = openSync(join(this.outDir, 'trace.ndjson'), 'w');
|
|
60
|
+
// First line: start meta. Readers can match `type === 'meta'` to find
|
|
61
|
+
// start/end markers and ignore the rest of the schema.
|
|
62
|
+
this.writeLine({
|
|
63
|
+
t: 0,
|
|
64
|
+
type: 'meta',
|
|
65
|
+
startedAt: this.startedAtIso,
|
|
66
|
+
opts: {
|
|
67
|
+
actions: this.actionsEnabled,
|
|
68
|
+
network: networkOn,
|
|
69
|
+
console: consoleOn,
|
|
70
|
+
screenshots: this.screenshotMode,
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
const wantedSubs = ['browsingContext.navigationStarted'];
|
|
74
|
+
if (consoleOn)
|
|
75
|
+
wantedSubs.push('log.entryAdded');
|
|
76
|
+
if (networkOn)
|
|
77
|
+
wantedSubs.push('network.beforeRequestSent', 'network.responseCompleted');
|
|
78
|
+
// BiDi accepts duplicate subscribes (LogMonitor / NetworkInterceptor may already be subscribed).
|
|
79
|
+
await this.conn.subscribe(wantedSubs).catch(() => { });
|
|
80
|
+
if (consoleOn) {
|
|
81
|
+
this.unsubs.push(this.conn.on('log.entryAdded', (params) => {
|
|
82
|
+
const p = params;
|
|
83
|
+
const text = String(p.text ?? '');
|
|
84
|
+
if (p.type === 'console') {
|
|
85
|
+
this.push({ type: 'console', level: String(p.level ?? 'info'), text });
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.push({ type: 'error', text });
|
|
89
|
+
if (this.screenshotMode === 'auto')
|
|
90
|
+
this.scheduleScreenshot('error');
|
|
91
|
+
}
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
if (networkOn) {
|
|
95
|
+
this.unsubs.push(this.conn.on('network.beforeRequestSent', (params) => {
|
|
96
|
+
const p = params;
|
|
97
|
+
const req = (p.request ?? {});
|
|
98
|
+
this.push({
|
|
99
|
+
type: 'request',
|
|
100
|
+
url: String(req.url ?? ''),
|
|
101
|
+
method: String(req.method ?? ''),
|
|
102
|
+
requestId: req.request,
|
|
103
|
+
});
|
|
104
|
+
}));
|
|
105
|
+
this.unsubs.push(this.conn.on('network.responseCompleted', (params) => {
|
|
106
|
+
const p = params;
|
|
107
|
+
const req = (p.request ?? {});
|
|
108
|
+
const res = (p.response ?? {});
|
|
109
|
+
const ev = {
|
|
110
|
+
type: 'response',
|
|
111
|
+
url: String(req.url ?? res.url ?? ''),
|
|
112
|
+
status: Number(res.status ?? 0),
|
|
113
|
+
requestId: req.request,
|
|
114
|
+
};
|
|
115
|
+
const mime = res.mimeType;
|
|
116
|
+
if (typeof mime === 'string' && mime.length > 0)
|
|
117
|
+
ev.mimeType = mime;
|
|
118
|
+
if (res.fromCache === true)
|
|
119
|
+
ev.fromCache = true;
|
|
120
|
+
this.push(ev);
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
this.unsubs.push(this.conn.on('browsingContext.navigationStarted', (params) => {
|
|
124
|
+
const p = params;
|
|
125
|
+
this.push({
|
|
126
|
+
type: 'navigation',
|
|
127
|
+
url: String(p.url ?? ''),
|
|
128
|
+
context: p.context,
|
|
129
|
+
});
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Record a public-API action. Fire-and-forget — the event is written
|
|
134
|
+
* **synchronously** to `trace.ndjson` before returning, so a thrown
|
|
135
|
+
* `expect` on the next line cannot lose it. When `screenshots: 'auto'`
|
|
136
|
+
* is on, also enqueues a pre-action screenshot capture (async; doesn't
|
|
137
|
+
* block the caller).
|
|
138
|
+
*
|
|
139
|
+
* Zero-cost when no tracer is running or `actions: false`.
|
|
140
|
+
*/
|
|
141
|
+
recordAction(name, args, selector) {
|
|
142
|
+
if (!this.running || !this.actionsEnabled)
|
|
143
|
+
return;
|
|
144
|
+
const idx = ++this.actionIndex;
|
|
145
|
+
this.writeLine({
|
|
146
|
+
t: Date.now() - this.startedAtMs,
|
|
147
|
+
type: 'action',
|
|
148
|
+
name,
|
|
149
|
+
args: args && args.length ? args.map(safeArg) : undefined,
|
|
150
|
+
selector,
|
|
151
|
+
});
|
|
152
|
+
if (this.screenshotMode === 'auto')
|
|
153
|
+
this.scheduleScreenshot('action', idx);
|
|
154
|
+
}
|
|
155
|
+
scheduleScreenshot(reason, actionIndex) {
|
|
156
|
+
const startedAtMs = Date.now();
|
|
157
|
+
const p = this.browser.screenshot().then((buf) => {
|
|
158
|
+
if (!this.running)
|
|
159
|
+
return;
|
|
160
|
+
const idx = ++this.screenshotIndex;
|
|
161
|
+
const rel = `screenshots/${String(idx).padStart(4, '0')}.png`;
|
|
162
|
+
if (!this.screenshotDirEnsured) {
|
|
163
|
+
mkdirSync(join(this.outDir, 'screenshots'), { recursive: true });
|
|
164
|
+
this.screenshotDirEnsured = true;
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
writeFileSync(join(this.outDir, rel), buf);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return; // disk error; skip this frame
|
|
171
|
+
}
|
|
172
|
+
const ev = {
|
|
173
|
+
t: startedAtMs - this.startedAtMs,
|
|
174
|
+
type: 'screenshot',
|
|
175
|
+
file: rel,
|
|
176
|
+
reason,
|
|
177
|
+
};
|
|
178
|
+
if (actionIndex !== undefined)
|
|
179
|
+
ev.actionIndex = actionIndex;
|
|
180
|
+
this.writeLine(ev);
|
|
181
|
+
}, () => { });
|
|
182
|
+
this.pendingCaptures.push(p);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Stop tracing cleanly: drain in-flight screenshots, write the closing
|
|
186
|
+
* `meta` line, and close the file. If the test throws and `stop()` is
|
|
187
|
+
* never called, the file is still a valid NDJSON trace — just without
|
|
188
|
+
* the closing marker.
|
|
189
|
+
*/
|
|
190
|
+
async stop() {
|
|
191
|
+
if (!this.running) {
|
|
192
|
+
throw new Error('stopTrace(): no trace is running. Call startTrace() first.');
|
|
193
|
+
}
|
|
194
|
+
for (const un of this.unsubs)
|
|
195
|
+
un();
|
|
196
|
+
this.unsubs = [];
|
|
197
|
+
if (this.pendingCaptures.length > 0) {
|
|
198
|
+
await Promise.allSettled(this.pendingCaptures);
|
|
199
|
+
this.pendingCaptures = [];
|
|
200
|
+
}
|
|
201
|
+
this.writeLine({
|
|
202
|
+
t: Date.now() - this.startedAtMs,
|
|
203
|
+
type: 'meta',
|
|
204
|
+
endedAt: new Date().toISOString(),
|
|
205
|
+
});
|
|
206
|
+
if (this.fd !== null) {
|
|
207
|
+
try {
|
|
208
|
+
closeSync(this.fd);
|
|
209
|
+
}
|
|
210
|
+
catch { /* ignore */ }
|
|
211
|
+
this.fd = null;
|
|
212
|
+
}
|
|
213
|
+
this.running = false;
|
|
214
|
+
}
|
|
215
|
+
/** Close the file without writing an end marker. Used by `Browser.quit()`. */
|
|
216
|
+
abort() {
|
|
217
|
+
for (const un of this.unsubs)
|
|
218
|
+
un();
|
|
219
|
+
this.unsubs = [];
|
|
220
|
+
if (this.fd !== null) {
|
|
221
|
+
try {
|
|
222
|
+
closeSync(this.fd);
|
|
223
|
+
}
|
|
224
|
+
catch { /* ignore */ }
|
|
225
|
+
this.fd = null;
|
|
226
|
+
}
|
|
227
|
+
this.running = false;
|
|
228
|
+
this.pendingCaptures = [];
|
|
229
|
+
}
|
|
230
|
+
push(ev) {
|
|
231
|
+
if (!this.running)
|
|
232
|
+
return;
|
|
233
|
+
this.writeLine({ t: Date.now() - this.startedAtMs, ...ev });
|
|
234
|
+
}
|
|
235
|
+
writeLine(ev) {
|
|
236
|
+
if (this.fd === null)
|
|
237
|
+
return;
|
|
238
|
+
try {
|
|
239
|
+
writeSync(this.fd, JSON.stringify(ev) + '\n');
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// Disk full / fd closed unexpectedly. Stop trying so we don't
|
|
243
|
+
// throw from inside a hot action method.
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function normalizeScreenshotMode(v) {
|
|
248
|
+
if (v === undefined || v === 'auto' || v === true)
|
|
249
|
+
return 'auto';
|
|
250
|
+
return 'off';
|
|
251
|
+
}
|
|
252
|
+
function safeArg(v) {
|
|
253
|
+
if (v === null || v === undefined)
|
|
254
|
+
return v;
|
|
255
|
+
const t = typeof v;
|
|
256
|
+
if (t === 'string' || t === 'number' || t === 'boolean')
|
|
257
|
+
return v;
|
|
258
|
+
if (t === 'function')
|
|
259
|
+
return '[Function]';
|
|
260
|
+
if (Array.isArray(v))
|
|
261
|
+
return v.slice(0, 8).map(safeArg);
|
|
262
|
+
try {
|
|
263
|
+
const s = JSON.stringify(v);
|
|
264
|
+
if (s && s.length < 200)
|
|
265
|
+
return JSON.parse(s);
|
|
266
|
+
return '[Object]';
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return '[Object]';
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=tracing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../src/lib/tracing.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/wait.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/lib/wait.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/lib/wait.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,aAAa;IAMtB,OAAO,CAAC,MAAM;IALhB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAS;gBAGlB,MAAM,EAAE,MAAM,EACtB,gBAAgB,CAAC,EAAE,MAAM,GAAG,WAAW,EACvC,UAAU,CAAC,EAAE,MAAM;IAYf,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CA8BtE;AAOD,eAAO,MAAM,KAAK;8BACU,EAAE,MAAY,QAAQ,MAAM;6BAI7B,EAAE,MAAY,QAAQ,MAAM;gCASzB,EAAE,MAAY,QAAQ,MAAM;+BAS7B,EAAE,GAAG,UAAU,MAAY,QAAQ,MAAM;kCAUtC,EAAE,GAAG,UAAU,MAAY,QAAQ,MAAM;CAaxE,CAAC"}
|
package/dist/lib/wait.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { WebElement } from './webelement.js';
|
|
2
|
+
import { CraftdriverError, ErrorCode } from './errors.js';
|
|
2
3
|
export class WebDriverWait {
|
|
3
4
|
driver;
|
|
4
5
|
timeoutMs;
|
|
@@ -33,7 +34,19 @@ export class WebDriverWait {
|
|
|
33
34
|
await new Promise((r) => setTimeout(r, this.intervalMs));
|
|
34
35
|
}
|
|
35
36
|
const errMsg = message ?? this.timeoutMsg ?? `Wait timed out after ${this.timeoutMs}ms`;
|
|
36
|
-
|
|
37
|
+
const full = lastErr ? `${errMsg}: ${String(lastErr?.message ?? lastErr)}` : errMsg;
|
|
38
|
+
// Preserve a more specific code when the inner condition already raised one.
|
|
39
|
+
if (CraftdriverError.is(lastErr)) {
|
|
40
|
+
throw new CraftdriverError(lastErr.code, full, {
|
|
41
|
+
detail: { ...(lastErr.detail ?? {}), timeout: this.timeoutMs },
|
|
42
|
+
cause: lastErr,
|
|
43
|
+
hint: lastErr.hint,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
throw new CraftdriverError(ErrorCode.TIMEOUT, full, {
|
|
47
|
+
detail: { timeout: this.timeoutMs },
|
|
48
|
+
cause: lastErr,
|
|
49
|
+
});
|
|
37
50
|
}
|
|
38
51
|
}
|
|
39
52
|
async function resolveElement(driver, target) {
|
package/dist/lib/wait.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/lib/wait.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/lib/wait.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/webelement.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WebDriverEndpoint } from './types.js';
|
|
2
|
+
import { By } from './by.js';
|
|
2
3
|
export declare const W3C_ELEMENT_KEY = "element-6066-11e4-a52e-4f735466cecf";
|
|
3
4
|
export declare const LEGACY_ELEMENT_KEY = "ELEMENT";
|
|
4
5
|
export declare class WebElement {
|
|
@@ -28,5 +29,6 @@ export declare class WebElement {
|
|
|
28
29
|
width: number;
|
|
29
30
|
height: number;
|
|
30
31
|
}>;
|
|
32
|
+
findElements(locator: By): Promise<WebElement[]>;
|
|
31
33
|
}
|
|
32
34
|
//# sourceMappingURL=webelement.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webelement.d.ts","sourceRoot":"","sources":["../../src/lib/webelement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"webelement.d.ts","sourceRoot":"","sources":["../../src/lib/webelement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,eAAO,MAAM,eAAe,wCAAwC,CAAC;AACrE,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;gBAFT,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;IAG3B,KAAK,IAAI,MAAM;IAIT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAUhC,MAAM;;;;IAIA,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAU/B,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAUnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUlD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU3C,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAU7B,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAU9B,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAU7B,OAAO,IAAI,OAAO,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAU3E,YAAY,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAiBvD"}
|
package/dist/lib/webelement.js
CHANGED
|
@@ -122,5 +122,23 @@ export class WebElement {
|
|
|
122
122
|
const value = res?.value ?? res;
|
|
123
123
|
return value;
|
|
124
124
|
}
|
|
125
|
+
async findElements(locator) {
|
|
126
|
+
const client = new HttpClient(this.endpoint);
|
|
127
|
+
const res = await client.send({
|
|
128
|
+
method: 'POST',
|
|
129
|
+
path: `/session/${this.sessionId}/element/${this.elementId}/elements`,
|
|
130
|
+
body: { using: locator.using, value: locator.value },
|
|
131
|
+
});
|
|
132
|
+
const arr = (res?.value ??
|
|
133
|
+
res);
|
|
134
|
+
return (arr || [])
|
|
135
|
+
.map((v) => {
|
|
136
|
+
const elId = v?.[W3C_ELEMENT_KEY] || v?.[LEGACY_ELEMENT_KEY];
|
|
137
|
+
if (!elId)
|
|
138
|
+
return undefined;
|
|
139
|
+
return new WebElement(this.endpoint, this.sessionId, elId);
|
|
140
|
+
})
|
|
141
|
+
.filter(Boolean);
|
|
142
|
+
}
|
|
125
143
|
}
|
|
126
144
|
//# sourceMappingURL=webelement.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webelement.js","sourceRoot":"","sources":["../../src/lib/webelement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"webelement.js","sourceRoot":"","sources":["../../src/lib/webelement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# Accessibility audits
|
|
2
|
+
|
|
3
|
+
`craftdriver` wraps [axe-core](https://github.com/dequelabs/axe-core) so
|
|
4
|
+
you can assert WCAG compliance with the same fluency as any other
|
|
5
|
+
action — at the page, element, or locator level.
|
|
6
|
+
|
|
7
|
+
axe-core ships with craftdriver — no extra install. Works out of the box.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { Browser } from 'craftdriver';
|
|
11
|
+
|
|
12
|
+
const browser = await Browser.launch({ browserName: 'chrome' });
|
|
13
|
+
await browser.navigateTo('https://example.com');
|
|
14
|
+
|
|
15
|
+
await browser.a11y.check(); // throws on any serious+ violation
|
|
16
|
+
const report = await browser.a11y.audit(); // returns the raw report
|
|
17
|
+
console.log(report.violations);
|
|
18
|
+
await browser.quit();
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Check a page is clean except for known colour-contrast issues:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
await browser.a11y.check({ disableRules: ['color-contrast'] });
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Finding rule IDs
|
|
28
|
+
|
|
29
|
+
Rule IDs like `color-contrast`, `image-alt`, `button-name` come from
|
|
30
|
+
axe-core. Look them up here:
|
|
31
|
+
|
|
32
|
+
- [Deque — full rule catalogue](https://dequeuniversity.com/rules/axe/) — the
|
|
33
|
+
authoritative list, with WCAG mapping and remediation guidance per rule.
|
|
34
|
+
- [axe-core rule descriptions](https://github.com/dequelabs/axe-core/blob/develop/doc/rule-descriptions.md) —
|
|
35
|
+
one-line summary per rule, grouped by WCAG level.
|
|
36
|
+
- Every `A11yViolation` returned by `audit()` carries a `helpUrl` pointing
|
|
37
|
+
straight at the relevant Deque page — copy the rule ID from there.
|
|
38
|
+
|
|
39
|
+
## Ignoring rules (you will have violations — this is how you manage them)
|
|
40
|
+
|
|
41
|
+
Most production pages have known, deliberate axe-core violations:
|
|
42
|
+
third-party widgets with poor contrast, brand colours that miss AAA,
|
|
43
|
+
decorative images without alt. Three escalating shapes are supported,
|
|
44
|
+
in order of how often you'll reach for them.
|
|
45
|
+
|
|
46
|
+
### 1. The common case — a project-wide constant
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
// a11y-config.ts
|
|
50
|
+
export const PROJECT_A11Y = {
|
|
51
|
+
disableRules: ['color-contrast', 'region', 'landmark-one-main'],
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// in your test
|
|
55
|
+
import { PROJECT_A11Y } from './a11y-config';
|
|
56
|
+
await browser.a11y.check(PROJECT_A11Y);
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
A flat `string[]` of rule IDs is what teams actually maintain in
|
|
60
|
+
version control.
|
|
61
|
+
|
|
62
|
+
### 2. Per-test override — extend the constant ad-hoc
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
await browser.a11y.check({
|
|
66
|
+
...PROJECT_A11Y,
|
|
67
|
+
disableRules: [...PROJECT_A11Y.disableRules, 'aria-allowed-attr'],
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Plain object spread — no hidden state, no setter.
|
|
72
|
+
|
|
73
|
+
### 3. Escape hatch — raw axe-core options
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
await browser.a11y.check({
|
|
77
|
+
axeOptions: { rules: { 'color-contrast': { enabled: false } } },
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
`axeOptions` is merged last and wins over anything else. Use it when
|
|
82
|
+
you need exotic axe configuration (custom rule sets, locale, etc.).
|
|
83
|
+
|
|
84
|
+
## Filtering by impact
|
|
85
|
+
|
|
86
|
+
Default reports only include `serious` and `critical` violations.
|
|
87
|
+
Tune the threshold per call:
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
// CI gate: only fail PRs on critical issues
|
|
91
|
+
await browser.a11y.check({ minImpact: 'critical' });
|
|
92
|
+
|
|
93
|
+
// Debug everything
|
|
94
|
+
const report = await browser.a11y.audit({ minImpact: 'minor' });
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Scoping to an element
|
|
98
|
+
|
|
99
|
+
Both `ElementHandle` and `Locator` expose `.a11y`. The audit context
|
|
100
|
+
is restricted to the resolved element and its descendants — perfect
|
|
101
|
+
for asserting that *the modal you just opened* is clean even if the
|
|
102
|
+
rest of the page has known issues.
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
await browser.click('#open-settings');
|
|
106
|
+
await browser.find('#settings-modal').a11y.check({
|
|
107
|
+
disableRules: ['color-contrast'], // brand teal misses AA, known
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// Locator form — re-resolves on every call
|
|
111
|
+
const dialog = browser.locator('[role="dialog"]');
|
|
112
|
+
const report = await dialog.a11y.audit();
|
|
113
|
+
expect(report.violations).toHaveLength(0);
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Inspecting violations programmatically
|
|
117
|
+
|
|
118
|
+
`audit()` returns:
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
interface A11yResult {
|
|
122
|
+
violations: A11yViolation[];
|
|
123
|
+
passes: number; // count, not the full list
|
|
124
|
+
incomplete: number;
|
|
125
|
+
inapplicable: number;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
interface A11yViolation {
|
|
129
|
+
id: string; // e.g. 'color-contrast'
|
|
130
|
+
impact: 'minor' | 'moderate' | 'serious' | 'critical';
|
|
131
|
+
description: string;
|
|
132
|
+
helpUrl: string;
|
|
133
|
+
nodes: Array<{ target: string[]; html: string; failureSummary: string }>;
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
`check()` throws an `A11yError` whose `.violations` and `.result`
|
|
138
|
+
fields carry the full report:
|
|
139
|
+
|
|
140
|
+
```ts
|
|
141
|
+
import { A11yError } from 'craftdriver';
|
|
142
|
+
|
|
143
|
+
try {
|
|
144
|
+
await browser.a11y.check();
|
|
145
|
+
} catch (e) {
|
|
146
|
+
if (e instanceof A11yError) {
|
|
147
|
+
for (const v of e.violations) {
|
|
148
|
+
console.error(`${v.id} (${v.impact}) — ${v.helpUrl}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
throw e;
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## CI patterns
|
|
156
|
+
|
|
157
|
+
Save the full report as a build artefact and gate PRs on
|
|
158
|
+
critical/serious only:
|
|
159
|
+
|
|
160
|
+
```ts
|
|
161
|
+
import { writeFileSync } from 'node:fs';
|
|
162
|
+
|
|
163
|
+
const report = await browser.a11y.audit({ minImpact: 'minor' });
|
|
164
|
+
writeFileSync('a11y-report.json', JSON.stringify(report, null, 2));
|
|
165
|
+
|
|
166
|
+
// Gate the run on the serious+ subset
|
|
167
|
+
await browser.a11y.check({ minImpact: 'serious', ...PROJECT_A11Y });
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## How it works (one paragraph)
|
|
171
|
+
|
|
172
|
+
On the first audit, `axe-core` is lazily imported from your
|
|
173
|
+
`node_modules` and its `.source` is injected into the page (guarded by
|
|
174
|
+
a `window` flag so subsequent audits in the same document skip the
|
|
175
|
+
inject step). The audit itself uses Classic WebDriver
|
|
176
|
+
`execute/async` so the underlying `axe.run()` promise is awaited
|
|
177
|
+
before the result is shipped back — works with or without BiDi.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# API reference
|
|
2
|
+
|
|
3
|
+
Every symbol re-exported from [`src/index.ts`](../src/index.ts). One row per export.
|
|
4
|
+
Generated by `scripts/gen-api-reference.mjs` — do not edit by hand.
|
|
5
|
+
|
|
6
|
+
Run `npm run docs:api` to regenerate. CI fails when this file is out of date.
|
|
7
|
+
|
|
8
|
+
| Symbol | Kind | Summary | Docs |
|
|
9
|
+
|---|---|---|---|
|
|
10
|
+
| `A11y` | class | Ergonomic wrapper around axe-core. Obtain instances via the `.a11y` accessor on `Browser`, `ElementHandle`, or `Locator` — never construct directly. | [accessibility](accessibility.md) |
|
|
11
|
+
| `A11yError` | class | Thrown by `A11y.check()` when violations are found. | [accessibility](accessibility.md) |
|
|
12
|
+
| `A11yImpact` | type | Severity buckets reported by axe-core. | [accessibility](accessibility.md) |
|
|
13
|
+
| `A11yOptions` | type | — | [accessibility](accessibility.md) |
|
|
14
|
+
| `A11yResult` | type | — | [accessibility](accessibility.md) |
|
|
15
|
+
| `A11yViolation` | type | — | [accessibility](accessibility.md) |
|
|
16
|
+
| `A11yViolationNode` | type | — | [accessibility](accessibility.md) |
|
|
17
|
+
| `Browser` | class | — | [browser-api](browser-api.md) |
|
|
18
|
+
| `BrowserContext` | class | — | [browser-context](browser-context.md) |
|
|
19
|
+
| `BrowserContextConfig` | type | Per-context options stored at creation time. | [browser-context](browser-context.md) |
|
|
20
|
+
| `BrowserContextHooks` | type | Internal hooks the owning {@link Browser } passes to a new context. | [browser-context](browser-context.md) |
|
|
21
|
+
| `By` | class | — | [selectors](selectors.md) |
|
|
22
|
+
| `ChromeService` | class | — | [getting-started](getting-started.md) |
|
|
23
|
+
| `ChromeServiceOptions` | type | — | [getting-started](getting-started.md) |
|
|
24
|
+
| `ClearCookiesFilter` | type | Filter applied to {@link BrowserContext.clearCookies}. | [browser-context](browser-context.md) |
|
|
25
|
+
| `Clock` | class | Controls the virtual clock inside the browser page. | [clock](clock.md) |
|
|
26
|
+
| `ClockInstallOptions` | type | Options for {@link Clock.install}. | [clock](clock.md) |
|
|
27
|
+
| `ClockTime` | type | Accepted forms for a point in time. | [clock](clock.md) |
|
|
28
|
+
| `ConsoleMessage` | type | — | [bidi-features](bidi-features.md) |
|
|
29
|
+
| `ContextStorageStateOptions` | type | Options for {@link BrowserContext.storageState}. | [browser-context](browser-context.md) |
|
|
30
|
+
| `Cookie` | type | — | [bidi-features](bidi-features.md) |
|
|
31
|
+
| `CookieInput` | type | — | [bidi-features](bidi-features.md) |
|
|
32
|
+
| `CraftdriverError` | class | Base class for every error thrown from the public API. | [error-codes](error-codes.md) |
|
|
33
|
+
| `CraftdriverErrorOptions` | type | — | [error-codes](error-codes.md) |
|
|
34
|
+
| `DeviceMetrics` | type | Device metrics for custom mobile emulation | [browser-api](browser-api.md) |
|
|
35
|
+
| `DeviceName` | type | — | [browser-api](browser-api.md) |
|
|
36
|
+
| `devices` | const | Common mobile device presets | [browser-api](browser-api.md) |
|
|
37
|
+
| `Dialog` | type | Represents an open browser dialog (alert / confirm / prompt). Passed to handlers registered with `browser.onDialog()`. | [browser-api](browser-api.md) |
|
|
38
|
+
| `DialogType` | type | The type of a browser dialog. | [browser-api](browser-api.md) |
|
|
39
|
+
| `Download` | type | A file downloaded during a `waitForDownload()` call. | [browser-api](browser-api.md) |
|
|
40
|
+
| `EmulateOptions` | type | Options for {@link Browser.emulate}. Every field is independent; only the keys you pass are applied, others stay at their previous value. Passing `null` for a field clears the override for that field. | [browser-api](browser-api.md) |
|
|
41
|
+
| `ErrorCode` | const | Stable, machine-readable error codes for the public craftdriver API. | [error-codes](error-codes.md) |
|
|
42
|
+
| `ErrorCodeName` | type | — | [error-codes](error-codes.md) |
|
|
43
|
+
| `ErrorCodeValue` | type | — | [error-codes](error-codes.md) |
|
|
44
|
+
| `FirefoxService` | class | — | [getting-started](getting-started.md) |
|
|
45
|
+
| `FirefoxServiceOptions` | type | — | [getting-started](getting-started.md) |
|
|
46
|
+
| `Frame` | class | — | [browser-api](browser-api.md) |
|
|
47
|
+
| `InitScriptHandle` | type | A handle returned by {@link BrowserContext.addInitScript}. | [browser-context](browser-context.md) |
|
|
48
|
+
| `InterceptedRequest` | type | — | [bidi-features](bidi-features.md) |
|
|
49
|
+
| `InterceptedResponse` | type | — | [bidi-features](bidi-features.md) |
|
|
50
|
+
| `JavaScriptError` | type | — | [bidi-features](bidi-features.md) |
|
|
51
|
+
| `Key` | const | — | [keyboard-mouse](keyboard-mouse.md) |
|
|
52
|
+
| `Keyboard` | class | — | [keyboard-mouse](keyboard-mouse.md) |
|
|
53
|
+
| `LaunchOptions` | type | — | [browser-api](browser-api.md) |
|
|
54
|
+
| `LoadState` | type | When to consider a navigation complete. - `'load'` — page `load` event has fired (default) - `'domcontentloaded'` — `DOMContentLoaded` has fired (faster, no waiting for images/fonts) - `'networkidle'` — `load` + no in-flight requests for 500 ms - `'none'` — do not wait; return as soon as the navigation is initiated | [browser-api](browser-api.md) |
|
|
55
|
+
| `Locator` | class | — | [selectors](selectors.md) |
|
|
56
|
+
| `LogMessage` | type | — | [bidi-features](bidi-features.md) |
|
|
57
|
+
| `LogMonitor` | class | — | [bidi-features](bidi-features.md) |
|
|
58
|
+
| `MobileEmulation` | type | Mobile emulation configuration | [browser-api](browser-api.md) |
|
|
59
|
+
| `MockResponse` | type | — | [bidi-features](bidi-features.md) |
|
|
60
|
+
| `Mouse` | class | — | [keyboard-mouse](keyboard-mouse.md) |
|
|
61
|
+
| `NetworkInterceptor` | class | — | [bidi-features](bidi-features.md) |
|
|
62
|
+
| `Page` | class | — | [browser-api](browser-api.md) |
|
|
63
|
+
| `RoutePattern` | type | Pattern accepted by {@link BrowserContext.route}. Same shape as the browser-level interceptor. | [browser-context](browser-context.md) |
|
|
64
|
+
| `SessionState` | type | — | [bidi-features](bidi-features.md) |
|
|
65
|
+
| `SessionStateManager` | class | — | [bidi-features](bidi-features.md) |
|
|
66
|
+
| `StorageStateOptions` | type | — | [bidi-features](bidi-features.md) |
|
|
67
|
+
| `TraceEvent` | type | — | [tracing](tracing.md) |
|
|
68
|
+
| `TraceScreenshotMode` | type | Screenshot mode for tracing. | [tracing](tracing.md) |
|
|
69
|
+
| `TraceStartOptions` | type | — | [tracing](tracing.md) |
|
|
70
|
+
|
|
71
|
+
Total exports: **60**.
|