@wdio/selenium-devtools 0.0.1

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.
Files changed (56) hide show
  1. package/README.md +411 -0
  2. package/dist/assertPatcher.d.ts +11 -0
  3. package/dist/assertPatcher.js +123 -0
  4. package/dist/assertPatcher.js.map +1 -0
  5. package/dist/bidi.d.ts +6 -0
  6. package/dist/bidi.js +222 -0
  7. package/dist/bidi.js.map +1 -0
  8. package/dist/constants.d.ts +75 -0
  9. package/dist/constants.js +146 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/driverPatcher.d.ts +4 -0
  12. package/dist/driverPatcher.js +256 -0
  13. package/dist/driverPatcher.js.map +1 -0
  14. package/dist/helpers/detachedBackend.d.ts +7 -0
  15. package/dist/helpers/detachedBackend.js +34 -0
  16. package/dist/helpers/detachedBackend.js.map +1 -0
  17. package/dist/helpers/runtime.d.ts +3 -0
  18. package/dist/helpers/runtime.js +47 -0
  19. package/dist/helpers/runtime.js.map +1 -0
  20. package/dist/helpers/suiteManager.d.ts +19 -0
  21. package/dist/helpers/suiteManager.js +131 -0
  22. package/dist/helpers/suiteManager.js.map +1 -0
  23. package/dist/helpers/testManager.d.ts +47 -0
  24. package/dist/helpers/testManager.js +158 -0
  25. package/dist/helpers/testManager.js.map +1 -0
  26. package/dist/helpers/utils.d.ts +26 -0
  27. package/dist/helpers/utils.js +187 -0
  28. package/dist/helpers/utils.js.map +1 -0
  29. package/dist/helpers/videoEncoder.d.ts +2 -0
  30. package/dist/helpers/videoEncoder.js +89 -0
  31. package/dist/helpers/videoEncoder.js.map +1 -0
  32. package/dist/index.d.ts +15 -0
  33. package/dist/index.js +801 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/reporter.d.ts +18 -0
  36. package/dist/reporter.js +72 -0
  37. package/dist/reporter.js.map +1 -0
  38. package/dist/rerunManager.d.ts +8 -0
  39. package/dist/rerunManager.js +78 -0
  40. package/dist/rerunManager.js.map +1 -0
  41. package/dist/runnerHooks.d.ts +6 -0
  42. package/dist/runnerHooks.js +594 -0
  43. package/dist/runnerHooks.js.map +1 -0
  44. package/dist/screencast.d.ts +11 -0
  45. package/dist/screencast.js +179 -0
  46. package/dist/screencast.js.map +1 -0
  47. package/dist/session.d.ts +48 -0
  48. package/dist/session.js +480 -0
  49. package/dist/session.js.map +1 -0
  50. package/dist/setupConsole.d.ts +1 -0
  51. package/dist/setupConsole.js +13 -0
  52. package/dist/setupConsole.js.map +1 -0
  53. package/dist/types.d.ts +235 -0
  54. package/dist/types.js +5 -0
  55. package/dist/types.js.map +1 -0
  56. package/package.json +68 -0
