craftdriver 1.5.0 → 1.7.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 +24 -0
- package/README.md +7 -3
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +4 -0
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/mcp/server.d.ts.map +1 -1
- package/dist/cli/mcp/server.js +4 -0
- package/dist/cli/mcp/server.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/browser.d.ts +73 -22
- package/dist/lib/browser.d.ts.map +1 -1
- package/dist/lib/browser.js +155 -41
- package/dist/lib/browser.js.map +1 -1
- package/dist/lib/browserContext.d.ts +1 -1
- package/dist/lib/browserContext.d.ts.map +1 -1
- package/dist/lib/builder.d.ts +12 -1
- package/dist/lib/builder.d.ts.map +1 -1
- package/dist/lib/builder.js +26 -0
- package/dist/lib/builder.js.map +1 -1
- package/dist/lib/capabilities.d.ts +8 -0
- package/dist/lib/capabilities.d.ts.map +1 -1
- package/dist/lib/capabilities.js +26 -10
- package/dist/lib/capabilities.js.map +1 -1
- package/dist/lib/driver.d.ts +17 -1
- package/dist/lib/driver.d.ts.map +1 -1
- package/dist/lib/driver.js +27 -2
- package/dist/lib/driver.js.map +1 -1
- package/dist/lib/elementHandle.d.ts.map +1 -1
- package/dist/lib/elementHandle.js +34 -0
- package/dist/lib/elementHandle.js.map +1 -1
- package/dist/lib/errors.d.ts +7 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +7 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js +31 -10
- package/dist/lib/http.js.map +1 -1
- package/dist/lib/launchTarget.d.ts +21 -2
- package/dist/lib/launchTarget.d.ts.map +1 -1
- package/dist/lib/launchTarget.js +105 -17
- package/dist/lib/launchTarget.js.map +1 -1
- package/dist/lib/remote.d.ts +55 -0
- package/dist/lib/remote.d.ts.map +1 -0
- package/dist/lib/remote.js +127 -0
- package/dist/lib/remote.js.map +1 -0
- package/dist/lib/timing.d.ts +8 -0
- package/dist/lib/timing.d.ts.map +1 -1
- package/dist/lib/timing.js +8 -0
- package/dist/lib/timing.js.map +1 -1
- package/dist/lib/tracing.d.ts +1 -1
- package/dist/lib/tracing.d.ts.map +1 -1
- package/dist/lib/tracing.js.map +1 -1
- package/dist/lib/types.d.ts +22 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/vibiumTrace.d.ts +1 -1
- package/dist/lib/vibiumTrace.d.ts.map +1 -1
- package/dist/lib/visual/antialias.d.ts +41 -0
- package/dist/lib/visual/antialias.d.ts.map +1 -0
- package/dist/lib/visual/antialias.js +126 -0
- package/dist/lib/visual/antialias.js.map +1 -0
- package/dist/lib/visual/codec.d.ts +24 -0
- package/dist/lib/visual/codec.d.ts.map +1 -0
- package/dist/lib/visual/codec.js +11 -0
- package/dist/lib/visual/codec.js.map +1 -0
- package/dist/lib/visual/compare.d.ts +38 -0
- package/dist/lib/visual/compare.d.ts.map +1 -0
- package/dist/lib/visual/compare.js +209 -0
- package/dist/lib/visual/compare.js.map +1 -0
- package/dist/lib/visual/diff.d.ts +18 -0
- package/dist/lib/visual/diff.d.ts.map +1 -0
- package/dist/lib/visual/diff.js +23 -0
- package/dist/lib/visual/diff.js.map +1 -0
- package/dist/lib/visual/expectScreenshot.d.ts +65 -0
- package/dist/lib/visual/expectScreenshot.d.ts.map +1 -0
- package/dist/lib/visual/expectScreenshot.js +287 -0
- package/dist/lib/visual/expectScreenshot.js.map +1 -0
- package/dist/lib/visual/index.d.ts +10 -0
- package/dist/lib/visual/index.d.ts.map +1 -0
- package/dist/lib/visual/index.js +9 -0
- package/dist/lib/visual/index.js.map +1 -0
- package/dist/lib/visual/pixelMath.d.ts +32 -0
- package/dist/lib/visual/pixelMath.d.ts.map +1 -0
- package/dist/lib/visual/pixelMath.js +70 -0
- package/dist/lib/visual/pixelMath.js.map +1 -0
- package/dist/lib/visual/pngHeader.d.ts +27 -0
- package/dist/lib/visual/pngHeader.d.ts.map +1 -0
- package/dist/lib/visual/pngHeader.js +63 -0
- package/dist/lib/visual/pngHeader.js.map +1 -0
- package/dist/lib/visual/pngjsCodec.d.ts +22 -0
- package/dist/lib/visual/pngjsCodec.d.ts.map +1 -0
- package/dist/lib/visual/pngjsCodec.js +70 -0
- package/dist/lib/visual/pngjsCodec.js.map +1 -0
- package/dist/lib/visual/types.d.ts +89 -0
- package/dist/lib/visual/types.d.ts.map +1 -0
- package/dist/lib/visual/types.js +20 -0
- package/dist/lib/visual/types.js.map +1 -0
- package/dist/lib/visual/visualError.d.ts +32 -0
- package/dist/lib/visual/visualError.d.ts.map +1 -0
- package/dist/lib/visual/visualError.js +59 -0
- package/dist/lib/visual/visualError.js.map +1 -0
- package/dist/lib/wait.d.ts.map +1 -1
- package/dist/lib/wait.js +7 -1
- package/dist/lib/wait.js.map +1 -1
- package/docs/api-reference.md +18 -2
- package/docs/browser-api.md +5 -4
- package/docs/driver-configuration.md +6 -0
- package/docs/error-codes.md +1 -0
- package/docs/index.md +1 -0
- package/docs/keyboard-mouse.md +7 -5
- package/docs/recipes/run-on-browserstack.md +265 -0
- package/docs/recipes.md +15 -1
- package/docs/remote-webdriver.md +308 -0
- package/docs/screenshots.md +15 -6
- package/docs/standards.md +15 -10
- package/docs/visual-testing.md +254 -0
- package/docs/why-craftdriver.md +5 -2
- package/package.json +5 -1
package/dist/lib/http.js
CHANGED
|
@@ -10,7 +10,12 @@ import { CraftdriverError, ErrorCode } from './errors.js';
|
|
|
10
10
|
*/
|
|
11
11
|
const agents = new Map();
|
|
12
12
|
function agentKey(endpoint) {
|
|
13
|
-
|
|
13
|
+
// Remote endpoints stamp a unique poolKey (see parseRemoteEndpoint) so
|
|
14
|
+
// concurrent sessions sharing one grid/hub host:port never share an agent
|
|
15
|
+
// — quitting one session must not destroy another's in-flight sockets.
|
|
16
|
+
// Local endpoints never set poolKey and keep the original host:port
|
|
17
|
+
// keying (every local DriverService already picks its own free port).
|
|
18
|
+
return endpoint.poolKey ?? `${endpoint.protocol}//${endpoint.hostname}:${endpoint.port}`;
|
|
14
19
|
}
|
|
15
20
|
function getAgent(endpoint) {
|
|
16
21
|
const key = agentKey(endpoint);
|
|
@@ -93,10 +98,19 @@ export class HttpClient {
|
|
|
93
98
|
this.endpoint = endpoint;
|
|
94
99
|
}
|
|
95
100
|
async send({ method, path, body, timeoutMs, }) {
|
|
96
|
-
|
|
97
|
-
|
|
101
|
+
// WHATWG URL: an absolute-path second arg to `new URL(path, base)`
|
|
102
|
+
// *replaces* base's path rather than concatenating — so joining directly
|
|
103
|
+
// against a base carrying `endpoint.path` (e.g. a Grid's `/wd/hub`)
|
|
104
|
+
// silently dropped it. Concatenate the base path onto `path` ourselves
|
|
105
|
+
// first, then resolve against the origin only. For local endpoints
|
|
106
|
+
// `endpoint.path` is always `''`, so `basePath` is `''` and this is
|
|
107
|
+
// byte-identical to the previous behavior.
|
|
108
|
+
const basePath = (this.endpoint.path ?? '').replace(/\/$/, '');
|
|
109
|
+
const origin = `${this.endpoint.protocol}://${this.endpoint.hostname}:${this.endpoint.port}`;
|
|
110
|
+
const url = new URL(`${basePath}${path}`, origin);
|
|
98
111
|
const isHttps = url.protocol === 'https:';
|
|
99
112
|
const payload = body ? JSON.stringify(body) : undefined;
|
|
113
|
+
const effectiveTimeoutMs = timeoutMs ?? this.endpoint.commandTimeoutMs;
|
|
100
114
|
const options = {
|
|
101
115
|
method,
|
|
102
116
|
agent: getAgent(this.endpoint),
|
|
@@ -104,6 +118,12 @@ export class HttpClient {
|
|
|
104
118
|
'Content-Type': 'application/json; charset=utf-8',
|
|
105
119
|
Accept: 'application/json',
|
|
106
120
|
...(payload ? { 'Content-Length': Buffer.byteLength(payload) } : {}),
|
|
121
|
+
...(this.endpoint.auth
|
|
122
|
+
? {
|
|
123
|
+
Authorization: 'Basic ' +
|
|
124
|
+
Buffer.from(`${this.endpoint.auth.username}:${this.endpoint.auth.password}`).toString('base64'),
|
|
125
|
+
}
|
|
126
|
+
: {}),
|
|
107
127
|
},
|
|
108
128
|
};
|
|
109
129
|
const transport = isHttps ? https : http;
|
|
@@ -151,15 +171,16 @@ export class HttpClient {
|
|
|
151
171
|
});
|
|
152
172
|
});
|
|
153
173
|
req.on('error', (err) => settleReject(buildTransportError(err, method, path)));
|
|
154
|
-
// Only armed when the caller opts in
|
|
155
|
-
//
|
|
156
|
-
// forever with no way for the caller to
|
|
157
|
-
// the one call site that
|
|
158
|
-
|
|
174
|
+
// Only armed when the caller opts in, or the endpoint carries a
|
|
175
|
+
// default (remote endpoints only — see `commandTimeoutMs`) — a hung
|
|
176
|
+
// connection otherwise waits forever with no way for the caller to
|
|
177
|
+
// recover. `Driver.create()` is the one local call site that sets its
|
|
178
|
+
// own `timeoutMs`; every other local command leaves both unset.
|
|
179
|
+
if (effectiveTimeoutMs) {
|
|
159
180
|
timer = setTimeout(() => {
|
|
160
|
-
settleReject(new CraftdriverError(ErrorCode.DRIVER_ERROR, `WebDriver command ${method} ${path} timed out after ${
|
|
181
|
+
settleReject(new CraftdriverError(ErrorCode.DRIVER_ERROR, `WebDriver command ${method} ${path} timed out after ${effectiveTimeoutMs}ms waiting for a response`, { detail: { method, path, timeoutMs: effectiveTimeoutMs } }));
|
|
161
182
|
req.destroy();
|
|
162
|
-
},
|
|
183
|
+
}, effectiveTimeoutMs);
|
|
163
184
|
}
|
|
164
185
|
if (payload)
|
|
165
186
|
req.write(payload);
|
package/dist/lib/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoC,CAAC;AAE3D,SAAS,QAAQ,CAAC,QAA2B;IAC3C,OAAO,GAAG,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import type { RemoteWebDriverOptions } from './remote.js';
|
|
1
2
|
export type SupportedBrowserName = 'chrome' | 'chromium' | 'firefox' | 'safari';
|
|
3
|
+
/** Normalize a provider-facing name for internal engine-specific behavior. */
|
|
4
|
+
export declare function normalizeEngine(browserName: string): string;
|
|
2
5
|
export interface BrowserLaunchTarget {
|
|
3
6
|
kind: 'browser';
|
|
4
7
|
browserName: SupportedBrowserName;
|
|
@@ -17,9 +20,25 @@ export interface ElectronLaunchTarget {
|
|
|
17
20
|
mainProcess?: boolean;
|
|
18
21
|
args?: string[];
|
|
19
22
|
}
|
|
20
|
-
export
|
|
23
|
+
export interface RemoteLaunchTarget {
|
|
24
|
+
kind: 'remote';
|
|
25
|
+
/** Provider-facing browser name, forwarded verbatim. */
|
|
26
|
+
browserName: string;
|
|
27
|
+
/** Normalized engine family for internal checks. */
|
|
28
|
+
engine: string;
|
|
29
|
+
bidiRequested: boolean;
|
|
30
|
+
/** Validated shape; `parseRemoteEndpoint` (`remote.ts`) turns this into a `WebDriverEndpoint`. */
|
|
31
|
+
remote: RemoteWebDriverOptions;
|
|
32
|
+
}
|
|
33
|
+
export type LaunchTarget = BrowserLaunchTarget | ElectronLaunchTarget | RemoteLaunchTarget;
|
|
34
|
+
/**
|
|
35
|
+
* Reject `remote` at the CLI daemon and MCP entry points — both are local dev
|
|
36
|
+
* tools by design. Permanent product boundary, not a gap to fill: no CLI flag
|
|
37
|
+
* or MCP tool for remote exists, and none should be added.
|
|
38
|
+
*/
|
|
39
|
+
export declare function assertLocalOnlyLaunch(options: Record<string, unknown>): void;
|
|
21
40
|
/**
|
|
22
|
-
* Normalize and validate the mutually-exclusive browser/Electron launch
|
|
41
|
+
* Normalize and validate the mutually-exclusive browser/Electron/remote launch
|
|
23
42
|
* surfaces before any filesystem I/O or driver process is started.
|
|
24
43
|
*
|
|
25
44
|
* This function deliberately accepts an untyped record: `Browser.launch` is a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchTarget.d.ts","sourceRoot":"","sources":["../../src/lib/launchTarget.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"launchTarget.d.ts","sourceRoot":"","sources":["../../src/lib/launchTarget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAQ1D,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEhF,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAI3D;AA6CD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,oBAAoB,CAAC;IAClC,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,QAAQ,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,QAAQ,CAAC;IACf,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IACvB,kGAAkG;IAClG,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AAwH3F;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAU5E;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CA6IlF"}
|
package/dist/lib/launchTarget.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { CraftdriverError, ErrorCode } from './errors.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
*/
|
|
2
|
+
// Unknown remote browser names must opt into BiDi explicitly.
|
|
3
|
+
const BIDI_CAPABLE_BY_DEFAULT = new Set(['chrome', 'chromium', 'firefox', 'edge', 'microsoftedge']);
|
|
4
|
+
/** Normalize a provider-facing name for internal engine-specific behavior. */
|
|
5
|
+
export function normalizeEngine(browserName) {
|
|
6
|
+
const lower = browserName.trim().toLowerCase();
|
|
7
|
+
if (lower === 'edge' || lower === 'msedge' || lower === 'microsoftedge')
|
|
8
|
+
return 'chrome';
|
|
9
|
+
return lower;
|
|
10
|
+
}
|
|
11
|
+
/** Reject local launch options that safaridriver cannot honor. */
|
|
12
12
|
function assertSafariCompatible(options) {
|
|
13
13
|
const headlessEnv = process.env.HEADLESS;
|
|
14
14
|
const checks = [
|
|
@@ -26,7 +26,7 @@ function assertSafariCompatible(options) {
|
|
|
26
26
|
present: hasValue(options, 'browserPath'),
|
|
27
27
|
feature: 'browserPath',
|
|
28
28
|
hint: 'Safari is launched from the installed app by safaridriver, not a chosen binary. ' +
|
|
29
|
-
|
|
29
|
+
"To use Safari Technology Preview, pass its safaridriver path via SafariService's binaryPath instead.",
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
present: hasValue(options, 'mobileEmulation'),
|
|
@@ -63,8 +63,91 @@ function optionalStringArray(value, optionName) {
|
|
|
63
63
|
}
|
|
64
64
|
return value;
|
|
65
65
|
}
|
|
66
|
+
// Local-only options rejected on a remote launch.
|
|
67
|
+
const REMOTE_CONFLICTS = [
|
|
68
|
+
['electron', 'remote and electron are different launch targets; choose one'],
|
|
69
|
+
['electronService', 'electronService only applies to an electron launch'],
|
|
70
|
+
['chromeService', 'a remote session has no local driver process to configure'],
|
|
71
|
+
['firefoxService', 'a remote session has no local driver process to configure'],
|
|
72
|
+
['safariService', 'a remote session has no local driver process to configure'],
|
|
73
|
+
['mobileEmulation', 'pass device capabilities via remote.capabilities instead'],
|
|
74
|
+
['args', 'pass browser flags via remote.capabilities (e.g. goog:chromeOptions.args) instead'],
|
|
75
|
+
['browserPath', 'a remote session launches whatever browser the grid/provider offers'],
|
|
76
|
+
['downloadsDir', 'remote sessions have no client-visible downloads directory'],
|
|
77
|
+
];
|
|
78
|
+
function resolveRemoteLaunchTarget(options, enableBiDi) {
|
|
79
|
+
for (const [key, guidance] of REMOTE_CONFLICTS) {
|
|
80
|
+
if (hasValue(options, key)) {
|
|
81
|
+
throw new Error(`remote cannot be combined with ${key}; ${guidance}.`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const remote = options.remote;
|
|
85
|
+
if (!remote || typeof remote !== 'object' || Array.isArray(remote)) {
|
|
86
|
+
throw new Error('remote must be an object containing a url.');
|
|
87
|
+
}
|
|
88
|
+
const remoteOptions = remote;
|
|
89
|
+
if (typeof remoteOptions.url !== 'string' || remoteOptions.url.trim() === '') {
|
|
90
|
+
throw new Error('remote.url must be a non-empty string.');
|
|
91
|
+
}
|
|
92
|
+
const remoteCapabilities = remoteOptions.capabilities;
|
|
93
|
+
const capsObject = remoteCapabilities &&
|
|
94
|
+
typeof remoteCapabilities === 'object' &&
|
|
95
|
+
!Array.isArray(remoteCapabilities)
|
|
96
|
+
? remoteCapabilities
|
|
97
|
+
: undefined;
|
|
98
|
+
const capsBrowserName = capsObject?.browserName;
|
|
99
|
+
const topLevelBrowserName = options.browserName;
|
|
100
|
+
if (topLevelBrowserName !== undefined &&
|
|
101
|
+
(typeof topLevelBrowserName !== 'string' || topLevelBrowserName.trim() === '')) {
|
|
102
|
+
throw new Error('browserName must be a non-empty string.');
|
|
103
|
+
}
|
|
104
|
+
if (capsBrowserName !== undefined &&
|
|
105
|
+
(typeof capsBrowserName !== 'string' || capsBrowserName.trim() === '')) {
|
|
106
|
+
throw new Error('remote.capabilities.browserName must be a non-empty string.');
|
|
107
|
+
}
|
|
108
|
+
if (typeof topLevelBrowserName === 'string' &&
|
|
109
|
+
typeof capsBrowserName === 'string' &&
|
|
110
|
+
topLevelBrowserName.toLowerCase() !== capsBrowserName.toLowerCase()) {
|
|
111
|
+
throw new Error(`browserName ("${topLevelBrowserName}") conflicts with remote.capabilities.browserName ` +
|
|
112
|
+
`("${capsBrowserName}"); set only one.`);
|
|
113
|
+
}
|
|
114
|
+
const requestedName = (typeof topLevelBrowserName === 'string' ? topLevelBrowserName : undefined) ??
|
|
115
|
+
(typeof capsBrowserName === 'string' ? capsBrowserName : undefined) ??
|
|
116
|
+
'chrome';
|
|
117
|
+
const engine = normalizeEngine(requestedName);
|
|
118
|
+
// Known BiDi engines default on; other remote names require explicit opt-in.
|
|
119
|
+
const defaultsToBidi = BIDI_CAPABLE_BY_DEFAULT.has(engine);
|
|
120
|
+
const bidiRequested = defaultsToBidi ? enableBiDi !== false : enableBiDi === true;
|
|
121
|
+
// A caller can't keep BiDi on yet disable its transport: webSocketUrl:false would
|
|
122
|
+
// leave craftdriver negotiating a BiDi session the hub was never asked to provide,
|
|
123
|
+
// silently degrading every BiDi feature to Classic. Reject the contradiction early.
|
|
124
|
+
if (bidiRequested && capsObject?.webSocketUrl === false) {
|
|
125
|
+
throw new CraftdriverError(ErrorCode.INVALID_ARGUMENT, 'remote.capabilities.webSocketUrl is false, which disables WebDriver BiDi, but BiDi is ' +
|
|
126
|
+
`enabled for "${requestedName}". Pass enableBiDi: false to run over WebDriver Classic, ` +
|
|
127
|
+
'or remove webSocketUrl to keep BiDi.', { detail: { browserName: requestedName, feature: 'WebDriver BiDi' } });
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
kind: 'remote',
|
|
131
|
+
browserName: requestedName,
|
|
132
|
+
engine,
|
|
133
|
+
bidiRequested,
|
|
134
|
+
remote: remoteOptions,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
66
137
|
/**
|
|
67
|
-
*
|
|
138
|
+
* Reject `remote` at the CLI daemon and MCP entry points — both are local dev
|
|
139
|
+
* tools by design. Permanent product boundary, not a gap to fill: no CLI flag
|
|
140
|
+
* or MCP tool for remote exists, and none should be added.
|
|
141
|
+
*/
|
|
142
|
+
export function assertLocalOnlyLaunch(options) {
|
|
143
|
+
if (hasValue(options, 'remote')) {
|
|
144
|
+
throw new CraftdriverError(ErrorCode.UNSUPPORTED, 'The craftdriver CLI and MCP server are local dev tools and do not support remote ' +
|
|
145
|
+
'(Selenium Grid / BrowserStack / cloud) sessions. Use the Browser.launch({ remote }) ' +
|
|
146
|
+
'library API directly from your own script instead.', { detail: { feature: 'remote' } });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Normalize and validate the mutually-exclusive browser/Electron/remote launch
|
|
68
151
|
* surfaces before any filesystem I/O or driver process is started.
|
|
69
152
|
*
|
|
70
153
|
* This function deliberately accepts an untyped record: `Browser.launch` is a
|
|
@@ -76,8 +159,10 @@ export function resolveLaunchTarget(options) {
|
|
|
76
159
|
if (enableBiDi !== undefined && typeof enableBiDi !== 'boolean') {
|
|
77
160
|
throw new Error('enableBiDi must be a boolean.');
|
|
78
161
|
}
|
|
79
|
-
|
|
80
|
-
options
|
|
162
|
+
if (hasValue(options, 'remote')) {
|
|
163
|
+
return resolveRemoteLaunchTarget(options, enableBiDi);
|
|
164
|
+
}
|
|
165
|
+
const electronWasProvided = Object.prototype.hasOwnProperty.call(options, 'electron') && options.electron !== undefined;
|
|
81
166
|
if (!electronWasProvided) {
|
|
82
167
|
if (hasValue(options, 'electronService')) {
|
|
83
168
|
throw new Error('electronService requires the electron launch option.');
|
|
@@ -115,10 +200,13 @@ export function resolveLaunchTarget(options) {
|
|
|
115
200
|
}
|
|
116
201
|
const electronOptions = electron;
|
|
117
202
|
const supportedElectronKeys = new Set([
|
|
118
|
-
'appBinaryPath',
|
|
203
|
+
'appBinaryPath',
|
|
204
|
+
'chromedriverPath',
|
|
205
|
+
'version',
|
|
206
|
+
'mainProcess',
|
|
207
|
+
'args',
|
|
119
208
|
]);
|
|
120
|
-
const unknownElectronKey = Object.keys(electronOptions)
|
|
121
|
-
.find((key) => !supportedElectronKeys.has(key));
|
|
209
|
+
const unknownElectronKey = Object.keys(electronOptions).find((key) => !supportedElectronKeys.has(key));
|
|
122
210
|
if (unknownElectronKey) {
|
|
123
211
|
throw new Error(`Unsupported electron option "${unknownElectronKey}". ` +
|
|
124
212
|
'Supported: appBinaryPath, chromedriverPath, version, mainProcess, args.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchTarget.js","sourceRoot":"","sources":["../../src/lib/launchTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"launchTarget.js","sourceRoot":"","sources":["../../src/lib/launchTarget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Capabilities, WebDriverEndpoint } from './types.js';
|
|
2
|
+
export interface RemoteAuth {
|
|
3
|
+
username: string;
|
|
4
|
+
password: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Options for connecting to any W3C-compatible remote WebDriver endpoint —
|
|
8
|
+
* a self-hosted Selenium Grid, BrowserStack, or another cloud provider.
|
|
9
|
+
* Provider-specific detail (BrowserStack's `bstack:options`, etc.) is
|
|
10
|
+
* forwarded through `capabilities` without schema conversion.
|
|
11
|
+
*/
|
|
12
|
+
export interface RemoteWebDriverOptions {
|
|
13
|
+
/** The remote endpoint's WebDriver base URL, e.g. `https://hub.browserstack.com/wd/hub`. */
|
|
14
|
+
url: string;
|
|
15
|
+
/**
|
|
16
|
+
* Basic auth credentials. Mutually exclusive with URL-embedded user-info
|
|
17
|
+
* (`https://user:pass@host/...`) — set one, not both.
|
|
18
|
+
*/
|
|
19
|
+
auth?: RemoteAuth;
|
|
20
|
+
/** W3C capabilities merged under `alwaysMatch`; vendor namespaces are not schema-checked. */
|
|
21
|
+
capabilities?: Record<string, unknown>;
|
|
22
|
+
/** Timeout for the initial `POST /session` call. Defaults to craftdriver's local session-create timeout. */
|
|
23
|
+
sessionTimeoutMs?: number;
|
|
24
|
+
/** Default timeout applied to every WebDriver command after the session is created, unless overridden per call. */
|
|
25
|
+
commandTimeoutMs?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface ParsedRemoteEndpoint {
|
|
28
|
+
endpoint: WebDriverEndpoint;
|
|
29
|
+
/** Timeout for the one `POST /session` call only — not stored on the endpoint, which is per-command. */
|
|
30
|
+
sessionTimeoutMs?: number;
|
|
31
|
+
}
|
|
32
|
+
/** Parse and runtime-validate remote launch options without exposing credentials. */
|
|
33
|
+
export declare function parseRemoteEndpoint(options: RemoteWebDriverOptions): ParsedRemoteEndpoint;
|
|
34
|
+
/**
|
|
35
|
+
* Build W3C capabilities for a remote session. Mirrors
|
|
36
|
+
* `buildLaunchCapabilities()`'s shape but never injects anything local-only
|
|
37
|
+
* (download prefs, `--headless`, binary paths) — remote users pass those
|
|
38
|
+
* through `remote.capabilities` themselves (e.g.
|
|
39
|
+
* `capabilities['goog:chromeOptions']`).
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildRemoteCapabilities(input: {
|
|
42
|
+
browserName: string;
|
|
43
|
+
bidiRequested: boolean;
|
|
44
|
+
userCapabilities?: Record<string, unknown>;
|
|
45
|
+
}): Capabilities;
|
|
46
|
+
/**
|
|
47
|
+
* Strip query string, fragment, and embedded user-info from a URL before
|
|
48
|
+
* it goes into a log line. Some remote providers proxy the BiDi
|
|
49
|
+
* `webSocketUrl` through tokens embedded in the query string or user-info —
|
|
50
|
+
* this must never end up in the Classic-fallback warning. Falls back to a
|
|
51
|
+
* fixed placeholder if the string isn't a parseable URL at all (safer than
|
|
52
|
+
* logging it verbatim).
|
|
53
|
+
*/
|
|
54
|
+
export declare function redactUrlForLog(url: string): string;
|
|
55
|
+
//# sourceMappingURL=remote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../src/lib/remote.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIlE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,4FAA4F;IAC5F,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,4GAA4G;IAC5G,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mHAAmH;IACnH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAcD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,wGAAwG;IACxG,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qFAAqF;AACrF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,sBAAsB,GAAG,oBAAoB,CAwFzF;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C,GAAG,YAAY,CAQf;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWnD"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
import { applyBidiDefaults } from './capabilities.js';
|
|
3
|
+
import { CraftdriverError, ErrorCode } from './errors.js';
|
|
4
|
+
function invalidArgument(message, detail) {
|
|
5
|
+
return new CraftdriverError(ErrorCode.INVALID_ARGUMENT, message, detail ? { detail } : undefined);
|
|
6
|
+
}
|
|
7
|
+
function positiveNumber(value, optionName) {
|
|
8
|
+
if (value === undefined)
|
|
9
|
+
return undefined;
|
|
10
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
|
|
11
|
+
throw invalidArgument(`remote.${optionName} must be a positive number of milliseconds.`);
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
/** Parse and runtime-validate remote launch options without exposing credentials. */
|
|
16
|
+
export function parseRemoteEndpoint(options) {
|
|
17
|
+
if (!options || typeof options !== 'object' || Array.isArray(options)) {
|
|
18
|
+
throw invalidArgument('remote must be an object containing a url.');
|
|
19
|
+
}
|
|
20
|
+
if (typeof options.url !== 'string' || options.url.trim() === '') {
|
|
21
|
+
throw invalidArgument('remote.url must be a non-empty string.');
|
|
22
|
+
}
|
|
23
|
+
let parsed;
|
|
24
|
+
try {
|
|
25
|
+
parsed = new URL(options.url);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// The invalid URL may contain credentials, so do not echo it.
|
|
29
|
+
throw invalidArgument('remote.url is not a valid URL (check the scheme, host, and any embedded credentials).');
|
|
30
|
+
}
|
|
31
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
32
|
+
throw invalidArgument(`remote.url must use http or https (got "${parsed.protocol.replace(/:$/, '')}").`);
|
|
33
|
+
}
|
|
34
|
+
if (parsed.search) {
|
|
35
|
+
throw invalidArgument('remote.url must not include a query string.');
|
|
36
|
+
}
|
|
37
|
+
if (parsed.hash) {
|
|
38
|
+
throw invalidArgument('remote.url must not include a fragment.');
|
|
39
|
+
}
|
|
40
|
+
// Extract URL credentials so downstream URLs remain safe to log.
|
|
41
|
+
const userInfoPresent = parsed.username !== '' || parsed.password !== '';
|
|
42
|
+
if (userInfoPresent && options.auth) {
|
|
43
|
+
throw invalidArgument('remote.url embeds credentials and remote.auth is also set — provide credentials one way, not both.');
|
|
44
|
+
}
|
|
45
|
+
let auth;
|
|
46
|
+
if (userInfoPresent) {
|
|
47
|
+
auth = {
|
|
48
|
+
username: decodeURIComponent(parsed.username),
|
|
49
|
+
password: decodeURIComponent(parsed.password),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
else if (options.auth !== undefined) {
|
|
53
|
+
if (typeof options.auth !== 'object' || options.auth === null || Array.isArray(options.auth)) {
|
|
54
|
+
throw invalidArgument('remote.auth must be an object with username and password.');
|
|
55
|
+
}
|
|
56
|
+
const candidate = options.auth;
|
|
57
|
+
if (typeof candidate.username !== 'string' || typeof candidate.password !== 'string') {
|
|
58
|
+
throw invalidArgument('remote.auth.username and remote.auth.password must be strings.');
|
|
59
|
+
}
|
|
60
|
+
auth = { username: candidate.username, password: candidate.password };
|
|
61
|
+
}
|
|
62
|
+
if (auth && (auth.username === '' || auth.password === '')) {
|
|
63
|
+
throw invalidArgument('remote.auth requires a non-empty username and password.');
|
|
64
|
+
}
|
|
65
|
+
if (options.capabilities !== undefined &&
|
|
66
|
+
(typeof options.capabilities !== 'object' ||
|
|
67
|
+
options.capabilities === null ||
|
|
68
|
+
Array.isArray(options.capabilities))) {
|
|
69
|
+
throw invalidArgument('remote.capabilities must be an object.');
|
|
70
|
+
}
|
|
71
|
+
const sessionTimeoutMs = positiveNumber(options.sessionTimeoutMs, 'sessionTimeoutMs');
|
|
72
|
+
const commandTimeoutMs = positiveNumber(options.commandTimeoutMs, 'commandTimeoutMs');
|
|
73
|
+
const port = parsed.port ? Number(parsed.port) : parsed.protocol === 'https:' ? 443 : 80;
|
|
74
|
+
const rawPath = parsed.pathname === '/' ? '' : parsed.pathname.replace(/\/$/, '');
|
|
75
|
+
return {
|
|
76
|
+
endpoint: {
|
|
77
|
+
protocol: parsed.protocol === 'https:' ? 'https' : 'http',
|
|
78
|
+
hostname: parsed.hostname,
|
|
79
|
+
port,
|
|
80
|
+
path: rawPath,
|
|
81
|
+
auth,
|
|
82
|
+
// Unique per session so quitting one never tears down another's
|
|
83
|
+
// keep-alive sockets — concurrent sessions often share one hub host:port.
|
|
84
|
+
poolKey: randomUUID(),
|
|
85
|
+
commandTimeoutMs,
|
|
86
|
+
},
|
|
87
|
+
sessionTimeoutMs,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Build W3C capabilities for a remote session. Mirrors
|
|
92
|
+
* `buildLaunchCapabilities()`'s shape but never injects anything local-only
|
|
93
|
+
* (download prefs, `--headless`, binary paths) — remote users pass those
|
|
94
|
+
* through `remote.capabilities` themselves (e.g.
|
|
95
|
+
* `capabilities['goog:chromeOptions']`).
|
|
96
|
+
*/
|
|
97
|
+
export function buildRemoteCapabilities(input) {
|
|
98
|
+
const caps = { ...(input.userCapabilities ?? {}) };
|
|
99
|
+
if (caps.browserName === undefined) {
|
|
100
|
+
caps.browserName = input.browserName;
|
|
101
|
+
}
|
|
102
|
+
// Strict remote hubs require the Classic string prompt behavior.
|
|
103
|
+
applyBidiDefaults(caps, input.bidiRequested, 'string');
|
|
104
|
+
return caps;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Strip query string, fragment, and embedded user-info from a URL before
|
|
108
|
+
* it goes into a log line. Some remote providers proxy the BiDi
|
|
109
|
+
* `webSocketUrl` through tokens embedded in the query string or user-info —
|
|
110
|
+
* this must never end up in the Classic-fallback warning. Falls back to a
|
|
111
|
+
* fixed placeholder if the string isn't a parseable URL at all (safer than
|
|
112
|
+
* logging it verbatim).
|
|
113
|
+
*/
|
|
114
|
+
export function redactUrlForLog(url) {
|
|
115
|
+
try {
|
|
116
|
+
const parsed = new URL(url);
|
|
117
|
+
parsed.username = '';
|
|
118
|
+
parsed.password = '';
|
|
119
|
+
parsed.search = '';
|
|
120
|
+
parsed.hash = '';
|
|
121
|
+
return parsed.toString();
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return '<unparseable-url-redacted>';
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/lib/remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA6B1D,SAAS,eAAe,CAAC,OAAe,EAAE,MAAgC;IACxE,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,gBAAgB,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,UAAkB;IACxD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,eAAe,CAAC,UAAU,UAAU,6CAA6C,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAQD,qFAAqF;AACrF,MAAM,UAAU,mBAAmB,CAAC,OAA+B;IACjE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACtE,MAAM,eAAe,CAAC,4CAA4C,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjE,MAAM,eAAe,CAAC,wCAAwC,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,8DAA8D;QAC9D,MAAM,eAAe,CACnB,uFAAuF,CACxF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChE,MAAM,eAAe,CACnB,2CAA2C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAClF,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,eAAe,CAAC,6CAA6C,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,eAAe,CAAC,yCAAyC,CAAC,CAAC;IACnE,CAAC;IAED,iEAAiE;IACjE,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,KAAK,EAAE,CAAC;IACzE,IAAI,eAAe,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,eAAe,CACnB,oGAAoG,CACrG,CAAC;IACJ,CAAC;IAED,IAAI,IAA4B,CAAC;IACjC,IAAI,eAAe,EAAE,CAAC;QACpB,IAAI,GAAG;YACL,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC7C,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;SAC9C,CAAC;IACJ,CAAC;SAAM,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7F,MAAM,eAAe,CAAC,2DAA2D,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,IAA0C,CAAC;QACrE,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACrF,MAAM,eAAe,CAAC,gEAAgE,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC;IACxE,CAAC;IAED,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,EAAE,CAAC,EAAE,CAAC;QAC3D,MAAM,eAAe,CAAC,yDAAyD,CAAC,CAAC;IACnF,CAAC;IAED,IACE,OAAO,CAAC,YAAY,KAAK,SAAS;QAClC,CAAC,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ;YACvC,OAAO,CAAC,YAAY,KAAK,IAAI;YAC7B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EACtC,CAAC;QACD,MAAM,eAAe,CAAC,wCAAwC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IACtF,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAEtF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAElF,OAAO;QACL,QAAQ,EAAE;YACR,QAAQ,EAAE,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;YACzD,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI;YACJ,IAAI,EAAE,OAAO;YACb,IAAI;YACJ,gEAAgE;YAChE,0EAA0E;YAC1E,OAAO,EAAE,UAAU,EAAE;YACrB,gBAAgB;SACjB;QACD,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAIvC;IACC,MAAM,IAAI,GAAiB,EAAE,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,EAAE,CAAC;IACjE,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACvC,CAAC;IACD,iEAAiE;IACjE,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;QACrB,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;QACrB,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,4BAA4B,CAAC;IACtC,CAAC;AACH,CAAC"}
|
package/dist/lib/timing.d.ts
CHANGED
|
@@ -25,6 +25,14 @@ export declare const DEFAULT_POLL_INTERVAL_MS = 25;
|
|
|
25
25
|
export declare const ASSERTION_POLL_INTERVAL_MS = 25;
|
|
26
26
|
/** Poll interval for the driver service's `/status` readiness check. */
|
|
27
27
|
export declare const DRIVER_READINESS_POLL_INTERVAL_MS = 25;
|
|
28
|
+
/**
|
|
29
|
+
* Delay between failed `browser.expectScreenshot()` attempts. Longer than the
|
|
30
|
+
* DOM-oriented poll intervals above because each attempt captures and compares a
|
|
31
|
+
* full PNG (a WebDriver round trip plus a decode), so a tighter cadence would
|
|
32
|
+
* just burn CPU re-screenshotting a page that is still settling. Callers can
|
|
33
|
+
* override per-assertion via `{ interval }` (floor 10 ms).
|
|
34
|
+
*/
|
|
35
|
+
export declare const VISUAL_RETRY_INTERVAL_MS = 50;
|
|
28
36
|
/**
|
|
29
37
|
* Poll interval for state that changes at process/OS speed rather than DOM
|
|
30
38
|
* speed: Classic `document.readyState`, the Classic `waitForPage`
|
package/dist/lib/timing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/lib/timing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,wEAAwE;AACxE,eAAO,MAAM,iCAAiC,KAAK,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAI/C,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,OAAQ,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,QAAS,CAAC;AAEpD,gFAAgF;AAChF,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC,8EAA8E;AAC9E,eAAO,MAAM,2BAA2B,OAAQ,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C,0DAA0D;AAC1D,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAI3C,yEAAyE;AACzE,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,6DAA6D;AAC7D,eAAO,MAAM,uBAAuB,OAAQ,CAAC;AAI7C;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAC9C,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,yBAAyB,KAAK,CAAC"}
|
|
1
|
+
{"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/lib/timing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,wEAAwE;AACxE,eAAO,MAAM,iCAAiC,KAAK,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAI/C,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,OAAQ,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,QAAS,CAAC;AAEpD,gFAAgF;AAChF,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC,8EAA8E;AAC9E,eAAO,MAAM,2BAA2B,OAAQ,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C,0DAA0D;AAC1D,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAI3C,yEAAyE;AACzE,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,6DAA6D;AAC7D,eAAO,MAAM,uBAAuB,OAAQ,CAAC;AAI7C;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAC9C,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,yBAAyB,KAAK,CAAC"}
|
package/dist/lib/timing.js
CHANGED
|
@@ -26,6 +26,14 @@ export const DEFAULT_POLL_INTERVAL_MS = 25;
|
|
|
26
26
|
export const ASSERTION_POLL_INTERVAL_MS = 25;
|
|
27
27
|
/** Poll interval for the driver service's `/status` readiness check. */
|
|
28
28
|
export const DRIVER_READINESS_POLL_INTERVAL_MS = 25;
|
|
29
|
+
/**
|
|
30
|
+
* Delay between failed `browser.expectScreenshot()` attempts. Longer than the
|
|
31
|
+
* DOM-oriented poll intervals above because each attempt captures and compares a
|
|
32
|
+
* full PNG (a WebDriver round trip plus a decode), so a tighter cadence would
|
|
33
|
+
* just burn CPU re-screenshotting a page that is still settling. Callers can
|
|
34
|
+
* override per-assertion via `{ interval }` (floor 10 ms).
|
|
35
|
+
*/
|
|
36
|
+
export const VISUAL_RETRY_INTERVAL_MS = 50;
|
|
29
37
|
/**
|
|
30
38
|
* Poll interval for state that changes at process/OS speed rather than DOM
|
|
31
39
|
* speed: Classic `document.readyState`, the Classic `waitForPage`
|
package/dist/lib/timing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/lib/timing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gFAAgF;AAEhF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAE7C,wEAAwE;AACxE,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C,gFAAgF;AAEhF,iFAAiF;AACjF,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC;AAEpD,gFAAgF;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAEtC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAEnD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C,0DAA0D;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAE3C,gFAAgF;AAEhF,yEAAyE;AACzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAE7C,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAElD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/lib/timing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gFAAgF;AAEhF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAE7C,wEAAwE;AACxE,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C,gFAAgF;AAEhF,iFAAiF;AACjF,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC;AAEpD,gFAAgF;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAEtC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAEnD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C,0DAA0D;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAE3C,gFAAgF;AAEhF,yEAAyE;AACzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAE7C,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAElD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC"}
|
package/dist/lib/tracing.d.ts
CHANGED
|
@@ -113,7 +113,7 @@ export declare class Tracer {
|
|
|
113
113
|
private actionIndex;
|
|
114
114
|
/** Tracks in-flight screenshot captures so `stop()` can drain them. */
|
|
115
115
|
private pendingCaptures;
|
|
116
|
-
constructor(browser: Browser, conn: BiDiConnection, browserName:
|
|
116
|
+
constructor(browser: Browser, conn: BiDiConnection, browserName: string);
|
|
117
117
|
get isRunning(): boolean;
|
|
118
118
|
start(opts: TraceStartOptions): Promise<void>;
|
|
119
119
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/lib/tracing.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/lib/tracing.ts"],"names":[],"mappings":"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"}
|