webdriver 9.10.1 → 9.12.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.
- package/build/bidi/core.d.ts +3 -3
- package/build/bidi/core.d.ts.map +1 -1
- package/build/browser.d.ts.map +1 -1
- package/build/command.d.ts.map +1 -1
- package/build/environment.d.ts +2 -0
- package/build/environment.d.ts.map +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +158 -40
- package/build/node/bidi.d.ts +15 -0
- package/build/node/bidi.d.ts.map +1 -0
- package/build/node.d.ts.map +1 -1
- package/build/node.js +221 -38
- package/build/request/polyfill.d.ts +2 -0
- package/build/request/polyfill.d.ts.map +1 -0
- package/build/request/request.d.ts +3 -1
- package/build/request/request.d.ts.map +1 -1
- package/build/types.d.ts +17 -13
- package/build/types.d.ts.map +1 -1
- package/build/utils.d.ts +1 -1
- package/build/utils.d.ts.map +1 -1
- package/package.json +4 -4
package/build/bidi/core.d.ts
CHANGED
|
@@ -16,15 +16,15 @@ export declare class BidiCore {
|
|
|
16
16
|
* to the Bidi instance afterwards.
|
|
17
17
|
*/
|
|
18
18
|
attachClient(client: Client): void;
|
|
19
|
-
connect(): Promise<boolean
|
|
19
|
+
connect(): Promise<boolean>;
|
|
20
20
|
close(): void;
|
|
21
|
-
reconnect(webSocketUrl: string, opts?: ClientOptions): Promise<boolean
|
|
21
|
+
reconnect(webSocketUrl: string, opts?: ClientOptions): Promise<boolean>;
|
|
22
22
|
/**
|
|
23
23
|
* Helper function that allows to wait until Bidi connection establishes
|
|
24
24
|
* @returns a promise that resolves once the connection to WebDriver Bidi protocol was established
|
|
25
25
|
*/
|
|
26
26
|
waitForConnected(): Promise<boolean>;
|
|
27
|
-
get socket(): WebSocket;
|
|
27
|
+
get socket(): WebSocket | undefined;
|
|
28
28
|
get isConnected(): boolean;
|
|
29
29
|
/**
|
|
30
30
|
* for testing purposes only
|
package/build/bidi/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/bidi/core.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAI3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,iBAAiB,CAAA;AAErE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/bidi/core.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAI3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,iBAAiB,CAAA;AAErE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AASzC,qBAAa,QAAQ;;IASjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B;;OAEG;IACH,OAAO,CAAC,YAAY,CAAQ;gBAEf,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa;IASvD;;;;OAIG;IACI,YAAY,CAAE,MAAM,EAAE,MAAM;IAItB,OAAO;IAiBb,KAAK;IAeL,SAAS,CAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa;IAQ5D;;;OAGG;IACH,gBAAgB;IAIhB,IAAI,MAAM,0BAET;IAED,IAAI,WAAW,YAEd;IAED;;;OAGG;IACH,IAAI,gBAAgB,WAIG,OAAO,UAF7B;IAqCY,IAAI,CAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IA+BtE,SAAS,CAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;CAWpD;AAED,wBAAgB,gBAAgB,CAAE,MAAM,EAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAwCjE"}
|
package/build/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,MAAM,YAAY,CAAA;AAIlC,eAAe,SAAS,CAAA;AACxB,cAAc,YAAY,CAAA"}
|
package/build/command.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAI7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAgB,aAAa,
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAI7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAgB,aAAa,EAAwB,MAAM,YAAY,CAAA;AAM/F,MAAM,CAAC,OAAO,WACV,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,eAAe,EAC5B,qBAAqB,UAAQ,UAIgB,UAAU,WAAW,OAAO,EAAE,KAAG,OAAO,CAAC,iBAAiB,GAAG,aAAa,GAAG,IAAI,CAAC,CAkMlI"}
|
package/build/environment.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type WebSocket from 'ws';
|
|
1
2
|
import type { BrowserSocket } from './bidi/socket.js';
|
|
2
3
|
import type { FetchRequest } from './request/web.js';
|
|
3
4
|
/**
|
|
@@ -11,6 +12,7 @@ export interface EnvironmentVariables {
|
|
|
11
12
|
export interface EnvironmentDependencies {
|
|
12
13
|
Request: typeof FetchRequest;
|
|
13
14
|
Socket: typeof BrowserSocket;
|
|
15
|
+
createBidiConnection: (wsUrl?: string, options?: unknown) => Promise<WebSocket | undefined>;
|
|
14
16
|
variables: EnvironmentVariables;
|
|
15
17
|
}
|
|
16
18
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,MAAM,SAAwD,CAAA;AAE3E,MAAM,WAAW,oBAAoB;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,OAAO,YAAY,CAAC;IAC7B,MAAM,EAAE,OAAO,aAAa,CAAC;IAC7B,SAAS,EAAE,oBAAoB,CAAA;CAClC;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE;IACtB,KAAK,EAAE,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,IAAI,CAAA;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,MAAM,SAAwD,CAAA;AAE3E,MAAM,WAAW,oBAAoB;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,OAAO,YAAY,CAAC;IAC7B,MAAM,EAAE,OAAO,aAAa,CAAC;IAC7B,oBAAoB,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAC5F,SAAS,EAAE,oBAAoB,CAAA;CAClC;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE;IACtB,KAAK,EAAE,uBAAuB,CAAC;CAgBlC,CAAA"}
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,aAAa,CAAA;AAExD,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAyB,YAAY,EAAE,kBAAkB,EAAsB,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACxI,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAA;AAIrE,MAAM,CAAC,OAAO,OAAO,SAAS;WACb,UAAU,CACnB,OAAO,EAAE,YAAY,CAAC,YAAY,EAClC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAClC,aAAa,KAAK,EAClB,oBAAoB,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAC/C,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,aAAa,CAAA;AAExD,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAyB,YAAY,EAAE,kBAAkB,EAAsB,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACxI,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAA;AAIrE,MAAM,CAAC,OAAO,OAAO,SAAS;WACb,UAAU,CACnB,OAAO,EAAE,YAAY,CAAC,YAAY,EAClC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAClC,aAAa,KAAK,EAClB,oBAAoB,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAC/C,OAAO,CAAC,MAAM,CAAC;IA4ElB;;OAEG;IACH,MAAM,CAAC,eAAe,CAClB,OAAO,CAAC,EAAE,aAAa,EACvB,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAClC,aAAa,KAAK,EAClB,cAAc,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GACzC,MAAM;IAmDT;;;;;;OAMG;WACU,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,YAAY,CAAC,EAAE,WAAW,CAAA;KAAE,EAAE,eAAe,CAAC,EAAE,WAAW,CAAC,YAAY;IA2DxH,MAAM,KAAK,SAAS,qBAEnB;CACJ;AAED;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAA;AACzG,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAA"}
|
package/build/index.js
CHANGED
|
@@ -18,6 +18,9 @@ var __privateWrapper = (obj, member, setter, getter) => ({
|
|
|
18
18
|
}
|
|
19
19
|
});
|
|
20
20
|
|
|
21
|
+
// src/browser.ts
|
|
22
|
+
import logger6 from "@wdio/logger";
|
|
23
|
+
|
|
21
24
|
// src/index.ts
|
|
22
25
|
import logger4 from "@wdio/logger";
|
|
23
26
|
import { webdriverMonad, sessionEnvironmentDetector, startWebDriver, isBidi } from "@wdio/utils";
|
|
@@ -38,6 +41,9 @@ var environment = {
|
|
|
38
41
|
get Socket() {
|
|
39
42
|
throw new Error("Socket is not available in this environment");
|
|
40
43
|
},
|
|
44
|
+
get createBidiConnection() {
|
|
45
|
+
throw new Error("createBidiConnection is not available in this environment");
|
|
46
|
+
},
|
|
41
47
|
get variables() {
|
|
42
48
|
return {};
|
|
43
49
|
}
|
|
@@ -47,6 +53,7 @@ var environment = {
|
|
|
47
53
|
// src/command.ts
|
|
48
54
|
var log = logger("webdriver");
|
|
49
55
|
var BIDI_COMMANDS = Object.values(WebDriverBidiProtocol).map((def) => def.socket.command);
|
|
56
|
+
var sessionAbortListeners = /* @__PURE__ */ new Map();
|
|
50
57
|
function command_default(method, endpointUri, commandInfo, doubleEncodeVariables = false) {
|
|
51
58
|
const { command, deprecated, ref, parameters, variables = [], isHubCommand = false } = commandInfo;
|
|
52
59
|
return async function protocolCommand(...args) {
|
|
@@ -103,7 +110,12 @@ function command_default(method, endpointUri, commandInfo, doubleEncodeVariables
|
|
|
103
110
|
}
|
|
104
111
|
body[commandParams[i].name] = arg;
|
|
105
112
|
}
|
|
106
|
-
const
|
|
113
|
+
const { isAborted, abortSignal, cleanup } = manageSessionAbortions.call(this);
|
|
114
|
+
const requiresSession = endpointUri.includes("/:sessionId/");
|
|
115
|
+
if (isAborted && command !== "deleteSession" && requiresSession) {
|
|
116
|
+
throw new Error('Trying to run command "'.concat(commandCallStructure(command, args), '" after session has been deleted, aborting request without executing it'));
|
|
117
|
+
}
|
|
118
|
+
const request = new environment.value.Request(method, endpoint, body, abortSignal, isHubCommand, {
|
|
107
119
|
onPerformance: (data) => this.emit("request.performance", data),
|
|
108
120
|
onRequest: (data) => this.emit("request.start", data),
|
|
109
121
|
onResponse: (data) => this.emit("request.end", data),
|
|
@@ -153,9 +165,46 @@ function command_default(method, endpointUri, commandInfo, doubleEncodeVariables
|
|
|
153
165
|
}).catch((error) => {
|
|
154
166
|
this.emit("result", { command, method, endpoint, body, result: { error } });
|
|
155
167
|
throw error;
|
|
168
|
+
}).finally(() => {
|
|
169
|
+
cleanup();
|
|
156
170
|
});
|
|
157
171
|
};
|
|
158
172
|
}
|
|
173
|
+
function manageSessionAbortions() {
|
|
174
|
+
const abort = new AbortController();
|
|
175
|
+
const abortOnSessionEnd = (result) => {
|
|
176
|
+
if (result.command !== "deleteSession") {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const abortListeners = sessionAbortListeners.get(this.sessionId);
|
|
180
|
+
if (abortListeners) {
|
|
181
|
+
for (const abortListener of abortListeners) {
|
|
182
|
+
abortListener.abort();
|
|
183
|
+
}
|
|
184
|
+
abortListeners.clear();
|
|
185
|
+
sessionAbortListeners.set(this.sessionId, null);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
let abortListenerForCurrentSession = sessionAbortListeners.get(this.sessionId);
|
|
189
|
+
if (typeof abortListenerForCurrentSession === "undefined") {
|
|
190
|
+
abortListenerForCurrentSession = /* @__PURE__ */ new Set();
|
|
191
|
+
sessionAbortListeners.set(this.sessionId, abortListenerForCurrentSession);
|
|
192
|
+
this.on("result", abortOnSessionEnd);
|
|
193
|
+
}
|
|
194
|
+
if (abortListenerForCurrentSession === null) {
|
|
195
|
+
return { isAborted: true, abortSignal: void 0, cleanup: () => {
|
|
196
|
+
} };
|
|
197
|
+
}
|
|
198
|
+
abortListenerForCurrentSession.add(abort);
|
|
199
|
+
return {
|
|
200
|
+
isAborted: false,
|
|
201
|
+
abortSignal: abort.signal,
|
|
202
|
+
cleanup: () => {
|
|
203
|
+
this.off("result", abortOnSessionEnd);
|
|
204
|
+
abortListenerForCurrentSession == null ? void 0 : abortListenerForCurrentSession.delete(abort);
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
}
|
|
159
208
|
|
|
160
209
|
// src/constants.ts
|
|
161
210
|
var DEFAULTS = {
|
|
@@ -319,16 +368,19 @@ import { CAPABILITY_KEYS } from "@wdio/protocols";
|
|
|
319
368
|
import logger2 from "@wdio/logger";
|
|
320
369
|
var SCRIPT_PREFIX = "/* __wdio script__ */";
|
|
321
370
|
var SCRIPT_SUFFIX = "/* __wdio script end__ */";
|
|
371
|
+
var base64Regex = /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/;
|
|
322
372
|
var log2 = logger2("webdriver");
|
|
323
373
|
var RESPONSE_TIMEOUT = 1e3 * 60;
|
|
324
|
-
var _id, _ws, _waitForConnected, _webSocketUrl, _pendingCommands, _BidiCore_instances, handleResponse_fn;
|
|
374
|
+
var _id, _ws, _waitForConnected, _resolveWaitForConnected, _webSocketUrl, _clientOptions, _pendingCommands, _BidiCore_instances, handleResponse_fn;
|
|
325
375
|
var BidiCore = class {
|
|
326
376
|
constructor(webSocketUrl, opts) {
|
|
327
377
|
__privateAdd(this, _BidiCore_instances);
|
|
328
378
|
__privateAdd(this, _id, 0);
|
|
329
379
|
__privateAdd(this, _ws);
|
|
330
|
-
__privateAdd(this, _waitForConnected
|
|
380
|
+
__privateAdd(this, _waitForConnected);
|
|
381
|
+
__privateAdd(this, _resolveWaitForConnected);
|
|
331
382
|
__privateAdd(this, _webSocketUrl);
|
|
383
|
+
__privateAdd(this, _clientOptions);
|
|
332
384
|
__privateAdd(this, _pendingCommands, /* @__PURE__ */ new Map());
|
|
333
385
|
__publicField(this, "client");
|
|
334
386
|
/**
|
|
@@ -336,9 +388,12 @@ var BidiCore = class {
|
|
|
336
388
|
*/
|
|
337
389
|
__publicField(this, "_isConnected", false);
|
|
338
390
|
__privateSet(this, _webSocketUrl, webSocketUrl);
|
|
339
|
-
|
|
340
|
-
__privateSet(this,
|
|
341
|
-
|
|
391
|
+
__privateSet(this, _clientOptions, opts);
|
|
392
|
+
__privateSet(this, _resolveWaitForConnected, () => {
|
|
393
|
+
});
|
|
394
|
+
__privateSet(this, _waitForConnected, new Promise((resolve) => {
|
|
395
|
+
__privateSet(this, _resolveWaitForConnected, resolve);
|
|
396
|
+
}));
|
|
342
397
|
}
|
|
343
398
|
/**
|
|
344
399
|
* We initiate the Bidi instance before a WebdriverIO instance is created.
|
|
@@ -349,23 +404,14 @@ var BidiCore = class {
|
|
|
349
404
|
this.client = client;
|
|
350
405
|
}
|
|
351
406
|
async connect() {
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
407
|
+
log2.info("Connecting to webSocketUrl ".concat(__privateGet(this, _webSocketUrl)));
|
|
408
|
+
__privateSet(this, _ws, await environment.value.createBidiConnection(__privateGet(this, _webSocketUrl), __privateGet(this, _clientOptions)));
|
|
409
|
+
this._isConnected = Boolean(__privateGet(this, _ws));
|
|
410
|
+
__privateGet(this, _resolveWaitForConnected).call(this, this._isConnected);
|
|
411
|
+
if (__privateGet(this, _ws)) {
|
|
412
|
+
__privateGet(this, _ws).on("message", __privateMethod(this, _BidiCore_instances, handleResponse_fn).bind(this));
|
|
355
413
|
}
|
|
356
|
-
|
|
357
|
-
__privateGet(this, _ws).on("open", () => {
|
|
358
|
-
log2.info("Connected session to Bidi protocol");
|
|
359
|
-
this._isConnected = true;
|
|
360
|
-
resolve(this._isConnected);
|
|
361
|
-
});
|
|
362
|
-
__privateGet(this, _ws).on("error", (err) => {
|
|
363
|
-
log2.warn("Couldn't connect to Bidi protocol: ".concat(err.message));
|
|
364
|
-
this._isConnected = false;
|
|
365
|
-
resolve(this._isConnected);
|
|
366
|
-
});
|
|
367
|
-
}));
|
|
368
|
-
return __privateGet(this, _waitForConnected);
|
|
414
|
+
return this._isConnected;
|
|
369
415
|
}
|
|
370
416
|
close() {
|
|
371
417
|
if (!this._isConnected) {
|
|
@@ -373,16 +419,18 @@ var BidiCore = class {
|
|
|
373
419
|
}
|
|
374
420
|
log2.info("Close Bidi connection to ".concat(__privateGet(this, _webSocketUrl)));
|
|
375
421
|
this._isConnected = false;
|
|
376
|
-
__privateGet(this, _ws)
|
|
377
|
-
|
|
378
|
-
|
|
422
|
+
if (__privateGet(this, _ws)) {
|
|
423
|
+
__privateGet(this, _ws).off("message", __privateMethod(this, _BidiCore_instances, handleResponse_fn).bind(this));
|
|
424
|
+
__privateGet(this, _ws).close();
|
|
425
|
+
__privateGet(this, _ws).terminate();
|
|
426
|
+
__privateSet(this, _ws, void 0);
|
|
427
|
+
}
|
|
379
428
|
}
|
|
380
429
|
reconnect(webSocketUrl, opts) {
|
|
381
430
|
log2.info("Reconnect to new Bidi session at ".concat(webSocketUrl));
|
|
382
431
|
this.close();
|
|
383
432
|
__privateSet(this, _webSocketUrl, webSocketUrl);
|
|
384
|
-
__privateSet(this,
|
|
385
|
-
__privateGet(this, _ws).on("message", __privateMethod(this, _BidiCore_instances, handleResponse_fn).bind(this));
|
|
433
|
+
__privateSet(this, _clientOptions, opts);
|
|
386
434
|
return this.connect();
|
|
387
435
|
}
|
|
388
436
|
/**
|
|
@@ -430,7 +478,7 @@ var BidiCore = class {
|
|
|
430
478
|
}
|
|
431
479
|
sendAsync(params) {
|
|
432
480
|
var _a;
|
|
433
|
-
if (!this._isConnected) {
|
|
481
|
+
if (!__privateGet(this, _ws) || !this._isConnected) {
|
|
434
482
|
throw new Error("No connection to WebDriver Bidi was established");
|
|
435
483
|
}
|
|
436
484
|
log2.info("BIDI COMMAND", ...parseBidiCommand(params));
|
|
@@ -443,7 +491,9 @@ var BidiCore = class {
|
|
|
443
491
|
_id = new WeakMap();
|
|
444
492
|
_ws = new WeakMap();
|
|
445
493
|
_waitForConnected = new WeakMap();
|
|
494
|
+
_resolveWaitForConnected = new WeakMap();
|
|
446
495
|
_webSocketUrl = new WeakMap();
|
|
496
|
+
_clientOptions = new WeakMap();
|
|
447
497
|
_pendingCommands = new WeakMap();
|
|
448
498
|
_BidiCore_instances = new WeakSet();
|
|
449
499
|
handleResponse_fn = function(data) {
|
|
@@ -453,7 +503,14 @@ handleResponse_fn = function(data) {
|
|
|
453
503
|
if (!payload.id) {
|
|
454
504
|
return;
|
|
455
505
|
}
|
|
456
|
-
|
|
506
|
+
let resultLog = data.toString();
|
|
507
|
+
if (typeof payload.result === "object" && payload.result && "data" in payload.result && typeof payload.result.data === "string" && base64Regex.test(payload.result.data)) {
|
|
508
|
+
resultLog = JSON.stringify({
|
|
509
|
+
...payload.result,
|
|
510
|
+
data: "Base64 string [".concat(payload.result.data.length, " chars]")
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
log2.info("BIDI RESULT", resultLog);
|
|
457
514
|
(_a = this.client) == null ? void 0 : _a.emit("bidiResult", payload);
|
|
458
515
|
const resolve = __privateGet(this, _pendingCommands).get(payload.id);
|
|
459
516
|
if (!resolve) {
|
|
@@ -1158,7 +1215,7 @@ function getPrototype({ isW3C, isChromium, isFirefox, isMobile, isSauce, isSelen
|
|
|
1158
1215
|
}
|
|
1159
1216
|
return prototype;
|
|
1160
1217
|
}
|
|
1161
|
-
function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSauce, isSeleniumStandalone, isChromium }) {
|
|
1218
|
+
function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSauce, isSeleniumStandalone, isChromium, isWindowsApp, isMacApp }) {
|
|
1162
1219
|
return {
|
|
1163
1220
|
isW3C: { value: isW3C },
|
|
1164
1221
|
isMobile: { value: isMobile },
|
|
@@ -1178,7 +1235,9 @@ function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSa
|
|
|
1178
1235
|
return Boolean((_a = this._bidiHandler) == null ? void 0 : _a.isConnected);
|
|
1179
1236
|
}
|
|
1180
1237
|
},
|
|
1181
|
-
isChromium: { value: isChromium }
|
|
1238
|
+
isChromium: { value: isChromium },
|
|
1239
|
+
isWindowsApp: { value: isWindowsApp },
|
|
1240
|
+
isMacApp: { value: isMacApp }
|
|
1182
1241
|
};
|
|
1183
1242
|
}
|
|
1184
1243
|
function setupDirectConnect(client) {
|
|
@@ -1287,6 +1346,7 @@ var remoteTypes_exports = {};
|
|
|
1287
1346
|
var log4 = logger4("webdriver");
|
|
1288
1347
|
var WebDriver = class _WebDriver {
|
|
1289
1348
|
static async newSession(options, modifier, userPrototype = {}, customCommandWrapper) {
|
|
1349
|
+
var _a;
|
|
1290
1350
|
const envLogLevel = process.env.WDIO_LOG_LEVEL;
|
|
1291
1351
|
options.logLevel = envLogLevel != null ? envLogLevel : options.logLevel;
|
|
1292
1352
|
const params = validateConfig(DEFAULTS, options);
|
|
@@ -1324,8 +1384,9 @@ var WebDriver = class _WebDriver {
|
|
|
1324
1384
|
);
|
|
1325
1385
|
const client = monad(sessionId, customCommandWrapper);
|
|
1326
1386
|
if (isBidi(capabilities)) {
|
|
1327
|
-
await client._bidiHandler.waitForConnected()
|
|
1328
|
-
|
|
1387
|
+
if (await client._bidiHandler.waitForConnected()) {
|
|
1388
|
+
(_a = client._bidiHandler.socket) == null ? void 0 : _a.on("message", parseBidiMessage.bind(client));
|
|
1389
|
+
}
|
|
1329
1390
|
}
|
|
1330
1391
|
if (params.enableDirectConnect) {
|
|
1331
1392
|
setupDirectConnect(client);
|
|
@@ -1367,7 +1428,10 @@ var WebDriver = class _WebDriver {
|
|
|
1367
1428
|
const monad = webdriverMonad(options, modifier, prototype);
|
|
1368
1429
|
const client = monad(options.sessionId, commandWrapper);
|
|
1369
1430
|
if (isBidi(options.capabilities || {})) {
|
|
1370
|
-
(_b = client._bidiHandler) == null ? void 0 : _b.
|
|
1431
|
+
(_b = client._bidiHandler) == null ? void 0 : _b.waitForConnected().then(() => {
|
|
1432
|
+
var _a2;
|
|
1433
|
+
(_a2 = client._bidiHandler) == null ? void 0 : _a2.socket.on("message", parseBidiMessage.bind(client));
|
|
1434
|
+
});
|
|
1371
1435
|
}
|
|
1372
1436
|
return client;
|
|
1373
1437
|
}
|
|
@@ -1379,7 +1443,7 @@ var WebDriver = class _WebDriver {
|
|
|
1379
1443
|
* @returns {string} the new session id of the browser
|
|
1380
1444
|
*/
|
|
1381
1445
|
static async reloadSession(instance, newCapabilities) {
|
|
1382
|
-
var _a, _b;
|
|
1446
|
+
var _a, _b, _c;
|
|
1383
1447
|
const capabilities = newCapabilities ? newCapabilities : Object.assign({}, instance.requestedCapabilities);
|
|
1384
1448
|
let params = { ...instance.options, capabilities };
|
|
1385
1449
|
for (const prop of ["protocol", "hostname", "port", "path", "queryParams", "user", "key"]) {
|
|
@@ -1414,7 +1478,7 @@ var WebDriver = class _WebDriver {
|
|
|
1414
1478
|
if (isBidi(instance.capabilities || {})) {
|
|
1415
1479
|
const bidiReqOpts = instance.options.strictSSL ? {} : { rejectUnauthorized: false };
|
|
1416
1480
|
await ((_a = instance._bidiHandler) == null ? void 0 : _a.reconnect(newSessionCapabilities.webSocketUrl, bidiReqOpts));
|
|
1417
|
-
(_b = instance._bidiHandler) == null ? void 0 : _b.socket.on("message", parseBidiMessage.bind(instance));
|
|
1481
|
+
(_c = (_b = instance._bidiHandler) == null ? void 0 : _b.socket) == null ? void 0 : _c.on("message", parseBidiMessage.bind(instance));
|
|
1418
1482
|
}
|
|
1419
1483
|
return sessionId;
|
|
1420
1484
|
}
|
|
@@ -1579,7 +1643,7 @@ var WebDriverResponseError = class _WebDriverResponseError extends WebDriverErro
|
|
|
1579
1643
|
// package.json
|
|
1580
1644
|
var package_default = {
|
|
1581
1645
|
name: "webdriver",
|
|
1582
|
-
version: "9.
|
|
1646
|
+
version: "9.11.0",
|
|
1583
1647
|
description: "A Node.js bindings implementation for the W3C WebDriver and Mobile JSONWire Protocol",
|
|
1584
1648
|
author: "Christian Bromann <mail@bromann.dev>",
|
|
1585
1649
|
homepage: "https://github.com/webdriverio/webdriverio/tree/main/packages/webdriver",
|
|
@@ -1628,6 +1692,39 @@ var package_default = {
|
|
|
1628
1692
|
}
|
|
1629
1693
|
};
|
|
1630
1694
|
|
|
1695
|
+
// src/request/polyfill.ts
|
|
1696
|
+
if (!AbortSignal.any) {
|
|
1697
|
+
AbortSignal.any = function(signals) {
|
|
1698
|
+
if (!signals || !Array.isArray(signals)) {
|
|
1699
|
+
throw new TypeError("AbortSignal.any requires an array of AbortSignal objects");
|
|
1700
|
+
}
|
|
1701
|
+
const controller = new AbortController();
|
|
1702
|
+
if (signals.some((signal) => signal.aborted)) {
|
|
1703
|
+
controller.abort();
|
|
1704
|
+
return controller.signal;
|
|
1705
|
+
}
|
|
1706
|
+
const listeners = signals.map((signal) => {
|
|
1707
|
+
const listener = () => {
|
|
1708
|
+
if ("reason" in signal && signal.reason !== void 0) {
|
|
1709
|
+
controller.abort(signal.reason);
|
|
1710
|
+
} else {
|
|
1711
|
+
controller.abort();
|
|
1712
|
+
}
|
|
1713
|
+
cleanup();
|
|
1714
|
+
};
|
|
1715
|
+
signal.addEventListener("abort", listener);
|
|
1716
|
+
return { signal, listener };
|
|
1717
|
+
});
|
|
1718
|
+
const cleanup = () => {
|
|
1719
|
+
listeners.forEach(({ signal, listener }) => {
|
|
1720
|
+
signal.removeEventListener("abort", listener);
|
|
1721
|
+
});
|
|
1722
|
+
};
|
|
1723
|
+
controller.signal.addEventListener("abort", cleanup);
|
|
1724
|
+
return controller.signal;
|
|
1725
|
+
};
|
|
1726
|
+
}
|
|
1727
|
+
|
|
1631
1728
|
// src/request/request.ts
|
|
1632
1729
|
var ERRORS_TO_EXCLUDE_FROM_RETRY = [
|
|
1633
1730
|
"detached shadow root",
|
|
@@ -1641,19 +1738,21 @@ var DEFAULT_HEADERS = {
|
|
|
1641
1738
|
};
|
|
1642
1739
|
var log5 = logger5("webdriver");
|
|
1643
1740
|
var WebDriverRequest = class {
|
|
1644
|
-
constructor(method, endpoint, body, isHubCommand = false, eventHandler = {}) {
|
|
1741
|
+
constructor(method, endpoint, body, abortSignal, isHubCommand = false, eventHandler = {}) {
|
|
1645
1742
|
__publicField(this, "body");
|
|
1646
1743
|
__publicField(this, "method");
|
|
1647
1744
|
__publicField(this, "endpoint");
|
|
1648
1745
|
__publicField(this, "isHubCommand");
|
|
1649
1746
|
__publicField(this, "requiresSessionId");
|
|
1650
1747
|
__publicField(this, "eventHandler");
|
|
1748
|
+
__publicField(this, "abortSignal");
|
|
1651
1749
|
this.body = body;
|
|
1652
1750
|
this.method = method;
|
|
1653
1751
|
this.endpoint = endpoint;
|
|
1654
1752
|
this.isHubCommand = isHubCommand;
|
|
1655
1753
|
this.requiresSessionId = Boolean(this.endpoint.match(/:sessionId/));
|
|
1656
1754
|
this.eventHandler = eventHandler;
|
|
1755
|
+
this.abortSignal = abortSignal;
|
|
1657
1756
|
}
|
|
1658
1757
|
async makeRequest(options, sessionId) {
|
|
1659
1758
|
var _a, _b;
|
|
@@ -1666,7 +1765,10 @@ var WebDriverRequest = class {
|
|
|
1666
1765
|
const requestOptions = {
|
|
1667
1766
|
method: this.method,
|
|
1668
1767
|
redirect: "follow",
|
|
1669
|
-
signal: AbortSignal.
|
|
1768
|
+
signal: AbortSignal.any([
|
|
1769
|
+
AbortSignal.timeout(timeout),
|
|
1770
|
+
...this.abortSignal ? [this.abortSignal] : []
|
|
1771
|
+
])
|
|
1670
1772
|
};
|
|
1671
1773
|
const requestHeaders = new Headers({
|
|
1672
1774
|
...DEFAULT_HEADERS,
|
|
@@ -1754,7 +1856,7 @@ var WebDriverRequest = class {
|
|
|
1754
1856
|
};
|
|
1755
1857
|
if (response instanceof Error) {
|
|
1756
1858
|
const resError = response;
|
|
1757
|
-
if (resError.code && RETRYABLE_ERROR_CODES.includes(resError.code) || resError.statusCode && RETRYABLE_STATUS_CODES.includes(resError.statusCode)) {
|
|
1859
|
+
if (!(this.abortSignal && this.abortSignal.aborted) && (resError.code && RETRYABLE_ERROR_CODES.includes(resError.code) || resError.statusCode && RETRYABLE_STATUS_CODES.includes(resError.statusCode))) {
|
|
1758
1860
|
return retry(resError);
|
|
1759
1861
|
}
|
|
1760
1862
|
(_b = (_a = this.eventHandler).onPerformance) == null ? void 0 : _b.call(_a, { request: fullRequestOptions, durationMillisecond, success: false, error: response, retryCount });
|
|
@@ -1798,9 +1900,25 @@ var FetchRequest = class extends WebDriverRequest {
|
|
|
1798
1900
|
|
|
1799
1901
|
// src/browser.ts
|
|
1800
1902
|
var browser_default = WebDriver;
|
|
1903
|
+
var log6 = logger6("webdriver");
|
|
1801
1904
|
environment.value = {
|
|
1802
1905
|
Request: FetchRequest,
|
|
1803
1906
|
Socket: BrowserSocket,
|
|
1907
|
+
createBidiConnection: (webSocketUrl, options) => {
|
|
1908
|
+
log6.info("Connecting to webSocketUrl ".concat(webSocketUrl));
|
|
1909
|
+
const ws = new BrowserSocket(webSocketUrl, options);
|
|
1910
|
+
return new Promise((resolve) => {
|
|
1911
|
+
ws.on("open", () => {
|
|
1912
|
+
log6.info("Connected session to Bidi protocol");
|
|
1913
|
+
resolve(ws);
|
|
1914
|
+
});
|
|
1915
|
+
ws.on("error", (err) => {
|
|
1916
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1917
|
+
log6.warn("Couldn't connect to Bidi protocol: ".concat(error.message));
|
|
1918
|
+
resolve(void 0);
|
|
1919
|
+
});
|
|
1920
|
+
});
|
|
1921
|
+
},
|
|
1804
1922
|
variables: {}
|
|
1805
1923
|
};
|
|
1806
1924
|
export {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
|
+
export declare function createBidiConnection(webSocketUrl: string, options?: unknown): Promise<WebSocket | undefined>;
|
|
3
|
+
/**
|
|
4
|
+
* Resolve hostnames to IPv4 and IPv6 addresses
|
|
5
|
+
* @returns list of websocket urls to try
|
|
6
|
+
* @see https://github.com/webdriverio/webdriverio/issues/14039
|
|
7
|
+
*/
|
|
8
|
+
export declare function listWebsocketCandidateUrls(webSocketUrl: string): Promise<string[]>;
|
|
9
|
+
/**
|
|
10
|
+
* Connect to a websocket
|
|
11
|
+
* @param candidateUrls - list of websocket urls to try
|
|
12
|
+
* @returns true if the connection was successful
|
|
13
|
+
*/
|
|
14
|
+
export declare function connectWebsocket(candidateUrls: string[], _?: unknown): Promise<WebSocket | undefined>;
|
|
15
|
+
//# sourceMappingURL=bidi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bidi.d.ts","sourceRoot":"","sources":["../../src/node/bidi.ts"],"names":[],"mappings":"AAMA,OAAO,SAAS,MAAM,IAAI,CAAA;AAK1B,wBAAsB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAGlH;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBxF;AAcD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAkD3G"}
|
package/build/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,MAAM,YAAY,CAAA;AAMlC,eAAe,SAAS,CAAA;AACxB,cAAc,YAAY,CAAA"}
|
package/build/node.js
CHANGED
|
@@ -22,6 +22,9 @@ var environment = {
|
|
|
22
22
|
get Socket() {
|
|
23
23
|
throw new Error("Socket is not available in this environment");
|
|
24
24
|
},
|
|
25
|
+
get createBidiConnection() {
|
|
26
|
+
throw new Error("createBidiConnection is not available in this environment");
|
|
27
|
+
},
|
|
25
28
|
get variables() {
|
|
26
29
|
return {};
|
|
27
30
|
}
|
|
@@ -31,6 +34,7 @@ var environment = {
|
|
|
31
34
|
// src/command.ts
|
|
32
35
|
var log = logger("webdriver");
|
|
33
36
|
var BIDI_COMMANDS = Object.values(WebDriverBidiProtocol).map((def) => def.socket.command);
|
|
37
|
+
var sessionAbortListeners = /* @__PURE__ */ new Map();
|
|
34
38
|
function command_default(method, endpointUri, commandInfo, doubleEncodeVariables = false) {
|
|
35
39
|
const { command, deprecated, ref, parameters, variables = [], isHubCommand = false } = commandInfo;
|
|
36
40
|
return async function protocolCommand(...args) {
|
|
@@ -96,7 +100,12 @@ Actual: ${actual}` + moreInfo
|
|
|
96
100
|
}
|
|
97
101
|
body[commandParams[i].name] = arg;
|
|
98
102
|
}
|
|
99
|
-
const
|
|
103
|
+
const { isAborted, abortSignal, cleanup } = manageSessionAbortions.call(this);
|
|
104
|
+
const requiresSession = endpointUri.includes("/:sessionId/");
|
|
105
|
+
if (isAborted && command !== "deleteSession" && requiresSession) {
|
|
106
|
+
throw new Error(`Trying to run command "${commandCallStructure(command, args)}" after session has been deleted, aborting request without executing it`);
|
|
107
|
+
}
|
|
108
|
+
const request = new environment.value.Request(method, endpoint, body, abortSignal, isHubCommand, {
|
|
100
109
|
onPerformance: (data) => this.emit("request.performance", data),
|
|
101
110
|
onRequest: (data) => this.emit("request.start", data),
|
|
102
111
|
onResponse: (data) => this.emit("request.end", data),
|
|
@@ -145,9 +154,46 @@ Actual: ${actual}` + moreInfo
|
|
|
145
154
|
}).catch((error) => {
|
|
146
155
|
this.emit("result", { command, method, endpoint, body, result: { error } });
|
|
147
156
|
throw error;
|
|
157
|
+
}).finally(() => {
|
|
158
|
+
cleanup();
|
|
148
159
|
});
|
|
149
160
|
};
|
|
150
161
|
}
|
|
162
|
+
function manageSessionAbortions() {
|
|
163
|
+
const abort = new AbortController();
|
|
164
|
+
const abortOnSessionEnd = (result) => {
|
|
165
|
+
if (result.command !== "deleteSession") {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const abortListeners = sessionAbortListeners.get(this.sessionId);
|
|
169
|
+
if (abortListeners) {
|
|
170
|
+
for (const abortListener of abortListeners) {
|
|
171
|
+
abortListener.abort();
|
|
172
|
+
}
|
|
173
|
+
abortListeners.clear();
|
|
174
|
+
sessionAbortListeners.set(this.sessionId, null);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
let abortListenerForCurrentSession = sessionAbortListeners.get(this.sessionId);
|
|
178
|
+
if (typeof abortListenerForCurrentSession === "undefined") {
|
|
179
|
+
abortListenerForCurrentSession = /* @__PURE__ */ new Set();
|
|
180
|
+
sessionAbortListeners.set(this.sessionId, abortListenerForCurrentSession);
|
|
181
|
+
this.on("result", abortOnSessionEnd);
|
|
182
|
+
}
|
|
183
|
+
if (abortListenerForCurrentSession === null) {
|
|
184
|
+
return { isAborted: true, abortSignal: void 0, cleanup: () => {
|
|
185
|
+
} };
|
|
186
|
+
}
|
|
187
|
+
abortListenerForCurrentSession.add(abort);
|
|
188
|
+
return {
|
|
189
|
+
isAborted: false,
|
|
190
|
+
abortSignal: abort.signal,
|
|
191
|
+
cleanup: () => {
|
|
192
|
+
this.off("result", abortOnSessionEnd);
|
|
193
|
+
abortListenerForCurrentSession?.delete(abort);
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
}
|
|
151
197
|
|
|
152
198
|
// src/constants.ts
|
|
153
199
|
var DEFAULTS = {
|
|
@@ -311,13 +357,16 @@ import { CAPABILITY_KEYS } from "@wdio/protocols";
|
|
|
311
357
|
import logger2 from "@wdio/logger";
|
|
312
358
|
var SCRIPT_PREFIX = "/* __wdio script__ */";
|
|
313
359
|
var SCRIPT_SUFFIX = "/* __wdio script end__ */";
|
|
360
|
+
var base64Regex = /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/;
|
|
314
361
|
var log2 = logger2("webdriver");
|
|
315
362
|
var RESPONSE_TIMEOUT = 1e3 * 60;
|
|
316
363
|
var BidiCore = class {
|
|
317
364
|
#id = 0;
|
|
318
365
|
#ws;
|
|
319
|
-
#waitForConnected
|
|
366
|
+
#waitForConnected;
|
|
367
|
+
#resolveWaitForConnected;
|
|
320
368
|
#webSocketUrl;
|
|
369
|
+
#clientOptions;
|
|
321
370
|
#pendingCommands = /* @__PURE__ */ new Map();
|
|
322
371
|
client;
|
|
323
372
|
/**
|
|
@@ -326,9 +375,12 @@ var BidiCore = class {
|
|
|
326
375
|
_isConnected = false;
|
|
327
376
|
constructor(webSocketUrl, opts) {
|
|
328
377
|
this.#webSocketUrl = webSocketUrl;
|
|
329
|
-
|
|
330
|
-
this.#
|
|
331
|
-
|
|
378
|
+
this.#clientOptions = opts;
|
|
379
|
+
this.#resolveWaitForConnected = () => {
|
|
380
|
+
};
|
|
381
|
+
this.#waitForConnected = new Promise((resolve) => {
|
|
382
|
+
this.#resolveWaitForConnected = resolve;
|
|
383
|
+
});
|
|
332
384
|
}
|
|
333
385
|
/**
|
|
334
386
|
* We initiate the Bidi instance before a WebdriverIO instance is created.
|
|
@@ -339,23 +391,14 @@ var BidiCore = class {
|
|
|
339
391
|
this.client = client;
|
|
340
392
|
}
|
|
341
393
|
async connect() {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
394
|
+
log2.info(`Connecting to webSocketUrl ${this.#webSocketUrl}`);
|
|
395
|
+
this.#ws = await environment.value.createBidiConnection(this.#webSocketUrl, this.#clientOptions);
|
|
396
|
+
this._isConnected = Boolean(this.#ws);
|
|
397
|
+
this.#resolveWaitForConnected(this._isConnected);
|
|
398
|
+
if (this.#ws) {
|
|
399
|
+
this.#ws.on("message", this.#handleResponse.bind(this));
|
|
345
400
|
}
|
|
346
|
-
this
|
|
347
|
-
this.#ws.on("open", () => {
|
|
348
|
-
log2.info("Connected session to Bidi protocol");
|
|
349
|
-
this._isConnected = true;
|
|
350
|
-
resolve(this._isConnected);
|
|
351
|
-
});
|
|
352
|
-
this.#ws.on("error", (err) => {
|
|
353
|
-
log2.warn(`Couldn't connect to Bidi protocol: ${err.message}`);
|
|
354
|
-
this._isConnected = false;
|
|
355
|
-
resolve(this._isConnected);
|
|
356
|
-
});
|
|
357
|
-
});
|
|
358
|
-
return this.#waitForConnected;
|
|
401
|
+
return this._isConnected;
|
|
359
402
|
}
|
|
360
403
|
close() {
|
|
361
404
|
if (!this._isConnected) {
|
|
@@ -363,16 +406,18 @@ var BidiCore = class {
|
|
|
363
406
|
}
|
|
364
407
|
log2.info(`Close Bidi connection to ${this.#webSocketUrl}`);
|
|
365
408
|
this._isConnected = false;
|
|
366
|
-
this.#ws
|
|
367
|
-
|
|
368
|
-
|
|
409
|
+
if (this.#ws) {
|
|
410
|
+
this.#ws.off("message", this.#handleResponse.bind(this));
|
|
411
|
+
this.#ws.close();
|
|
412
|
+
this.#ws.terminate();
|
|
413
|
+
this.#ws = void 0;
|
|
414
|
+
}
|
|
369
415
|
}
|
|
370
416
|
reconnect(webSocketUrl, opts) {
|
|
371
417
|
log2.info(`Reconnect to new Bidi session at ${webSocketUrl}`);
|
|
372
418
|
this.close();
|
|
373
419
|
this.#webSocketUrl = webSocketUrl;
|
|
374
|
-
this.#
|
|
375
|
-
this.#ws.on("message", this.#handleResponse.bind(this));
|
|
420
|
+
this.#clientOptions = opts;
|
|
376
421
|
return this.connect();
|
|
377
422
|
}
|
|
378
423
|
/**
|
|
@@ -401,7 +446,14 @@ var BidiCore = class {
|
|
|
401
446
|
if (!payload.id) {
|
|
402
447
|
return;
|
|
403
448
|
}
|
|
404
|
-
|
|
449
|
+
let resultLog = data.toString();
|
|
450
|
+
if (typeof payload.result === "object" && payload.result && "data" in payload.result && typeof payload.result.data === "string" && base64Regex.test(payload.result.data)) {
|
|
451
|
+
resultLog = JSON.stringify({
|
|
452
|
+
...payload.result,
|
|
453
|
+
data: `Base64 string [${payload.result.data.length} chars]`
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
log2.info("BIDI RESULT", resultLog);
|
|
405
457
|
this.client?.emit("bidiResult", payload);
|
|
406
458
|
const resolve = this.#pendingCommands.get(payload.id);
|
|
407
459
|
if (!resolve) {
|
|
@@ -442,7 +494,7 @@ ${driverStack}`;
|
|
|
442
494
|
return payload;
|
|
443
495
|
}
|
|
444
496
|
sendAsync(params) {
|
|
445
|
-
if (!this._isConnected) {
|
|
497
|
+
if (!this.#ws || !this._isConnected) {
|
|
446
498
|
throw new Error("No connection to WebDriver Bidi was established");
|
|
447
499
|
}
|
|
448
500
|
log2.info("BIDI COMMAND", ...parseBidiCommand(params));
|
|
@@ -1142,7 +1194,7 @@ function getPrototype({ isW3C, isChromium, isFirefox, isMobile, isSauce, isSelen
|
|
|
1142
1194
|
}
|
|
1143
1195
|
return prototype;
|
|
1144
1196
|
}
|
|
1145
|
-
function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSauce, isSeleniumStandalone, isChromium }) {
|
|
1197
|
+
function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSauce, isSeleniumStandalone, isChromium, isWindowsApp, isMacApp }) {
|
|
1146
1198
|
return {
|
|
1147
1199
|
isW3C: { value: isW3C },
|
|
1148
1200
|
isMobile: { value: isMobile },
|
|
@@ -1161,7 +1213,9 @@ function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSa
|
|
|
1161
1213
|
return Boolean(this._bidiHandler?.isConnected);
|
|
1162
1214
|
}
|
|
1163
1215
|
},
|
|
1164
|
-
isChromium: { value: isChromium }
|
|
1216
|
+
isChromium: { value: isChromium },
|
|
1217
|
+
isWindowsApp: { value: isWindowsApp },
|
|
1218
|
+
isMacApp: { value: isMacApp }
|
|
1165
1219
|
};
|
|
1166
1220
|
}
|
|
1167
1221
|
function setupDirectConnect(client) {
|
|
@@ -1307,8 +1361,9 @@ var WebDriver = class _WebDriver {
|
|
|
1307
1361
|
);
|
|
1308
1362
|
const client = monad(sessionId, customCommandWrapper);
|
|
1309
1363
|
if (isBidi(capabilities)) {
|
|
1310
|
-
await client._bidiHandler.waitForConnected()
|
|
1311
|
-
|
|
1364
|
+
if (await client._bidiHandler.waitForConnected()) {
|
|
1365
|
+
client._bidiHandler.socket?.on("message", parseBidiMessage.bind(client));
|
|
1366
|
+
}
|
|
1312
1367
|
}
|
|
1313
1368
|
if (params.enableDirectConnect) {
|
|
1314
1369
|
setupDirectConnect(client);
|
|
@@ -1349,7 +1404,9 @@ var WebDriver = class _WebDriver {
|
|
|
1349
1404
|
const monad = webdriverMonad(options, modifier, prototype);
|
|
1350
1405
|
const client = monad(options.sessionId, commandWrapper);
|
|
1351
1406
|
if (isBidi(options.capabilities || {})) {
|
|
1352
|
-
client._bidiHandler?.
|
|
1407
|
+
client._bidiHandler?.waitForConnected().then(() => {
|
|
1408
|
+
client._bidiHandler?.socket.on("message", parseBidiMessage.bind(client));
|
|
1409
|
+
});
|
|
1353
1410
|
}
|
|
1354
1411
|
return client;
|
|
1355
1412
|
}
|
|
@@ -1395,7 +1452,7 @@ var WebDriver = class _WebDriver {
|
|
|
1395
1452
|
if (isBidi(instance.capabilities || {})) {
|
|
1396
1453
|
const bidiReqOpts = instance.options.strictSSL ? {} : { rejectUnauthorized: false };
|
|
1397
1454
|
await instance._bidiHandler?.reconnect(newSessionCapabilities.webSocketUrl, bidiReqOpts);
|
|
1398
|
-
instance._bidiHandler?.socket
|
|
1455
|
+
instance._bidiHandler?.socket?.on("message", parseBidiMessage.bind(instance));
|
|
1399
1456
|
}
|
|
1400
1457
|
return sessionId;
|
|
1401
1458
|
}
|
|
@@ -1518,7 +1575,7 @@ var WebDriverResponseError = class _WebDriverResponseError extends WebDriverErro
|
|
|
1518
1575
|
// package.json
|
|
1519
1576
|
var package_default = {
|
|
1520
1577
|
name: "webdriver",
|
|
1521
|
-
version: "9.
|
|
1578
|
+
version: "9.11.0",
|
|
1522
1579
|
description: "A Node.js bindings implementation for the W3C WebDriver and Mobile JSONWire Protocol",
|
|
1523
1580
|
author: "Christian Bromann <mail@bromann.dev>",
|
|
1524
1581
|
homepage: "https://github.com/webdriverio/webdriverio/tree/main/packages/webdriver",
|
|
@@ -1567,6 +1624,39 @@ var package_default = {
|
|
|
1567
1624
|
}
|
|
1568
1625
|
};
|
|
1569
1626
|
|
|
1627
|
+
// src/request/polyfill.ts
|
|
1628
|
+
if (!AbortSignal.any) {
|
|
1629
|
+
AbortSignal.any = function(signals) {
|
|
1630
|
+
if (!signals || !Array.isArray(signals)) {
|
|
1631
|
+
throw new TypeError("AbortSignal.any requires an array of AbortSignal objects");
|
|
1632
|
+
}
|
|
1633
|
+
const controller = new AbortController();
|
|
1634
|
+
if (signals.some((signal) => signal.aborted)) {
|
|
1635
|
+
controller.abort();
|
|
1636
|
+
return controller.signal;
|
|
1637
|
+
}
|
|
1638
|
+
const listeners = signals.map((signal) => {
|
|
1639
|
+
const listener = () => {
|
|
1640
|
+
if ("reason" in signal && signal.reason !== void 0) {
|
|
1641
|
+
controller.abort(signal.reason);
|
|
1642
|
+
} else {
|
|
1643
|
+
controller.abort();
|
|
1644
|
+
}
|
|
1645
|
+
cleanup();
|
|
1646
|
+
};
|
|
1647
|
+
signal.addEventListener("abort", listener);
|
|
1648
|
+
return { signal, listener };
|
|
1649
|
+
});
|
|
1650
|
+
const cleanup = () => {
|
|
1651
|
+
listeners.forEach(({ signal, listener }) => {
|
|
1652
|
+
signal.removeEventListener("abort", listener);
|
|
1653
|
+
});
|
|
1654
|
+
};
|
|
1655
|
+
controller.signal.addEventListener("abort", cleanup);
|
|
1656
|
+
return controller.signal;
|
|
1657
|
+
};
|
|
1658
|
+
}
|
|
1659
|
+
|
|
1570
1660
|
// src/request/request.ts
|
|
1571
1661
|
var ERRORS_TO_EXCLUDE_FROM_RETRY = [
|
|
1572
1662
|
"detached shadow root",
|
|
@@ -1586,13 +1676,15 @@ var WebDriverRequest = class {
|
|
|
1586
1676
|
isHubCommand;
|
|
1587
1677
|
requiresSessionId;
|
|
1588
1678
|
eventHandler;
|
|
1589
|
-
|
|
1679
|
+
abortSignal;
|
|
1680
|
+
constructor(method, endpoint, body, abortSignal, isHubCommand = false, eventHandler = {}) {
|
|
1590
1681
|
this.body = body;
|
|
1591
1682
|
this.method = method;
|
|
1592
1683
|
this.endpoint = endpoint;
|
|
1593
1684
|
this.isHubCommand = isHubCommand;
|
|
1594
1685
|
this.requiresSessionId = Boolean(this.endpoint.match(/:sessionId/));
|
|
1595
1686
|
this.eventHandler = eventHandler;
|
|
1687
|
+
this.abortSignal = abortSignal;
|
|
1596
1688
|
}
|
|
1597
1689
|
async makeRequest(options, sessionId) {
|
|
1598
1690
|
const { url, requestOptions } = await this.createOptions(options, sessionId);
|
|
@@ -1604,7 +1696,10 @@ var WebDriverRequest = class {
|
|
|
1604
1696
|
const requestOptions = {
|
|
1605
1697
|
method: this.method,
|
|
1606
1698
|
redirect: "follow",
|
|
1607
|
-
signal: AbortSignal.
|
|
1699
|
+
signal: AbortSignal.any([
|
|
1700
|
+
AbortSignal.timeout(timeout),
|
|
1701
|
+
...this.abortSignal ? [this.abortSignal] : []
|
|
1702
|
+
])
|
|
1608
1703
|
};
|
|
1609
1704
|
const requestHeaders = new Headers({
|
|
1610
1705
|
...DEFAULT_HEADERS,
|
|
@@ -1689,7 +1784,7 @@ var WebDriverRequest = class {
|
|
|
1689
1784
|
};
|
|
1690
1785
|
if (response instanceof Error) {
|
|
1691
1786
|
const resError = response;
|
|
1692
|
-
if (resError.code && RETRYABLE_ERROR_CODES.includes(resError.code) || resError.statusCode && RETRYABLE_STATUS_CODES.includes(resError.statusCode)) {
|
|
1787
|
+
if (!(this.abortSignal && this.abortSignal.aborted) && (resError.code && RETRYABLE_ERROR_CODES.includes(resError.code) || resError.statusCode && RETRYABLE_STATUS_CODES.includes(resError.statusCode))) {
|
|
1693
1788
|
return retry(resError);
|
|
1694
1789
|
}
|
|
1695
1790
|
this.eventHandler.onPerformance?.({ request: fullRequestOptions, durationMillisecond, success: false, error: response, retryCount });
|
|
@@ -1749,6 +1844,93 @@ var FetchRequest2 = class extends WebDriverRequest {
|
|
|
1749
1844
|
}
|
|
1750
1845
|
};
|
|
1751
1846
|
|
|
1847
|
+
// src/node/bidi.ts
|
|
1848
|
+
import { isIP } from "node:net";
|
|
1849
|
+
import dns2 from "node:dns/promises";
|
|
1850
|
+
import logger6 from "@wdio/logger";
|
|
1851
|
+
import WebSocket from "ws";
|
|
1852
|
+
var log6 = logger6("webdriver");
|
|
1853
|
+
var CONNECTION_TIMEOUT = 1e4;
|
|
1854
|
+
async function createBidiConnection(webSocketUrl, options) {
|
|
1855
|
+
const candidateUrls = await listWebsocketCandidateUrls(webSocketUrl);
|
|
1856
|
+
return connectWebsocket(candidateUrls, options);
|
|
1857
|
+
}
|
|
1858
|
+
async function listWebsocketCandidateUrls(webSocketUrl) {
|
|
1859
|
+
const parsedUrl = new URL(webSocketUrl);
|
|
1860
|
+
const candidateUrls = [webSocketUrl];
|
|
1861
|
+
if (isIP(parsedUrl.hostname)) {
|
|
1862
|
+
return candidateUrls;
|
|
1863
|
+
}
|
|
1864
|
+
const candidateIps = await dns2.lookup(parsedUrl.hostname, { family: 0, all: true });
|
|
1865
|
+
if (candidateIps.length > 1) {
|
|
1866
|
+
const hostnameMapper = (result) => webSocketUrl.replace(parsedUrl.hostname, result.address);
|
|
1867
|
+
candidateUrls.push(...candidateIps.map(hostnameMapper));
|
|
1868
|
+
}
|
|
1869
|
+
return candidateUrls;
|
|
1870
|
+
}
|
|
1871
|
+
async function connectWebsocket(candidateUrls, _) {
|
|
1872
|
+
const websockets = candidateUrls.map((candidateUrl) => {
|
|
1873
|
+
log6.debug(`Attempt to connect to webSocketUrl ${candidateUrl}`);
|
|
1874
|
+
try {
|
|
1875
|
+
const ws2 = new WebSocket(candidateUrl);
|
|
1876
|
+
return ws2;
|
|
1877
|
+
} catch {
|
|
1878
|
+
return void 0;
|
|
1879
|
+
}
|
|
1880
|
+
}).filter(Boolean);
|
|
1881
|
+
const wsConnectPromises = websockets.map((ws2, index) => {
|
|
1882
|
+
const promise = new Promise((resolve) => {
|
|
1883
|
+
ws2.once("open", () => resolve({ ws: ws2, isConnected: true, index }));
|
|
1884
|
+
ws2.once("error", (err) => {
|
|
1885
|
+
log6.debug(`Could not connect to Bidi protocol at ${candidateUrls[index]}: ${err.message}`);
|
|
1886
|
+
resolve({ ws: ws2, isConnected: false, errorMessage: err.message, index });
|
|
1887
|
+
});
|
|
1888
|
+
});
|
|
1889
|
+
return { promise, index };
|
|
1890
|
+
});
|
|
1891
|
+
const connectionTimeoutPromise = new Promise((resolve) => {
|
|
1892
|
+
setTimeout(() => {
|
|
1893
|
+
log6.error(`Could not connect to Bidi protocol of any candidate url in time: "${candidateUrls.join('", "')}"`);
|
|
1894
|
+
return resolve(void 0);
|
|
1895
|
+
}, CONNECTION_TIMEOUT);
|
|
1896
|
+
});
|
|
1897
|
+
const wsInfo = await Promise.race([
|
|
1898
|
+
firstResolved(wsConnectPromises),
|
|
1899
|
+
connectionTimeoutPromise
|
|
1900
|
+
]);
|
|
1901
|
+
const socketsToCleanup = wsInfo ? websockets.filter((_2, index) => wsInfo.index !== index) : websockets;
|
|
1902
|
+
for (const socket of socketsToCleanup) {
|
|
1903
|
+
socket.removeAllListeners();
|
|
1904
|
+
if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CLOSING) {
|
|
1905
|
+
socket.terminate();
|
|
1906
|
+
} else {
|
|
1907
|
+
socket.once("open", () => socket.terminate());
|
|
1908
|
+
}
|
|
1909
|
+
}
|
|
1910
|
+
if (wsInfo?.isConnected) {
|
|
1911
|
+
log6.info(`Connected to Bidi protocol at ${candidateUrls[wsInfo.index]}`);
|
|
1912
|
+
return wsInfo.ws;
|
|
1913
|
+
}
|
|
1914
|
+
return void 0;
|
|
1915
|
+
}
|
|
1916
|
+
function firstResolved(promises, errorMessages = []) {
|
|
1917
|
+
if (promises.length === 0) {
|
|
1918
|
+
const sep = "\n - ";
|
|
1919
|
+
const errorMessage = errorMessages.length > 0 ? sep + errorMessages.join(sep) : "";
|
|
1920
|
+
log6.error("Could not connect to Bidi protocol" + errorMessage);
|
|
1921
|
+
return Promise.resolve(void 0);
|
|
1922
|
+
}
|
|
1923
|
+
return Promise.race(promises.map(({ promise }) => promise)).then((result) => {
|
|
1924
|
+
if (result.isConnected) {
|
|
1925
|
+
return result;
|
|
1926
|
+
}
|
|
1927
|
+
return firstResolved(
|
|
1928
|
+
promises.filter(({ index }) => index !== result.index),
|
|
1929
|
+
[...errorMessages, result.errorMessage || "unknown error"]
|
|
1930
|
+
);
|
|
1931
|
+
});
|
|
1932
|
+
}
|
|
1933
|
+
|
|
1752
1934
|
// src/node.ts
|
|
1753
1935
|
var node_default = WebDriver;
|
|
1754
1936
|
environment.value = {
|
|
@@ -1766,6 +1948,7 @@ environment.value = {
|
|
|
1766
1948
|
process.env.WDIO_UNIT_TESTS ? FetchRequest2 : FetchRequest
|
|
1767
1949
|
),
|
|
1768
1950
|
Socket: ws,
|
|
1951
|
+
createBidiConnection,
|
|
1769
1952
|
variables: {
|
|
1770
1953
|
WEBDRIVER_CACHE_DIR: process.env.WEBDRIVER_CACHE_DIR || os.tmpdir(),
|
|
1771
1954
|
PROXY_URL: process.env.HTTP_PROXY || process.env.HTTPS_PROXY
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polyfill.d.ts","sourceRoot":"","sources":["../../src/request/polyfill.ts"],"names":[],"mappings":""}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Options } from '@wdio/types';
|
|
2
2
|
import type { WebDriverResponse, RequestLibResponse, RequestOptions, RequestEventHandler } from './types.js';
|
|
3
|
+
import './polyfill.js';
|
|
3
4
|
export declare abstract class WebDriverRequest {
|
|
4
5
|
protected abstract fetch(url: URL, opts: RequestInit): Promise<Response>;
|
|
5
6
|
body?: Record<string, unknown>;
|
|
@@ -8,7 +9,8 @@ export declare abstract class WebDriverRequest {
|
|
|
8
9
|
isHubCommand: boolean;
|
|
9
10
|
requiresSessionId: boolean;
|
|
10
11
|
eventHandler: RequestEventHandler;
|
|
11
|
-
|
|
12
|
+
abortSignal?: AbortSignal;
|
|
13
|
+
constructor(method: string, endpoint: string, body?: Record<string, unknown>, abortSignal?: AbortSignal, isHubCommand?: boolean, eventHandler?: RequestEventHandler);
|
|
12
14
|
makeRequest(options: RequestOptions, sessionId?: string): Promise<WebDriverResponse<unknown>>;
|
|
13
15
|
createOptions(options: RequestOptions, sessionId?: string, isBrowser?: boolean): Promise<{
|
|
14
16
|
url: URL;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/request/request.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAI1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/request/request.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAI1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAM5G,OAAO,eAAe,CAAA;AAgBtB,8BAAsB,gBAAgB;IAClC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAExE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,YAAY,EAAE,mBAAmB,CAAA;IACjC,WAAW,CAAC,EAAE,WAAW,CAAA;gBAErB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,WAAW,CAAC,EAAE,WAAW,EACzB,YAAY,GAAE,OAAe,EAC7B,YAAY,GAAE,mBAAwB;IAWpC,WAAW,CAAE,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM;IAMxD,aAAa,CAAE,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC;QAAC,GAAG,EAAE,GAAG,CAAC;QAAC,cAAc,EAAE,WAAW,CAAC;KAAC,CAAC;cA+DhI,WAAW,CAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;cA8B9E,QAAQ,CACpB,GAAG,EAAE,GAAG,EACR,kBAAkB,EAAE,WAAW,EAC/B,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,cAAc,EAAE,WAAW,KAAK,kBAAkB,EACrG,eAAe,SAAI,EACnB,UAAU,SAAI,GACf,OAAO,CAAC,iBAAiB,CAAC;CA+HhC"}
|
package/build/types.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface SessionFlags {
|
|
|
23
23
|
isSauce: boolean;
|
|
24
24
|
isSeleniumStandalone: boolean;
|
|
25
25
|
isBidi: boolean;
|
|
26
|
+
isWindowsApp: boolean;
|
|
27
|
+
isMacApp: boolean;
|
|
26
28
|
}
|
|
27
29
|
type Fn = (...args: unknown[]) => unknown;
|
|
28
30
|
type ValueOf<T> = T[keyof T];
|
|
@@ -34,20 +36,22 @@ export type BidiCommands = WebDriverBidiCommands[keyof WebDriverBidiCommands]['s
|
|
|
34
36
|
export type BidiResponses = ValueOf<ObtainMethods<Pick<BidiHandler, BidiCommands>>>;
|
|
35
37
|
export type RemoteConfig = Options.WebDriver & Capabilities.WithRequestedCapabilities;
|
|
36
38
|
type BidiInterface = ObtainMethods<Pick<BidiHandler, BidiCommands>>;
|
|
39
|
+
export interface WebDriverCommandEvent {
|
|
40
|
+
command: string;
|
|
41
|
+
method: string;
|
|
42
|
+
endpoint: string;
|
|
43
|
+
body: unknown;
|
|
44
|
+
}
|
|
45
|
+
export interface WebDriverResultEvent {
|
|
46
|
+
command: string;
|
|
47
|
+
method: string;
|
|
48
|
+
endpoint: string;
|
|
49
|
+
body: unknown;
|
|
50
|
+
result: unknown;
|
|
51
|
+
}
|
|
37
52
|
type WebDriverClassicEvents = {
|
|
38
|
-
command:
|
|
39
|
-
|
|
40
|
-
method: string;
|
|
41
|
-
endpoint: string;
|
|
42
|
-
body: unknown;
|
|
43
|
-
};
|
|
44
|
-
result: {
|
|
45
|
-
command: string;
|
|
46
|
-
method: string;
|
|
47
|
-
endpoint: string;
|
|
48
|
-
body: unknown;
|
|
49
|
-
result: unknown;
|
|
50
|
-
};
|
|
53
|
+
command: WebDriverCommandEvent;
|
|
54
|
+
result: WebDriverResultEvent;
|
|
51
55
|
bidiCommand: Omit<CommandData, 'id'>;
|
|
52
56
|
bidiResult: CommandResponse;
|
|
53
57
|
'request.performance': RequestPerformanceEvent;
|
package/build/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAE9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAExH,MAAM,WAAW,kBAAmB,SAAQ,KAAK;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;IACjB,eAAe,EAAE,OAAO,CAAA;IACxB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,MAAM,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/build/utils.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ export declare function getPrototype({ isW3C, isChromium, isFirefox, isMobile, i
|
|
|
32
32
|
* @param {Object} options driver instance or option object containing these flags
|
|
33
33
|
* @return {Object} prototype object
|
|
34
34
|
*/
|
|
35
|
-
export declare function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSauce, isSeleniumStandalone, isChromium }: Partial<SessionFlags>): PropertyDescriptorMap;
|
|
35
|
+
export declare function getEnvironmentVars({ isW3C, isMobile, isIOS, isAndroid, isFirefox, isSauce, isSeleniumStandalone, isChromium, isWindowsApp, isMacApp }: Partial<SessionFlags>): PropertyDescriptorMap;
|
|
36
36
|
/**
|
|
37
37
|
* Decorate the client's options object with host updates based on the presence of
|
|
38
38
|
* directConnect capabilities in the new session response. Note that this
|
package/build/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAM1C,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAoBxF;;GAEG;AACH,wBAAsB,qBAAqB,CAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAA;CAAE,CAAC,CAgEzI;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAE,YAAY,EAAE,WAAW,CAAC,YAAY,QAiC3E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,WAkExE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,sCAiD7H;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,qBAAqB,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAM1C,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAoBxF;;GAEG;AACH,wBAAsB,qBAAqB,CAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAA;CAAE,CAAC,CAgEzI;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAE,YAAY,EAAE,WAAW,CAAC,YAAY,QAiC3E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,WAkExE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,sCAiD7H;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,qBAAqB,CAuBpM;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,QAgBhD;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAS,kBAAkB,WAAU,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,WAmD1F,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,OAAc,EACzB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,qBAAqB,CA6CvB;AAED,wBAAgB,gBAAgB,CAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,QAWjE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "webdriver",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.12.1",
|
|
4
4
|
"description": "A Node.js bindings implementation for the W3C WebDriver and Mobile JSONWire Protocol",
|
|
5
5
|
"author": "Christian Bromann <mail@bromann.dev>",
|
|
6
6
|
"homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/webdriver",
|
|
@@ -38,14 +38,14 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@types/node": "^20.1.0",
|
|
40
40
|
"@types/ws": "^8.5.3",
|
|
41
|
-
"@wdio/config": "9.
|
|
41
|
+
"@wdio/config": "9.12.1",
|
|
42
42
|
"@wdio/logger": "9.4.4",
|
|
43
43
|
"@wdio/protocols": "9.7.0",
|
|
44
44
|
"@wdio/types": "9.10.1",
|
|
45
|
-
"@wdio/utils": "9.
|
|
45
|
+
"@wdio/utils": "9.12.1",
|
|
46
46
|
"deepmerge-ts": "^7.0.3",
|
|
47
47
|
"undici": "^6.20.1",
|
|
48
48
|
"ws": "^8.8.0"
|
|
49
49
|
},
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "2887e7ba43c346edc5457309b874350a4cf628db"
|
|
51
51
|
}
|