@@ -0,0 +1,480 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { createRequire } from 'node:module';
4
+ import logger from '@wdio/logger';
5
+ import { WebSocket } from 'ws';
6
+ import { CONSOLE_METHODS, LOG_SOURCES, NAVIGATION_COMMANDS, SPINNER_RE } from './constants.js';
7
+ import { stripAnsiCodes, detectLogLevel, createConsoleLogEntry, chromeLogLevelToLogLevel } from './helpers/utils.js';
8
+ import { getDriverOriginals } from './driverPatcher.js';
9
+ const require = createRequire(import.meta.url);
10
+ const log = logger('@wdio/selenium-devtools:SessionCapturer');
11
+ export class SessionCapturer {
12
+ #ws;
13
+ #originalConsoleMethods;
14
+ #originalProcessMethods;
15
+ #isCapturingConsole = false;
16
+ #isCapturingStream = false;
17
+ #hasConnected = false;
18
+ #driver;
19
+ #commandCounter = 0;
20
+ #sentCommandIds = new Set();
21
+ // True once BiDi inspectors are attached — script-trace path skips streams.
22
+ bidiActive = false;
23
+ #clientConnected = false;
24
+ #clientConnectedWaiters = [];
25
+ #onClientDisconnected;
26
+ commandsLog = [];
27
+ sources = new Map();
28
+ consoleLogs = [];
29
+ mutations = [];
30
+ traceLogs = [];
31
+ networkRequests = [];
32
+ metadata;
33
+ constructor(devtoolsOptions = {}, driver) {
34
+ const { port, hostname } = devtoolsOptions;
35
+ this.#driver = driver;
36
+ if (hostname && port) {
37
+ this.#ws = new WebSocket(`ws://${hostname}:${port}/worker`);
38
+ this.#ws.on('open', () => {
39
+ this.#hasConnected = true;
40
+ log.info('✓ Worker WebSocket connected to backend');
41
+ });
42
+ this.#ws.on('message', (raw) => {
43
+ try {
44
+ const parsed = JSON.parse(raw.toString());
45
+ if (parsed?.scope === 'clientConnected') {
46
+ this.#clientConnected = true;
47
+ const waiters = this.#clientConnectedWaiters;
48
+ this.#clientConnectedWaiters = [];
49
+ for (const w of waiters) {
50
+ try {
51
+ w();
52
+ }
53
+ catch {
54
+ /* ignore */
55
+ }
56
+ }
57
+ }
58
+ else if (parsed?.scope === 'clientDisconnected') {
59
+ this.#onClientDisconnected?.();
60
+ }
61
+ }
62
+ catch {
63
+ // ignore non-JSON messages
64
+ }
65
+ });
66
+ this.#ws.on('error', (err) => log.error(`Couldn't connect to devtools backend: ${err.message}`));
67
+ this.#ws.on('close', () => {
68
+ log.info('Worker WebSocket disconnected');
69
+ });
70
+ }
71
+ this.#originalConsoleMethods = {
72
+ log: console.log,
73
+ info: console.info,
74
+ warn: console.warn,
75
+ error: console.error
76
+ };
77
+ this.#originalProcessMethods = {
78
+ stdoutWrite: process.stdout.write.bind(process.stdout),
79
+ stderrWrite: process.stderr.write.bind(process.stderr)
80
+ };
81
+ this.#patchConsole();
82
+ this.#interceptProcessStreams();
83
+ }
84
+ setDriver(driver) {
85
+ this.#driver = driver;
86
+ }
87
+ awaitClientConnected() {
88
+ if (this.#clientConnected) {
89
+ return Promise.resolve();
90
+ }
91
+ return new Promise((resolve) => {
92
+ this.#clientConnectedWaiters.push(resolve);
93
+ });
94
+ }
95
+ setClientDisconnectedHandler(fn) {
96
+ this.#onClientDisconnected = fn;
97
+ }
98
+ // ---- console & terminal capture ------------------------------------------
99
+ #patchConsole() {
100
+ // Non-standard consoles (Jest CustomConsole, Vitest) reroute writes past
101
+ // our text filter and create a feedback loop — rely on stream interception.
102
+ const protoName = Object.getPrototypeOf(console)?.constructor?.name;
103
+ if (protoName && protoName !== 'Console') {
104
+ log.info(`Detected non-standard console (${protoName}) — skipping console patching, using stdout interception only`);
105
+ return;
106
+ }
107
+ CONSOLE_METHODS.forEach((method) => {
108
+ const originalMethod = this.#originalConsoleMethods[method];
109
+ console[method] = (...consoleArgs) => {
110
+ this.#isCapturingConsole = true;
111
+ const result = originalMethod.apply(console, consoleArgs);
112
+ this.#isCapturingConsole = false;
113
+ const rawText = consoleArgs
114
+ .map((a) => typeof a === 'object' && a !== null ? JSON.stringify(a) : String(a))
115
+ .join(' ');
116
+ const cleanText = stripAnsiCodes(rawText).trim();
117
+ if (!cleanText) {
118
+ return result;
119
+ }
120
+ if (this.#isInternalStreamLine(cleanText)) {
121
+ return result;
122
+ }
123
+ const logEntry = createConsoleLogEntry(method, [cleanText], LOG_SOURCES.TEST);
124
+ this.consoleLogs.push(logEntry);
125
+ this.sendUpstream('consoleLogs', [logEntry]);
126
+ return result;
127
+ };
128
+ });
129
+ }
130
+ // Drop lines that would feed back into sendUpstream and loop: pino JSON,
131
+ // [SESSION] markers, backend logs, Jest console.info framing.
132
+ #isInternalStreamLine(line) {
133
+ const t = line.trim();
134
+ if (t.startsWith('{"') || t.startsWith('[SESSION]')) {
135
+ return true;
136
+ }
137
+ if (t.includes('@wdio/devtools-backend')) {
138
+ return true;
139
+ }
140
+ if (/^console\.(log|info|warn|error|debug|trace)$/.test(t)) {
141
+ return true;
142
+ }
143
+ if (/^at\s.+:\d+:\d+\)?$/.test(t)) {
144
+ return true;
145
+ }
146
+ return false;
147
+ }
148
+ #interceptProcessStreams() {
149
+ const captureTerminalOutput = (outputData) => {
150
+ if (this.#isCapturingStream) {
151
+ return;
152
+ }
153
+ const outputText = typeof outputData === 'string' ? outputData : outputData.toString();
154
+ if (!outputText?.trim()) {
155
+ return;
156
+ }
157
+ this.#isCapturingStream = true;
158
+ try {
159
+ const linesToCapture = [];
160
+ for (const rawLine of outputText.split('\n')) {
161
+ const segments = rawLine.split('\r').filter((s) => s.trim());
162
+ const lastSegment = segments[segments.length - 1] ?? rawLine;
163
+ const clean = stripAnsiCodes(lastSegment).trim();
164
+ if (!clean ||
165
+ this.#isInternalStreamLine(clean) ||
166
+ SPINNER_RE.test(clean)) {
167
+ continue;
168
+ }
169
+ linesToCapture.push(clean);
170
+ }
171
+ for (const clean of linesToCapture) {
172
+ const entry = createConsoleLogEntry(detectLogLevel(clean), [clean], LOG_SOURCES.TERMINAL);
173
+ this.consoleLogs.push(entry);
174
+ this.sendUpstream('consoleLogs', [entry]);
175
+ }
176
+ }
177
+ finally {
178
+ this.#isCapturingStream = false;
179
+ }
180
+ };
181
+ const interceptStreamWrite = (stream, original) => {
182
+ const capturer = this;
183
+ stream.write = function (chunk, ...rest) {
184
+ const writeResult = original.call(stream, chunk, ...rest);
185
+ if (chunk && !capturer.#isCapturingConsole) {
186
+ captureTerminalOutput(chunk);
187
+ }
188
+ return writeResult;
189
+ };
190
+ };
191
+ interceptStreamWrite(process.stdout, this.#originalProcessMethods.stdoutWrite);
192
+ interceptStreamWrite(process.stderr, this.#originalProcessMethods.stderrWrite);
193
+ }
194
+ #restoreConsole() {
195
+ CONSOLE_METHODS.forEach((method) => {
196
+ console[method] = this.#originalConsoleMethods[method];
197
+ });
198
+ }
199
+ #restoreProcessStreams() {
200
+ process.stdout.write = this.#originalProcessMethods.stdoutWrite;
201
+ process.stderr.write = this.#originalProcessMethods.stderrWrite;
202
+ }
203
+ cleanup() {
204
+ this.#restoreConsole();
205
+ this.#restoreProcessStreams();
206
+ }
207
+ // ---- WebSocket plumbing --------------------------------------------------
208
+ get isReportingUpstream() {
209
+ return Boolean(this.#ws) && this.#ws?.readyState === WebSocket.OPEN;
210
+ }
211
+ isConnected() {
212
+ return this.#ws?.readyState === WebSocket.OPEN;
213
+ }
214
+ async waitForConnection(timeoutMs = 5000) {
215
+ if (!this.#ws) {
216
+ return false;
217
+ }
218
+ if (this.#ws.readyState === WebSocket.OPEN) {
219
+ return true;
220
+ }
221
+ return new Promise((resolve) => {
222
+ const timeout = setTimeout(() => {
223
+ log.warn(`WebSocket connection timeout after ${timeoutMs}ms`);
224
+ resolve(false);
225
+ }, timeoutMs);
226
+ this.#ws.once('open', () => {
227
+ clearTimeout(timeout);
228
+ resolve(true);
229
+ });
230
+ this.#ws.once('error', () => {
231
+ clearTimeout(timeout);
232
+ resolve(false);
233
+ });
234
+ });
235
+ }
236
+ async closeWebSocket() {
237
+ if (!this.#ws || this.#ws.readyState === WebSocket.CLOSED) {
238
+ return;
239
+ }
240
+ return new Promise((resolve) => {
241
+ const timeout = setTimeout(resolve, 2000);
242
+ this.#ws.once('close', () => {
243
+ clearTimeout(timeout);
244
+ resolve();
245
+ });
246
+ this.#ws.close();
247
+ });
248
+ }
249
+ sendUpstream(event, data) {
250
+ // Silent drops — logging here would loop back through stream interception.
251
+ if (!this.#ws || this.#ws.readyState !== WebSocket.OPEN) {
252
+ return;
253
+ }
254
+ try {
255
+ this.#ws.send(JSON.stringify({ scope: event, data }));
256
+ }
257
+ catch {
258
+ /* teardown */
259
+ }
260
+ }
261
+ // ---- command capture -----------------------------------------------------
262
+ #serializeError(error) {
263
+ return error
264
+ ? { name: error.name, message: error.message, stack: error.stack }
265
+ : undefined;
266
+ }
267
+ async captureCommand(command, args, result, error, testUid, callSource, timestamp) {
268
+ const commandId = this.#commandCounter++;
269
+ // `id` is the stable lookup key — chained calls share a ms timestamp,
270
+ // so timestamp-based matching rewrites the wrong entry on async updates.
271
+ const entry = {
272
+ _id: commandId,
273
+ id: commandId,
274
+ command,
275
+ args,
276
+ result,
277
+ error: this.#serializeError(error),
278
+ timestamp: timestamp || Date.now(),
279
+ callSource,
280
+ testUid
281
+ };
282
+ this.commandsLog.push(entry);
283
+ return entry;
284
+ }
285
+ sendCommand(command) {
286
+ if (command._id !== undefined && !this.#sentCommandIds.has(command._id)) {
287
+ this.#sentCommandIds.add(command._id);
288
+ const toSend = { ...command };
289
+ delete toSend._id;
290
+ this.sendUpstream('commands', [toSend]);
291
+ }
292
+ }
293
+ sendReplaceCommand(oldTimestamp, command) {
294
+ const toSend = { ...command };
295
+ delete toSend._id;
296
+ this.sendUpstream('replaceCommand', { oldTimestamp, command: toSend });
297
+ }
298
+ /** Update an existing entry in place (matched by `_id`) for retry coalesce. */
299
+ replaceCommand(oldId, command, args, result, error, testUid, callSource, timestamp) {
300
+ const idx = this.commandsLog.findIndex((c) => c._id === oldId);
301
+ const oldTimestamp = idx !== -1 ? (this.commandsLog[idx].timestamp ?? 0) : 0;
302
+ if (idx === -1) {
303
+ const fresh = {
304
+ _id: this.#commandCounter++,
305
+ id: undefined,
306
+ command,
307
+ args,
308
+ result,
309
+ error: this.#serializeError(error),
310
+ timestamp: timestamp || Date.now(),
311
+ callSource,
312
+ testUid
313
+ };
314
+ fresh.id = fresh._id;
315
+ this.commandsLog.push(fresh);
316
+ return { entry: fresh, oldTimestamp: 0 };
317
+ }
318
+ const previous = this.commandsLog[idx];
319
+ previous.command = command;
320
+ previous.args = args;
321
+ previous.result = result;
322
+ previous.error = this.#serializeError(error);
323
+ previous.timestamp = timestamp || Date.now();
324
+ previous.callSource = callSource;
325
+ previous.testUid = testUid;
326
+ return { entry: previous, oldTimestamp };
327
+ }
328
+ // Uses the unwrapped original to avoid recursing through the command capturer.
329
+ async takeScreenshot() {
330
+ const driver = this.#driver;
331
+ const originals = getDriverOriginals();
332
+ const fn = originals.takeScreenshot;
333
+ if (!driver || !fn) {
334
+ return null;
335
+ }
336
+ try {
337
+ const data = await fn(driver);
338
+ return data || null;
339
+ }
340
+ catch (err) {
341
+ log.warn(`[screenshot] Failed: ${err.message}`);
342
+ return null;
343
+ }
344
+ }
345
+ // ---- source files --------------------------------------------------------
346
+ async captureSource(filePath) {
347
+ if (this.sources.has(filePath)) {
348
+ return;
349
+ }
350
+ try {
351
+ const source = await fs.readFile(filePath, 'utf-8');
352
+ this.sources.set(filePath, source.toString());
353
+ this.sendUpstream('sources', { [filePath]: source.toString() });
354
+ }
355
+ catch (err) {
356
+ log.warn(`Failed to read source file ${filePath}: ${err.message}`);
357
+ }
358
+ }
359
+ // ---- browser-side trace (script injection) -------------------------------
360
+ async injectScript() {
361
+ const driver = this.#driver;
362
+ const exec = getDriverOriginals().executeScript;
363
+ if (!driver || !exec) {
364
+ return;
365
+ }
366
+ try {
367
+ const scriptPath = require.resolve('@wdio/devtools-script');
368
+ const scriptDir = path.dirname(scriptPath);
369
+ const preloadScriptPath = path.join(scriptDir, 'script.js');
370
+ let scriptContent = await fs.readFile(preloadScriptPath, 'utf-8');
371
+ // Wrap top-level await so it can run inside a <script> body.
372
+ scriptContent = `(async function() { ${scriptContent} })()`;
373
+ await exec(driver, "var s=document.createElement('script');s.textContent=arguments[0];document.head.appendChild(s);return true;", scriptContent);
374
+ for (let i = 0; i < 5; i++) {
375
+ await new Promise((r) => setTimeout(r, 200));
376
+ const ready = await exec(driver, 'return typeof window.wdioTraceCollector !== "undefined";');
377
+ if (ready === true) {
378
+ log.info('✓ Script injected and collector ready');
379
+ return;
380
+ }
381
+ }
382
+ log.warn('Script injection may have failed — collector not found');
383
+ }
384
+ catch (err) {
385
+ // Driver torn down between navigation and deferred trace work.
386
+ const msg = err.message ?? '';
387
+ if (msg.includes('ECONNREFUSED') ||
388
+ msg.includes('no such session') ||
389
+ msg.includes('invalid session id')) {
390
+ return;
391
+ }
392
+ log.error(`Failed to inject script: ${msg}`);
393
+ }
394
+ }
395
+ async captureTrace() {
396
+ const driver = this.#driver;
397
+ const exec = getDriverOriginals().executeScript;
398
+ if (!driver || !exec) {
399
+ return;
400
+ }
401
+ try {
402
+ const ready = await exec(driver, 'return typeof window.wdioTraceCollector !== "undefined";');
403
+ if (ready !== true) {
404
+ return;
405
+ }
406
+ const traceData = await exec(driver, 'return window.wdioTraceCollector.getTraceData();');
407
+ if (!traceData) {
408
+ return;
409
+ }
410
+ const { mutations, traceLogs, consoleLogs, networkRequests, metadata } = traceData;
411
+ if (metadata) {
412
+ this.metadata = { ...this.metadata, ...metadata };
413
+ this.sendUpstream('metadata', this.metadata);
414
+ }
415
+ if (!this.bidiActive &&
416
+ Array.isArray(consoleLogs) &&
417
+ consoleLogs.length > 0) {
418
+ const tagged = consoleLogs.map((e) => ({
419
+ ...e,
420
+ source: LOG_SOURCES.BROWSER
421
+ }));
422
+ this.consoleLogs.push(...tagged);
423
+ this.sendUpstream('consoleLogs', tagged);
424
+ }
425
+ if (!this.bidiActive &&
426
+ Array.isArray(networkRequests) &&
427
+ networkRequests.length > 0) {
428
+ this.networkRequests.push(...networkRequests);
429
+ this.sendUpstream('networkRequests', networkRequests);
430
+ }
431
+ if (Array.isArray(mutations) && mutations.length > 0) {
432
+ this.mutations.push(...mutations);
433
+ this.sendUpstream('mutations', mutations);
434
+ }
435
+ if (Array.isArray(traceLogs) && traceLogs.length > 0) {
436
+ this.traceLogs.push(...traceLogs);
437
+ this.sendUpstream('logs', traceLogs);
438
+ }
439
+ }
440
+ catch (err) {
441
+ const msg = err.message ?? '';
442
+ if (msg.includes('ECONNREFUSED') ||
443
+ msg.includes('no such session') ||
444
+ msg.includes('invalid session id')) {
445
+ return;
446
+ }
447
+ log.error(`Failed to capture trace from injected script: ${msg}`);
448
+ }
449
+ }
450
+ // ---- WebDriver browser/perf log capture ----------------------------------
451
+ /** Pulls Chrome browser logs (requires `goog:loggingPrefs: { browser: 'ALL' }`). */
452
+ async captureBrowserLogs() {
453
+ const driver = this.#driver;
454
+ const manage = getDriverOriginals().manage;
455
+ if (!driver || !manage) {
456
+ return;
457
+ }
458
+ try {
459
+ const entries = await manage(driver).logs().get('browser');
460
+ if (!Array.isArray(entries) || entries.length === 0) {
461
+ return;
462
+ }
463
+ const tagged = entries.map((entry) => ({
464
+ timestamp: entry.timestamp,
465
+ type: chromeLogLevelToLogLevel(entry.level),
466
+ args: [entry.message],
467
+ source: LOG_SOURCES.BROWSER
468
+ }));
469
+ this.consoleLogs.push(...tagged);
470
+ this.sendUpstream('consoleLogs', tagged);
471
+ }
472
+ catch {
473
+ // logging not enabled — silent
474
+ }
475
+ }
476
+ isNavigationCommand(command) {
477
+ return NAVIGATION_COMMANDS.some((c) => command.toLowerCase().includes(c.toLowerCase()));
478
+ }
479
+ }
480
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ // MUST be the first import in `src/index.ts`. `loglevel` binds
2
+ // `console[method]` at logger-creation time, so we have to swap Jest/Vitest's
3
+ // buffered console for a plain Node Console before any logger is created.
4
+ import { Console } from 'node:console';
5
+ const protoName = Object.getPrototypeOf(globalThis.console)?.constructor?.name;
6
+ if (protoName && protoName !== 'Console') {
7
+ globalThis.console = new Console({
8
+ stdout: process.stdout,
9
+ stderr: process.stderr,
10
+ colorMode: 'auto'
11
+ });
12
+ }
13
+ //# sourceMappingURL=setupConsole.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupConsole.js","sourceRoot":"","sources":["../src/setupConsole.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,8EAA8E;AAC9E,0EAA0E;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,IAAI,CAAA;AAC9E,IAAI,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;IACzC,UAAU,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC;QAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,MAAM;KAClB,CAAC,CAAA;AACJ,CAAC"}