webdriverio 9.1.1 → 9.1.3
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/commands/browser/execute.d.ts.map +1 -1
- package/build/commands/browser/executeAsync.d.ts.map +1 -1
- package/build/commands/browser/getPuppeteer.d.ts.map +1 -1
- package/build/commands/browser/url.d.ts +45 -45
- package/build/commands/browser/url.d.ts.map +1 -1
- package/build/index.js +144 -117
- package/build/polyfill.d.ts +1 -0
- package/build/polyfill.d.ts.map +1 -1
- package/build/shadowRoot.d.ts.map +1 -1
- package/build/utils/actions/pointer.d.ts.map +1 -1
- package/build/utils/detectBackend.d.ts.map +1 -1
- package/build/utils/interception/index.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/execute.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/execute.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,OAAO,CAAC,WAAW,EAAE,cAAc,SAAS,GAAG,EAAE,EACnE,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,kBAAkB,EAC1D,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,cAAc,KAAK,WAAW,CAAC,EAChE,GAAG,IAAI,EAAE,cAAc,GACxB,OAAO,CAAC,WAAW,CAAC,CAwCtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executeAsync.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/executeAsync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"executeAsync.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/executeAsync.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,cAAc,SAAS,GAAG,EAAE,EACxE,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,kBAAkB,EAC1D,MAAM,EACF,MAAM,GACN,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,EACjG,GAAG,IAAI,EAAE,cAAc,GACxB,OAAO,CAAC,WAAW,CAAC,CAgDtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPuppeteer.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/getPuppeteer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAa,OAAO,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"getPuppeteer.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/getPuppeteer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAa,OAAO,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAO5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,YAAY,CAAE,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqHxF"}
|
|
@@ -1,49 +1,4 @@
|
|
|
1
1
|
type WaitState = 'none' | 'interactive' | 'networkIdle' | 'complete';
|
|
2
|
-
interface UrlCommandOptions {
|
|
3
|
-
/**
|
|
4
|
-
* The desired state the requested resource should be in before finishing the command.
|
|
5
|
-
* It supports the following states:
|
|
6
|
-
*
|
|
7
|
-
* - `none`: no wait after the page request is made and the response is received
|
|
8
|
-
* - `interactive`: wait until the page is interactive
|
|
9
|
-
* - `complete`: wait until the DOM tree of the page is fully loaded
|
|
10
|
-
* - `networkIdle`: wait until there are no pending network requests
|
|
11
|
-
*
|
|
12
|
-
* @default 'complete'
|
|
13
|
-
*/
|
|
14
|
-
wait?: WaitState;
|
|
15
|
-
/**
|
|
16
|
-
* Headers to be sent with the request.
|
|
17
|
-
* @default {}
|
|
18
|
-
*/
|
|
19
|
-
headers?: Record<string, string>;
|
|
20
|
-
/**
|
|
21
|
-
* Basic authentication credentials
|
|
22
|
-
* Note: this will overwrite the existing `Authorization` header if provided in the `headers` option
|
|
23
|
-
*/
|
|
24
|
-
auth?: {
|
|
25
|
-
user: string;
|
|
26
|
-
pass: string;
|
|
27
|
-
};
|
|
28
|
-
/**
|
|
29
|
-
* If set to a number, the command will wait for the specified amount of milliseconds for the page to load
|
|
30
|
-
* all responses before returning.
|
|
31
|
-
*
|
|
32
|
-
* Note: for this to have an impact, it requires the `wait` option to be set to `networkIdle`
|
|
33
|
-
*
|
|
34
|
-
* @default 5000
|
|
35
|
-
*/
|
|
36
|
-
timeout?: number;
|
|
37
|
-
/**
|
|
38
|
-
* A function that is being called before your page has loaded all of its resources. It allows you to easily
|
|
39
|
-
* mock the environment, e.g. overwrite Web APIs that your application uses.
|
|
40
|
-
*
|
|
41
|
-
* Note: the provided function is being serialized and executed in the browser context. You can not pass in variables
|
|
42
|
-
* from the Node.js context. Furthermore changes to the environment only apply for this specific page load.
|
|
43
|
-
* Checkout `browser.addPreloadScript` for a more versatile way to mock the environment.
|
|
44
|
-
*/
|
|
45
|
-
onBeforeLoad?: () => any;
|
|
46
|
-
}
|
|
47
2
|
/**
|
|
48
3
|
*
|
|
49
4
|
* The `url` command loads an URL in the browser. If a baseUrl is specified in the config,
|
|
@@ -145,5 +100,50 @@ interface UrlCommandOptions {
|
|
|
145
100
|
*
|
|
146
101
|
*/
|
|
147
102
|
export declare function url(this: WebdriverIO.Browser, path: string, options?: UrlCommandOptions): Promise<WebdriverIO.Request | void>;
|
|
103
|
+
interface UrlCommandOptions {
|
|
104
|
+
/**
|
|
105
|
+
* The desired state the requested resource should be in before finishing the command.
|
|
106
|
+
* It supports the following states:
|
|
107
|
+
*
|
|
108
|
+
* - `none`: no wait after the page request is made and the response is received
|
|
109
|
+
* - `interactive`: wait until the page is interactive
|
|
110
|
+
* - `complete`: wait until the DOM tree of the page is fully loaded
|
|
111
|
+
* - `networkIdle`: wait until there are no pending network requests
|
|
112
|
+
*
|
|
113
|
+
* @default 'complete'
|
|
114
|
+
*/
|
|
115
|
+
wait?: WaitState;
|
|
116
|
+
/**
|
|
117
|
+
* Headers to be sent with the request.
|
|
118
|
+
* @default {}
|
|
119
|
+
*/
|
|
120
|
+
headers?: Record<string, string>;
|
|
121
|
+
/**
|
|
122
|
+
* Basic authentication credentials
|
|
123
|
+
* Note: this will overwrite the existing `Authorization` header if provided in the `headers` option
|
|
124
|
+
*/
|
|
125
|
+
auth?: {
|
|
126
|
+
user: string;
|
|
127
|
+
pass: string;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* If set to a number, the command will wait for the specified amount of milliseconds for the page to load
|
|
131
|
+
* all responses before returning.
|
|
132
|
+
*
|
|
133
|
+
* Note: for this to have an impact, it requires the `wait` option to be set to `networkIdle`
|
|
134
|
+
*
|
|
135
|
+
* @default 5000
|
|
136
|
+
*/
|
|
137
|
+
timeout?: number;
|
|
138
|
+
/**
|
|
139
|
+
* A function that is being called before your page has loaded all of its resources. It allows you to easily
|
|
140
|
+
* mock the environment, e.g. overwrite Web APIs that your application uses.
|
|
141
|
+
*
|
|
142
|
+
* Note: the provided function is being serialized and executed in the browser context. You can not pass in variables
|
|
143
|
+
* from the Node.js context. Furthermore changes to the environment only apply for this specific page load.
|
|
144
|
+
* Checkout `browser.addPreloadScript` for a more versatile way to mock the environment.
|
|
145
|
+
*/
|
|
146
|
+
onBeforeLoad?: () => any;
|
|
147
|
+
}
|
|
148
148
|
export {};
|
|
149
149
|
//# sourceMappingURL=url.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/url.ts"],"names":[],"mappings":"AAKA,KAAK,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,aAAa,GAAG,UAAU,CAAA;AAKpE,UAAU,iBAAiB;IACvB;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC;;;OAGG;IACH,IAAI,CAAC,EAAE;QACH,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACf,CAAA;IACD;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,CAAA;CAC3B
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/url.ts"],"names":[],"mappings":"AAKA,KAAK,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,aAAa,GAAG,UAAU,CAAA;AAKpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmGG;AACH,wBAAsB,GAAG,CACrB,IAAI,EAAE,WAAW,CAAC,OAAO,EACzB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAChC,OAAO,CAAC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,CA8FrC;AAED,UAAU,iBAAiB;IACvB;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC;;;OAGG;IACH,IAAI,CAAC,EAAE;QACH,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACf,CAAA;IACD;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,CAAA;CAC3B"}
|
package/build/index.js
CHANGED
|
@@ -78,7 +78,7 @@ import { URL as URL2 } from "node:url";
|
|
|
78
78
|
import cssValue from "css-value";
|
|
79
79
|
import rgb2hex from "rgb2hex";
|
|
80
80
|
import GraphemeSplitter from "grapheme-splitter";
|
|
81
|
-
import
|
|
81
|
+
import logger20 from "@wdio/logger";
|
|
82
82
|
import isPlainObject from "is-plain-obj";
|
|
83
83
|
import { ELEMENT_KEY as ELEMENT_KEY17 } from "webdriver";
|
|
84
84
|
import { UNICODE_CHARACTERS as UNICODE_CHARACTERS2, asyncIterators, getBrowserObject as getBrowserObject30 } from "@wdio/utils";
|
|
@@ -555,6 +555,13 @@ var MOVE_PARAM_DEFAULTS = {
|
|
|
555
555
|
duration: 100,
|
|
556
556
|
origin: ORIGIN_DEFAULT
|
|
557
557
|
};
|
|
558
|
+
function removeDefaultParams(seq) {
|
|
559
|
+
for (const [key, value] of Object.entries(seq)) {
|
|
560
|
+
if (value === 0 && !["x", "y", "button", "duration"].includes(key)) {
|
|
561
|
+
delete seq[key];
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
558
565
|
function mapButton(params) {
|
|
559
566
|
const buttons = {
|
|
560
567
|
left: 0,
|
|
@@ -592,6 +599,7 @@ var PointerAction = class extends BaseAction {
|
|
|
592
599
|
} else if (params) {
|
|
593
600
|
Object.assign(seq, params);
|
|
594
601
|
}
|
|
602
|
+
removeDefaultParams(seq);
|
|
595
603
|
this.sequence.push(seq);
|
|
596
604
|
return this;
|
|
597
605
|
}
|
|
@@ -603,11 +611,13 @@ var PointerAction = class extends BaseAction {
|
|
|
603
611
|
return this;
|
|
604
612
|
}
|
|
605
613
|
down(params = {}) {
|
|
606
|
-
|
|
614
|
+
const seq = {
|
|
607
615
|
type: "pointerDown",
|
|
608
616
|
...PARAM_DEFAULTS,
|
|
609
617
|
...mapButton(params)
|
|
610
|
-
}
|
|
618
|
+
};
|
|
619
|
+
removeDefaultParams(seq);
|
|
620
|
+
this.sequence.push(seq);
|
|
611
621
|
return this;
|
|
612
622
|
}
|
|
613
623
|
/**
|
|
@@ -3020,6 +3030,44 @@ var ContextManager = class {
|
|
|
3020
3030
|
}
|
|
3021
3031
|
};
|
|
3022
3032
|
|
|
3033
|
+
// src/polyfill.ts
|
|
3034
|
+
import logger5 from "@wdio/logger";
|
|
3035
|
+
var polyfillManager = /* @__PURE__ */ new Map();
|
|
3036
|
+
var log5 = logger5("webdriverio:PolyfillManager");
|
|
3037
|
+
var NAME_POLYFILL = "var __defProp = Object.defineProperty;var __name = (target, value) => __defProp(target, 'name', { value, configurable: true });globalThis.__name = __name;";
|
|
3038
|
+
function getPolyfillManager(browser) {
|
|
3039
|
+
const existingPolyfillManager = polyfillManager.get(browser);
|
|
3040
|
+
if (existingPolyfillManager) {
|
|
3041
|
+
return existingPolyfillManager;
|
|
3042
|
+
}
|
|
3043
|
+
const newContext = new PolyfillManager(browser);
|
|
3044
|
+
polyfillManager.set(browser, newContext);
|
|
3045
|
+
return newContext;
|
|
3046
|
+
}
|
|
3047
|
+
var PolyfillManager = class {
|
|
3048
|
+
#initialize;
|
|
3049
|
+
constructor(browser) {
|
|
3050
|
+
if (!browser.isBidi || process.env.VITEST_WORKER_ID || browser.options?.automationProtocol !== "webdriver") {
|
|
3051
|
+
this.#initialize = Promise.resolve(true);
|
|
3052
|
+
return;
|
|
3053
|
+
}
|
|
3054
|
+
const polyfill = (polyfill2) => {
|
|
3055
|
+
const closure = new Function(polyfill2);
|
|
3056
|
+
return closure();
|
|
3057
|
+
};
|
|
3058
|
+
this.#initialize = Promise.all([
|
|
3059
|
+
browser.addInitScript(polyfill, NAME_POLYFILL),
|
|
3060
|
+
browser.execute(polyfill, NAME_POLYFILL)
|
|
3061
|
+
]).then(() => {
|
|
3062
|
+
log5.info("polyfill script added");
|
|
3063
|
+
return true;
|
|
3064
|
+
}, () => false);
|
|
3065
|
+
}
|
|
3066
|
+
async initialize() {
|
|
3067
|
+
return this.#initialize;
|
|
3068
|
+
}
|
|
3069
|
+
};
|
|
3070
|
+
|
|
3023
3071
|
// src/commands/browser/execute.ts
|
|
3024
3072
|
async function execute(script, ...args) {
|
|
3025
3073
|
if (typeof script !== "string" && typeof script !== "function") {
|
|
@@ -3029,8 +3077,9 @@ async function execute(script, ...args) {
|
|
|
3029
3077
|
const browser = getBrowserObject2(this);
|
|
3030
3078
|
const contextManager2 = getContextManager(browser);
|
|
3031
3079
|
const context = await contextManager2.getCurrentContext();
|
|
3080
|
+
const userScript = typeof script === "string" ? new Function(script) : script;
|
|
3032
3081
|
const functionDeclaration = new Function(`
|
|
3033
|
-
return (${SCRIPT_PREFIX}${
|
|
3082
|
+
return (${SCRIPT_PREFIX}${userScript.toString()}${SCRIPT_SUFFIX}).apply(this, arguments);
|
|
3034
3083
|
`).toString();
|
|
3035
3084
|
const params = {
|
|
3036
3085
|
functionDeclaration,
|
|
@@ -3044,7 +3093,10 @@ async function execute(script, ...args) {
|
|
|
3044
3093
|
return parseScriptResult(params, result);
|
|
3045
3094
|
}
|
|
3046
3095
|
if (typeof script === "function") {
|
|
3047
|
-
script = `
|
|
3096
|
+
script = `
|
|
3097
|
+
${NAME_POLYFILL}
|
|
3098
|
+
return (${script}).apply(null, arguments)
|
|
3099
|
+
`;
|
|
3048
3100
|
}
|
|
3049
3101
|
return this.executeScript(script, verifyArgsAndStripIfElement(args));
|
|
3050
3102
|
}
|
|
@@ -3059,12 +3111,13 @@ async function executeAsync(script, ...args) {
|
|
|
3059
3111
|
const browser = getBrowserObject3(this);
|
|
3060
3112
|
const contextManager2 = getContextManager(browser);
|
|
3061
3113
|
const context = await contextManager2.getCurrentContext();
|
|
3114
|
+
const userScript = typeof script === "string" ? new Function(script) : script;
|
|
3062
3115
|
const functionDeclaration = new Function(`
|
|
3063
3116
|
const args = Array.from(arguments)
|
|
3064
3117
|
return new Promise(async (resolve, reject) => {
|
|
3065
3118
|
const cb = (result) => resolve(result)
|
|
3066
3119
|
try {
|
|
3067
|
-
await (${
|
|
3120
|
+
await (${userScript.toString()}).apply(this, [...args, cb])
|
|
3068
3121
|
} catch (err) {
|
|
3069
3122
|
return reject(err)
|
|
3070
3123
|
}
|
|
@@ -3082,14 +3135,17 @@ async function executeAsync(script, ...args) {
|
|
|
3082
3135
|
return parseScriptResult(params, result);
|
|
3083
3136
|
}
|
|
3084
3137
|
if (typeof script === "function") {
|
|
3085
|
-
script = `
|
|
3138
|
+
script = `
|
|
3139
|
+
${NAME_POLYFILL}
|
|
3140
|
+
return (${script}).apply(null, arguments)
|
|
3141
|
+
`;
|
|
3086
3142
|
}
|
|
3087
3143
|
return this.executeAsyncScript(script, verifyArgsAndStripIfElement(args));
|
|
3088
3144
|
}
|
|
3089
3145
|
|
|
3090
3146
|
// src/commands/browser/getCookies.ts
|
|
3091
|
-
import
|
|
3092
|
-
var
|
|
3147
|
+
import logger6 from "@wdio/logger";
|
|
3148
|
+
var log6 = logger6("webdriverio");
|
|
3093
3149
|
async function getCookies(filter) {
|
|
3094
3150
|
const usesMultipleFilter = Array.isArray(filter) && filter.length > 1;
|
|
3095
3151
|
if (!this.isBidi || usesMultipleFilter) {
|
|
@@ -3108,7 +3164,7 @@ async function getCookiesClassic(names) {
|
|
|
3108
3164
|
}
|
|
3109
3165
|
const usesMultipleFilter = Array.isArray(names) && names.length > 1;
|
|
3110
3166
|
if (usesMultipleFilter) {
|
|
3111
|
-
|
|
3167
|
+
log6.warn(
|
|
3112
3168
|
"Passing a string array as filter for `getCookies` is deprecated and its support will be removed in an upcoming version of WebdriverIO!"
|
|
3113
3169
|
);
|
|
3114
3170
|
const allCookies2 = await this.getAllCookies();
|
|
@@ -3127,7 +3183,7 @@ function getCookieFilter(names) {
|
|
|
3127
3183
|
}
|
|
3128
3184
|
return (Array.isArray(names) ? names : [names]).map((filter) => {
|
|
3129
3185
|
if (typeof filter === "string") {
|
|
3130
|
-
|
|
3186
|
+
log6.warn("Passing string values into `getCookie` is deprecated and its support will be removed in an upcoming version of WebdriverIO!");
|
|
3131
3187
|
return { name: filter };
|
|
3132
3188
|
}
|
|
3133
3189
|
return filter;
|
|
@@ -3135,9 +3191,10 @@ function getCookieFilter(names) {
|
|
|
3135
3191
|
}
|
|
3136
3192
|
|
|
3137
3193
|
// src/commands/browser/getPuppeteer.ts
|
|
3138
|
-
import
|
|
3194
|
+
import logger7 from "@wdio/logger";
|
|
3139
3195
|
import { userImport } from "@wdio/utils";
|
|
3140
|
-
var
|
|
3196
|
+
var log7 = logger7("webdriverio");
|
|
3197
|
+
var DEBUG_PIPE_FLAG = "remote-debugging-pipe";
|
|
3141
3198
|
async function getPuppeteer() {
|
|
3142
3199
|
const puppeteer = await userImport("puppeteer-core");
|
|
3143
3200
|
if (!puppeteer) {
|
|
@@ -3146,7 +3203,7 @@ async function getPuppeteer() {
|
|
|
3146
3203
|
);
|
|
3147
3204
|
}
|
|
3148
3205
|
if (this.puppeteer?.connected) {
|
|
3149
|
-
|
|
3206
|
+
log7.debug("Reusing existing puppeteer session");
|
|
3150
3207
|
return this.puppeteer;
|
|
3151
3208
|
}
|
|
3152
3209
|
const { headers } = this.options;
|
|
@@ -3177,6 +3234,15 @@ async function getPuppeteer() {
|
|
|
3177
3234
|
defaultViewport: null
|
|
3178
3235
|
});
|
|
3179
3236
|
return this.puppeteer;
|
|
3237
|
+
} else if (
|
|
3238
|
+
/**
|
|
3239
|
+
* if --remote-debugging-pipe is set as Chrome flag, we can't attach to the session
|
|
3240
|
+
* as there won't be a `debuggerAddress` available in the capabilities. Provide this
|
|
3241
|
+
* better error message to the user.
|
|
3242
|
+
*/
|
|
3243
|
+
chromiumOptions && (chromiumOptions.args?.includes(DEBUG_PIPE_FLAG) || chromiumOptions.args?.includes(`--${DEBUG_PIPE_FLAG}`))
|
|
3244
|
+
) {
|
|
3245
|
+
throw new Error(`Cannot attach to Chrome Devtools session if --${DEBUG_PIPE_FLAG} is set as Chrome flag.`);
|
|
3180
3246
|
}
|
|
3181
3247
|
if (this.capabilities.browserName?.toLowerCase() === "firefox") {
|
|
3182
3248
|
if (!this.capabilities.browserVersion) {
|
|
@@ -3248,7 +3314,7 @@ import { getBrowserObject as getBrowserObject5 } from "@wdio/utils";
|
|
|
3248
3314
|
|
|
3249
3315
|
// src/utils/interception/index.ts
|
|
3250
3316
|
import EventEmitter2 from "node:events";
|
|
3251
|
-
import
|
|
3317
|
+
import logger8 from "@wdio/logger";
|
|
3252
3318
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3253
3319
|
|
|
3254
3320
|
// src/utils/Timer.ts
|
|
@@ -3414,7 +3480,7 @@ function getPatternParam(pattern, key) {
|
|
|
3414
3480
|
}
|
|
3415
3481
|
|
|
3416
3482
|
// src/utils/interception/index.ts
|
|
3417
|
-
var
|
|
3483
|
+
var log8 = logger8("WebDriverInterception");
|
|
3418
3484
|
var hasSubscribedToEvents = false;
|
|
3419
3485
|
var WebDriverInterception = class _WebDriverInterception {
|
|
3420
3486
|
#pattern;
|
|
@@ -3443,7 +3509,7 @@ var WebDriverInterception = class _WebDriverInterception {
|
|
|
3443
3509
|
"network.responseStarted"
|
|
3444
3510
|
]
|
|
3445
3511
|
});
|
|
3446
|
-
|
|
3512
|
+
log8.info("subscribed to network events");
|
|
3447
3513
|
hasSubscribedToEvents = true;
|
|
3448
3514
|
}
|
|
3449
3515
|
const interception = await browser.networkAddIntercept({
|
|
@@ -3491,14 +3557,14 @@ var WebDriverInterception = class _WebDriverInterception {
|
|
|
3491
3557
|
if (!this.#isRequestMatching(request)) {
|
|
3492
3558
|
return;
|
|
3493
3559
|
}
|
|
3494
|
-
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
|
|
3498
|
-
|
|
3499
|
-
|
|
3500
|
-
);
|
|
3501
|
-
if (
|
|
3560
|
+
if (!this.#matchesFilterOptions(request)) {
|
|
3561
|
+
this.#emitter.emit("continue", request.request.request);
|
|
3562
|
+
return this.#browser.networkProvideResponse({
|
|
3563
|
+
request: request.request.request
|
|
3564
|
+
}).catch(this.#handleNetworkProvideResponseError);
|
|
3565
|
+
}
|
|
3566
|
+
this.#calls.push(request);
|
|
3567
|
+
if (this.#respondOverwrites.length === 0 || !this.#respondOverwrites[0].overwrite) {
|
|
3502
3568
|
this.#emitter.emit("continue", request.request.request);
|
|
3503
3569
|
return this.#browser.networkProvideResponse({
|
|
3504
3570
|
request: request.request.request
|
|
@@ -3534,10 +3600,10 @@ var WebDriverInterception = class _WebDriverInterception {
|
|
|
3534
3600
|
}
|
|
3535
3601
|
#matchesFilterOptions(request) {
|
|
3536
3602
|
let isRequestMatching = true;
|
|
3537
|
-
if (this.#filterOptions.method) {
|
|
3538
|
-
isRequestMatching = typeof this.#filterOptions.method === "function" ? this.#filterOptions.method(request.request.method) : this.#filterOptions.method === request.request.method;
|
|
3603
|
+
if (isRequestMatching && this.#filterOptions.method) {
|
|
3604
|
+
isRequestMatching = typeof this.#filterOptions.method === "function" ? this.#filterOptions.method(request.request.method) : this.#filterOptions.method.toLowerCase() === request.request.method.toLowerCase();
|
|
3539
3605
|
}
|
|
3540
|
-
if (this.#filterOptions.requestHeaders) {
|
|
3606
|
+
if (isRequestMatching && this.#filterOptions.requestHeaders) {
|
|
3541
3607
|
isRequestMatching = typeof this.#filterOptions.requestHeaders === "function" ? this.#filterOptions.requestHeaders(request.request.headers.reduce((acc, { name, value }) => {
|
|
3542
3608
|
acc[name] = value.type === "string" ? value.value : Buffer.from(value.value, "base64").toString();
|
|
3543
3609
|
return acc;
|
|
@@ -3549,7 +3615,7 @@ var WebDriverInterception = class _WebDriverInterception {
|
|
|
3549
3615
|
return header.value.type === "string" ? header.value.value === value : Buffer.from(header.value.value, "base64").toString() === value;
|
|
3550
3616
|
});
|
|
3551
3617
|
}
|
|
3552
|
-
if (this.#filterOptions.responseHeaders && "response" in request) {
|
|
3618
|
+
if (isRequestMatching && this.#filterOptions.responseHeaders && "response" in request) {
|
|
3553
3619
|
isRequestMatching = typeof this.#filterOptions.responseHeaders === "function" ? this.#filterOptions.responseHeaders(request.response.headers.reduce((acc, { name, value }) => {
|
|
3554
3620
|
acc[name] = value.type === "string" ? value.value : Buffer.from(value.value, "base64").toString();
|
|
3555
3621
|
return acc;
|
|
@@ -3561,7 +3627,7 @@ var WebDriverInterception = class _WebDriverInterception {
|
|
|
3561
3627
|
return header.value.type === "string" ? header.value.value === value : Buffer.from(header.value.value, "base64").toString() === value;
|
|
3562
3628
|
});
|
|
3563
3629
|
}
|
|
3564
|
-
if (this.#filterOptions.statusCode && "response" in request) {
|
|
3630
|
+
if (isRequestMatching && this.#filterOptions.statusCode && "response" in request) {
|
|
3565
3631
|
isRequestMatching = typeof this.#filterOptions.statusCode === "function" ? this.#filterOptions.statusCode(request.response.status) : this.#filterOptions.statusCode === request.response.status;
|
|
3566
3632
|
}
|
|
3567
3633
|
return isRequestMatching;
|
|
@@ -3605,7 +3671,7 @@ var WebDriverInterception = class _WebDriverInterception {
|
|
|
3605
3671
|
this.#respondOverwrites = [];
|
|
3606
3672
|
this.#restored = true;
|
|
3607
3673
|
const handle = await this.#browser.getWindowHandle();
|
|
3608
|
-
|
|
3674
|
+
log8.trace(`Restoring mock for ${handle}`);
|
|
3609
3675
|
SESSION_MOCKS[handle].delete(this);
|
|
3610
3676
|
if (this.#mockId) {
|
|
3611
3677
|
await this.#browser.networkRemoveIntercept({ intercept: this.#mockId });
|
|
@@ -3745,11 +3811,11 @@ async function mock(url6, filterOptions) {
|
|
|
3745
3811
|
}
|
|
3746
3812
|
|
|
3747
3813
|
// src/commands/browser/mockClearAll.ts
|
|
3748
|
-
import
|
|
3749
|
-
var
|
|
3814
|
+
import logger9 from "@wdio/logger";
|
|
3815
|
+
var log9 = logger9("webdriverio:mockClearAll");
|
|
3750
3816
|
async function mockClearAll() {
|
|
3751
3817
|
for (const [handle, mocks] of Object.entries(SESSION_MOCKS)) {
|
|
3752
|
-
|
|
3818
|
+
log9.trace(`Clearing mocks for ${handle}`);
|
|
3753
3819
|
for (const mock2 of mocks) {
|
|
3754
3820
|
mock2.clear();
|
|
3755
3821
|
}
|
|
@@ -3757,11 +3823,11 @@ async function mockClearAll() {
|
|
|
3757
3823
|
}
|
|
3758
3824
|
|
|
3759
3825
|
// src/commands/browser/mockRestoreAll.ts
|
|
3760
|
-
import
|
|
3761
|
-
var
|
|
3826
|
+
import logger10 from "@wdio/logger";
|
|
3827
|
+
var log10 = logger10("webdriverio:mockRestoreAll");
|
|
3762
3828
|
async function mockRestoreAll() {
|
|
3763
3829
|
for (const [handle, mocks] of Object.entries(SESSION_MOCKS)) {
|
|
3764
|
-
|
|
3830
|
+
log10.trace(`Clearing mocks for ${handle}`);
|
|
3765
3831
|
for (const mock2 of mocks) {
|
|
3766
3832
|
await mock2.restore();
|
|
3767
3833
|
}
|
|
@@ -3856,19 +3922,19 @@ async function react$(selector, { props = {}, state = {} } = {}) {
|
|
|
3856
3922
|
}
|
|
3857
3923
|
|
|
3858
3924
|
// src/commands/browser/reloadSession.ts
|
|
3859
|
-
import
|
|
3860
|
-
var
|
|
3925
|
+
import logger11 from "@wdio/logger";
|
|
3926
|
+
var log11 = logger11("webdriverio");
|
|
3861
3927
|
async function reloadSession(newCapabilities) {
|
|
3862
3928
|
const oldSessionId = this.sessionId;
|
|
3863
3929
|
const shutdownDriver = Boolean(newCapabilities?.browserName);
|
|
3864
3930
|
try {
|
|
3865
3931
|
await this.deleteSession({ shutdownDriver });
|
|
3866
3932
|
} catch (err) {
|
|
3867
|
-
|
|
3933
|
+
log11.warn(`Suppressing error closing the session: ${err.stack}`);
|
|
3868
3934
|
}
|
|
3869
3935
|
if (this.puppeteer?.connected) {
|
|
3870
3936
|
this.puppeteer.disconnect();
|
|
3871
|
-
|
|
3937
|
+
log11.debug("Disconnected puppeteer session");
|
|
3872
3938
|
}
|
|
3873
3939
|
const ProtocolDriver = (await import(
|
|
3874
3940
|
/* @vite-ignore */
|
|
@@ -3962,11 +4028,11 @@ async function saveScreenshot(filepath) {
|
|
|
3962
4028
|
}
|
|
3963
4029
|
|
|
3964
4030
|
// src/commands/browser/scroll.ts
|
|
3965
|
-
import
|
|
3966
|
-
var
|
|
4031
|
+
import logger12 from "@wdio/logger";
|
|
4032
|
+
var log12 = logger12("webdriverio");
|
|
3967
4033
|
function scroll(x = 0, y = 0) {
|
|
3968
4034
|
if (!x && !y) {
|
|
3969
|
-
return
|
|
4035
|
+
return log12.warn('"scroll" command was called with no parameters, skipping execution');
|
|
3970
4036
|
}
|
|
3971
4037
|
if (this.isMobile) {
|
|
3972
4038
|
return this.execute((x2, y2) => window.scrollBy(x2, y2), x, y);
|
|
@@ -4099,11 +4165,11 @@ async function switchWindow(matcher) {
|
|
|
4099
4165
|
}
|
|
4100
4166
|
|
|
4101
4167
|
// src/commands/browser/throttle.ts
|
|
4102
|
-
import
|
|
4168
|
+
import logger13 from "@wdio/logger";
|
|
4103
4169
|
import { getBrowserObject as getBrowserObject8 } from "@wdio/utils";
|
|
4104
|
-
var
|
|
4170
|
+
var log13 = logger13("webdriverio:throttle");
|
|
4105
4171
|
async function throttle(params) {
|
|
4106
|
-
|
|
4172
|
+
log13.warn('Command "throttle" is deprecated and will be removed with the next major version release! Use `throttleNetwork` instead.');
|
|
4107
4173
|
const browser = getBrowserObject8(this);
|
|
4108
4174
|
await browser.throttleNetwork(params);
|
|
4109
4175
|
}
|
|
@@ -4452,7 +4518,8 @@ async function url3(path4, options = {}) {
|
|
|
4452
4518
|
mock2 = await this.mock(path4);
|
|
4453
4519
|
mock2.requestOnce({ headers: options.headers });
|
|
4454
4520
|
}
|
|
4455
|
-
const
|
|
4521
|
+
const classicPageLoadStrategy = this.capabilities.pageLoadStrategy === "none" ? "none" : this.capabilities.pageLoadStrategy === "normal" ? "complete" : this.capabilities.pageLoadStrategy === "eager" ? "interactive" : void 0;
|
|
4522
|
+
const wait = options.wait === "networkIdle" ? "complete" : options.wait || classicPageLoadStrategy || DEFAULT_WAIT_STATE;
|
|
4456
4523
|
await this.browsingContextNavigate({
|
|
4457
4524
|
context,
|
|
4458
4525
|
url: path4,
|
|
@@ -4591,9 +4658,9 @@ function clearValue() {
|
|
|
4591
4658
|
}
|
|
4592
4659
|
|
|
4593
4660
|
// src/commands/element/click.ts
|
|
4594
|
-
import
|
|
4661
|
+
import logger14 from "@wdio/logger";
|
|
4595
4662
|
import { getBrowserObject as getBrowserObject10 } from "@wdio/utils";
|
|
4596
|
-
var
|
|
4663
|
+
var log14 = logger14("webdriver");
|
|
4597
4664
|
function click(options) {
|
|
4598
4665
|
if (typeof options !== "undefined") {
|
|
4599
4666
|
if (typeof options !== "object" || Array.isArray(options)) {
|
|
@@ -4639,10 +4706,10 @@ async function actionClick(element, options) {
|
|
|
4639
4706
|
if (x || y) {
|
|
4640
4707
|
const { width, height } = await browser.getElementRect(element.elementId);
|
|
4641
4708
|
if (x && x < -Math.floor(width / 2) || x && x > Math.floor(width / 2)) {
|
|
4642
|
-
|
|
4709
|
+
log14.warn("x would cause a out of bounds error as it goes outside of element");
|
|
4643
4710
|
}
|
|
4644
4711
|
if (y && y < -Math.floor(height / 2) || y && y > Math.floor(height / 2)) {
|
|
4645
|
-
|
|
4712
|
+
log14.warn("y would cause a out of bounds error as it goes outside of element");
|
|
4646
4713
|
}
|
|
4647
4714
|
}
|
|
4648
4715
|
const clickNested = async () => {
|
|
@@ -4859,10 +4926,10 @@ import { prettify as prettifyFn } from "htmlfy";
|
|
|
4859
4926
|
import { getBrowserObject as getBrowserObject18 } from "@wdio/utils";
|
|
4860
4927
|
|
|
4861
4928
|
// src/shadowRoot.ts
|
|
4862
|
-
import
|
|
4929
|
+
import logger15 from "@wdio/logger";
|
|
4863
4930
|
import customElementWrapper from "./scripts/customElement.js";
|
|
4864
4931
|
var shadowRootManager = /* @__PURE__ */ new Map();
|
|
4865
|
-
var
|
|
4932
|
+
var log15 = logger15("webdriverio:ShadowRootManager");
|
|
4866
4933
|
function getShadowRootManager(browser) {
|
|
4867
4934
|
const existingShadowRootManager = shadowRootManager.get(browser);
|
|
4868
4935
|
if (existingShadowRootManager) {
|
|
@@ -4966,9 +5033,9 @@ var ShadowRootManager = class {
|
|
|
4966
5033
|
!shadowElem.value?.shadowRoot?.sharedId || // we expect the shadow root to have a proper type
|
|
4967
5034
|
shadowElem.value.shadowRoot.value?.nodeType !== 11
|
|
4968
5035
|
) {
|
|
4969
|
-
return
|
|
5036
|
+
return log15.warn(`Expected element with shadow root but found <${shadowElem.value?.localName} />`);
|
|
4970
5037
|
}
|
|
4971
|
-
|
|
5038
|
+
log15.info(`Registered new shadow root for element <${shadowElem.value.localName} /> with id ${shadowElem.value.shadowRoot.sharedId}`);
|
|
4972
5039
|
const newTree = new ShadowRootTree(
|
|
4973
5040
|
shadowElem.sharedId,
|
|
4974
5041
|
shadowElem.value.shadowRoot.sharedId,
|
|
@@ -4997,7 +5064,8 @@ var ShadowRootManager = class {
|
|
|
4997
5064
|
tree = subTree;
|
|
4998
5065
|
}
|
|
4999
5066
|
}
|
|
5000
|
-
|
|
5067
|
+
const elements = tree.getAllLookupScopes();
|
|
5068
|
+
return [...new Set(elements).values()];
|
|
5001
5069
|
}
|
|
5002
5070
|
getShadowElementPairsByContextId(contextId, scope) {
|
|
5003
5071
|
let tree = this.#shadowRoots.get(contextId);
|
|
@@ -5386,18 +5454,18 @@ async function isStable() {
|
|
|
5386
5454
|
}
|
|
5387
5455
|
|
|
5388
5456
|
// src/commands/element/moveTo.ts
|
|
5389
|
-
import
|
|
5457
|
+
import logger16 from "@wdio/logger";
|
|
5390
5458
|
import { getBrowserObject as getBrowserObject24 } from "@wdio/utils";
|
|
5391
|
-
var
|
|
5459
|
+
var log16 = logger16("webdriver");
|
|
5392
5460
|
async function moveTo({ xOffset, yOffset } = {}) {
|
|
5393
5461
|
const browser = getBrowserObject24(this);
|
|
5394
5462
|
if (xOffset || yOffset) {
|
|
5395
5463
|
const { width, height } = await browser.getElementRect(this.elementId);
|
|
5396
5464
|
if (xOffset && xOffset < -Math.floor(width / 2) || xOffset && xOffset > Math.floor(width / 2)) {
|
|
5397
|
-
|
|
5465
|
+
log16.warn("xOffset would cause a out of bounds error as it goes outside of element");
|
|
5398
5466
|
}
|
|
5399
5467
|
if (yOffset && yOffset < -Math.floor(height / 2) || yOffset && yOffset > Math.floor(height / 2)) {
|
|
5400
|
-
|
|
5468
|
+
log16.warn("yOffset would cause a out of bounds error as it goes outside of element");
|
|
5401
5469
|
}
|
|
5402
5470
|
}
|
|
5403
5471
|
const moveToNested = async () => {
|
|
@@ -5507,10 +5575,10 @@ async function saveScreenshot2(filepath) {
|
|
|
5507
5575
|
}
|
|
5508
5576
|
|
|
5509
5577
|
// src/commands/element/scrollIntoView.ts
|
|
5510
|
-
import
|
|
5578
|
+
import logger17 from "@wdio/logger";
|
|
5511
5579
|
import { ELEMENT_KEY as ELEMENT_KEY16 } from "webdriver";
|
|
5512
5580
|
import { getBrowserObject as getBrowserObject27 } from "@wdio/utils";
|
|
5513
|
-
var
|
|
5581
|
+
var log17 = logger17("webdriverio");
|
|
5514
5582
|
function scrollIntoViewWeb(options = { block: "start", inline: "nearest" }) {
|
|
5515
5583
|
const browser = getBrowserObject27(this);
|
|
5516
5584
|
return browser.execute(
|
|
@@ -5569,7 +5637,7 @@ async function scrollIntoView(options = { block: "start", inline: "nearest" }) {
|
|
|
5569
5637
|
deltaY = Math.round(deltaY - scrollY);
|
|
5570
5638
|
await browser.action("wheel").scroll({ duration: 0, x: deltaX, y: deltaY, origin: this }).perform();
|
|
5571
5639
|
} catch (err) {
|
|
5572
|
-
|
|
5640
|
+
log17.warn(
|
|
5573
5641
|
`Failed to execute "scrollIntoView" using WebDriver Actions API: ${err.message}!
|
|
5574
5642
|
Re-attempting using \`Element.scrollIntoView\` via Web API.`
|
|
5575
5643
|
);
|
|
@@ -5634,7 +5702,7 @@ async function setValue(value) {
|
|
|
5634
5702
|
}
|
|
5635
5703
|
|
|
5636
5704
|
// src/commands/element/shadow$$.ts
|
|
5637
|
-
import
|
|
5705
|
+
import logger18 from "@wdio/logger";
|
|
5638
5706
|
import { getBrowserObject as getBrowserObject28 } from "@wdio/utils";
|
|
5639
5707
|
import { SHADOW_ELEMENT_KEY } from "webdriver";
|
|
5640
5708
|
import { shadowFnFactory } from "./scripts/shadowFnFactory.js";
|
|
@@ -5962,7 +6030,7 @@ var createRoleBaseXpathSelector = (role) => {
|
|
|
5962
6030
|
};
|
|
5963
6031
|
|
|
5964
6032
|
// src/commands/element/shadow$$.ts
|
|
5965
|
-
var
|
|
6033
|
+
var log18 = logger18("webdriverio");
|
|
5966
6034
|
async function shadow$$(selector) {
|
|
5967
6035
|
const browser = getBrowserObject28(this);
|
|
5968
6036
|
try {
|
|
@@ -5972,7 +6040,7 @@ async function shadow$$(selector) {
|
|
|
5972
6040
|
const elements = await getElements.call(this, selector, res, { isShadowElement: true });
|
|
5973
6041
|
return enhanceElementsArray(elements, this, selector);
|
|
5974
6042
|
} catch (err) {
|
|
5975
|
-
|
|
6043
|
+
log18.warn(
|
|
5976
6044
|
`Failed to fetch element within shadow DOM using WebDriver command: ${err.message}!
|
|
5977
6045
|
Falling back to JavaScript shim.`
|
|
5978
6046
|
);
|
|
@@ -5981,11 +6049,11 @@ Falling back to JavaScript shim.`
|
|
|
5981
6049
|
}
|
|
5982
6050
|
|
|
5983
6051
|
// src/commands/element/shadow$.ts
|
|
5984
|
-
import
|
|
6052
|
+
import logger19 from "@wdio/logger";
|
|
5985
6053
|
import { SHADOW_ELEMENT_KEY as SHADOW_ELEMENT_KEY2 } from "webdriver";
|
|
5986
6054
|
import { shadowFnFactory as shadowFnFactory2 } from "./scripts/shadowFnFactory.js";
|
|
5987
6055
|
import { getBrowserObject as getBrowserObject29 } from "@wdio/utils";
|
|
5988
|
-
var
|
|
6056
|
+
var log19 = logger19("webdriverio");
|
|
5989
6057
|
async function shadow$(selector) {
|
|
5990
6058
|
const browser = getBrowserObject29(this);
|
|
5991
6059
|
try {
|
|
@@ -5994,7 +6062,7 @@ async function shadow$(selector) {
|
|
|
5994
6062
|
const res = await browser.findElementFromShadowRoot(shadowRoot[SHADOW_ELEMENT_KEY2], using, value);
|
|
5995
6063
|
return getElement.call(this, selector, res, { isShadowElement: true });
|
|
5996
6064
|
} catch (err) {
|
|
5997
|
-
|
|
6065
|
+
log19.warn(
|
|
5998
6066
|
`Failed to fetch element within shadow DOM using WebDriver command: ${err.message}!
|
|
5999
6067
|
Falling back to JavaScript shim.`
|
|
6000
6068
|
);
|
|
@@ -6293,7 +6361,7 @@ function querySelectorAllDeep(findMany, s, r) {
|
|
|
6293
6361
|
}
|
|
6294
6362
|
|
|
6295
6363
|
// src/utils/index.ts
|
|
6296
|
-
var
|
|
6364
|
+
var log20 = logger20("webdriverio");
|
|
6297
6365
|
var INVALID_SELECTOR_ERROR = "selector needs to be typeof `string` or `function`";
|
|
6298
6366
|
var IGNORED_COMMAND_FILE_EXPORTS = ["SESSION_MOCKS", "CDP_SESSIONS"];
|
|
6299
6367
|
var scopes = {
|
|
@@ -6403,7 +6471,7 @@ function isStaleElementError(err) {
|
|
|
6403
6471
|
);
|
|
6404
6472
|
}
|
|
6405
6473
|
function transformClassicToBidiSelector(using, value) {
|
|
6406
|
-
if (using === "css selector") {
|
|
6474
|
+
if (using === "css selector" || using === "tag name") {
|
|
6407
6475
|
return { type: "css", value };
|
|
6408
6476
|
}
|
|
6409
6477
|
if (using === "xpath") {
|
|
@@ -6447,7 +6515,7 @@ async function findDeepElement(selector) {
|
|
|
6447
6515
|
})).then((elems) => elems.filter(([isIn]) => isIn).map(([, elem]) => elem));
|
|
6448
6516
|
return scopedNodes[0];
|
|
6449
6517
|
}, (err) => {
|
|
6450
|
-
|
|
6518
|
+
log20.warn(`Failed to execute browser.browsingContextLocateNodes({ ... }) due to ${err}, falling back to regular WebDriver Classic command`);
|
|
6451
6519
|
return browser.findElement(using, value);
|
|
6452
6520
|
});
|
|
6453
6521
|
if (!deepElementResult) {
|
|
@@ -6485,7 +6553,7 @@ async function findDeepElements(selector) {
|
|
|
6485
6553
|
})).then((elems) => elems.filter(([isIn]) => isIn).map(([, elem]) => elem));
|
|
6486
6554
|
return scopedNodes;
|
|
6487
6555
|
}, (err) => {
|
|
6488
|
-
|
|
6556
|
+
log20.warn(`Failed to execute browser.browsingContextLocateNodes({ ... }) due to ${err}, falling back to regular WebDriver Classic command`);
|
|
6489
6557
|
return browser.findElements(using, value);
|
|
6490
6558
|
});
|
|
6491
6559
|
return deepElementResult;
|
|
@@ -6613,7 +6681,7 @@ async function getElementRect(scope) {
|
|
|
6613
6681
|
if (rectJs && typeof rectJs[key] === "number") {
|
|
6614
6682
|
rect[key] = Math.floor(rectJs[key]);
|
|
6615
6683
|
} else {
|
|
6616
|
-
|
|
6684
|
+
log20.error("getElementRect", { rect, rectJs, key });
|
|
6617
6685
|
throw new Error("Failed to receive element rects via execute command");
|
|
6618
6686
|
}
|
|
6619
6687
|
});
|
|
@@ -6907,9 +6975,7 @@ var REGION_MAPPING = {
|
|
|
6907
6975
|
// default endpoint
|
|
6908
6976
|
"eu": "eu-central-1.",
|
|
6909
6977
|
"eu-central-1": "eu-central-1.",
|
|
6910
|
-
"us-east-4": "us-east-4."
|
|
6911
|
-
"apac": "apac-southeast-1.",
|
|
6912
|
-
"apac-southeast-1": "apac-southeast-1"
|
|
6978
|
+
"us-east-4": "us-east-4."
|
|
6913
6979
|
};
|
|
6914
6980
|
function getSauceEndpoint(region, { isRDC, isVisual } = {}) {
|
|
6915
6981
|
const shortRegion = REGION_MAPPING[region] ? region : "us";
|
|
@@ -7142,45 +7208,6 @@ var Dialog = class {
|
|
|
7142
7208
|
}
|
|
7143
7209
|
};
|
|
7144
7210
|
|
|
7145
|
-
// src/polyfill.ts
|
|
7146
|
-
import logger20 from "@wdio/logger";
|
|
7147
|
-
var polyfillManager = /* @__PURE__ */ new Map();
|
|
7148
|
-
var log20 = logger20("webdriverio:PolyfillManager");
|
|
7149
|
-
function getPolyfillManager(browser) {
|
|
7150
|
-
const existingPolyfillManager = polyfillManager.get(browser);
|
|
7151
|
-
if (existingPolyfillManager) {
|
|
7152
|
-
return existingPolyfillManager;
|
|
7153
|
-
}
|
|
7154
|
-
const newContext = new PolyfillManager(browser);
|
|
7155
|
-
polyfillManager.set(browser, newContext);
|
|
7156
|
-
return newContext;
|
|
7157
|
-
}
|
|
7158
|
-
var PolyfillManager = class {
|
|
7159
|
-
#initialize;
|
|
7160
|
-
constructor(browser) {
|
|
7161
|
-
if (!browser.isBidi || process.env.VITEST_WORKER_ID || browser.options?.automationProtocol !== "webdriver") {
|
|
7162
|
-
this.#initialize = Promise.resolve(true);
|
|
7163
|
-
return;
|
|
7164
|
-
}
|
|
7165
|
-
const polyfill = () => {
|
|
7166
|
-
const closure = new Function(
|
|
7167
|
-
"var __defProp = Object.defineProperty;var __name = (target, value) => __defProp(target, 'name', { value, configurable: true });globalThis.__name = __name;"
|
|
7168
|
-
);
|
|
7169
|
-
return closure();
|
|
7170
|
-
};
|
|
7171
|
-
this.#initialize = Promise.all([
|
|
7172
|
-
browser.addInitScript(polyfill),
|
|
7173
|
-
browser.execute(polyfill)
|
|
7174
|
-
]).then(() => {
|
|
7175
|
-
log20.info("polyfill script added");
|
|
7176
|
-
return true;
|
|
7177
|
-
}, () => false);
|
|
7178
|
-
}
|
|
7179
|
-
async initialize() {
|
|
7180
|
-
return this.#initialize;
|
|
7181
|
-
}
|
|
7182
|
-
};
|
|
7183
|
-
|
|
7184
7211
|
// src/index.ts
|
|
7185
7212
|
var Key2 = Key;
|
|
7186
7213
|
var SevereServiceError2 = SevereServiceError;
|
package/build/polyfill.d.ts
CHANGED
package/build/polyfill.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polyfill.d.ts","sourceRoot":"","sources":["../src/polyfill.ts"],"names":[],"mappings":"AAKA,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,mBAS9D;AAED;;GAEG;AACH,qBAAa,eAAe;;gBAGZ,OAAO,EAAE,WAAW,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"polyfill.d.ts","sourceRoot":"","sources":["../src/polyfill.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,aAAa,QAIzB,CAAA;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,mBAS9D;AAED;;GAEG;AACH,qBAAa,eAAe;;gBAGZ,OAAO,EAAE,WAAW,CAAC,OAAO;IAkClC,UAAU;CAGnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadowRoot.d.ts","sourceRoot":"","sources":["../src/shadowRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,WAAW,CAAA;AAQtC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,qBAShE;AAED;;;;GAIG;AACH,qBAAa,iBAAiB;;gBAMd,OAAO,EAAE,WAAW,CAAC,OAAO;IAyBlC,UAAU;IAuBhB;;;OAGG;IACH,aAAa;IAIb;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ;IA2FvC,4BAA4B,CAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"shadowRoot.d.ts","sourceRoot":"","sources":["../src/shadowRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,WAAW,CAAA;AAQtC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,qBAShE;AAED;;;;GAIG;AACH,qBAAa,iBAAiB;;gBAMd,OAAO,EAAE,WAAW,CAAC,OAAO;IAyBlC,UAAU;IAuBhB;;;OAGG;IACH,aAAa;IAIb;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ;IA2FvC,4BAA4B,CAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAwB1E,gCAAgC,CAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE;IAgBpG,qBAAqB,CAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IActF,gBAAgB,CAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAOvD;AAED,qBAAa,cAAc;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB,QAAQ,sBAA4B;gBAEvB,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc;IAMxE;;OAEG;IACH,gBAAgB,CAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IAC7C;;;;;OAKG;IACH,gBAAgB,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IA6B5D,IAAI,CAAE,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAelD,cAAc,CAAE,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAe/D,kBAAkB,IAAK,MAAM,EAAE;IAO/B,IAAI,IAAK,cAAc,EAAE;IAIzB,MAAM,CAAE,OAAO,EAAE,MAAM,GAAG,OAAO;CAcpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../../src/utils/actions/pointer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,WAAW,CAAA;AAChE,OAAO,UAAU,MAAM,WAAW,CAAA;AAClC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAI7D,eAAO,MAAM,WAAW,+CAA8C,CAAA;AACtE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;AACrD,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAC9B,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;AAM3C,UAAU,qBAAqB;IAC3B;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,WAAW,CAAA;CAC/B;AAKD,QAAA,MAAM,cAAc;;;;;;;;;;IAVhB;;;OAGG;YACK,MAAM,GAAG,WAAW;CAiB/B,CAAA;AACD,QAAA,MAAM,mBAAmB;;;;YAIK,CAAC,MAAM,GAAG,gBAAgB,GAAG,uBAAuB,GAAG,WAAW,CAAC,OAAO,CAAC;CACxG,CAAA;AAED,KAAK,mBAAmB,GAAG,OAAO,CAAC,OAAO,cAAc,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;AAC1F,KAAK,uBAAuB,GAAG,OAAO,CAAC,OAAO,mBAAmB,CAAC,GAAG,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../../src/utils/actions/pointer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,WAAW,CAAA;AAChE,OAAO,UAAU,MAAM,WAAW,CAAA;AAClC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAI7D,eAAO,MAAM,WAAW,+CAA8C,CAAA;AACtE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;AACrD,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAC9B,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;AAM3C,UAAU,qBAAqB;IAC3B;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,WAAW,CAAA;CAC/B;AAKD,QAAA,MAAM,cAAc;;;;;;;;;;IAVhB;;;OAGG;YACK,MAAM,GAAG,WAAW;CAiB/B,CAAA;AACD,QAAA,MAAM,mBAAmB;;;;YAIK,CAAC,MAAM,GAAG,gBAAgB,GAAG,uBAAuB,GAAG,WAAW,CAAC,OAAO,CAAC;CACxG,CAAA;AAED,KAAK,mBAAmB,GAAG,OAAO,CAAC,OAAO,cAAc,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;AAC1F,KAAK,uBAAuB,GAAG,OAAO,CAAC,OAAO,mBAAmB,CAAC,GAAG,mBAAmB,CAAA;AA4BxF,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,UAAU;gBACpC,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAE,gBAAqB;IAQzE;;;;;OAKG;IACH,IAAI,CAAE,MAAM,EAAE,uBAAuB,GAAG,aAAa;IACrD,IAAI,CAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa;IAqB1C;;;OAGG;IACH,EAAE,CAAE,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa;IACnC,EAAE,CAAE,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa;IACxC,EAAE,CAAE,MAAM,CAAC,EAAE,qBAAqB,GAAG,aAAa;IASlD;;;OAGG;IACH,IAAI,CAAE,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa;IACrC,IAAI,CAAE,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa;IAC1C,IAAI,CAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,aAAa;IAclD;;OAEG;IACH,MAAM;CAIT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detectBackend.d.ts","sourceRoot":"","sources":["../../src/utils/detectBackend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"detectBackend.d.ts","sourceRoot":"","sources":["../../src/utils/detectBackend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAexD,UAAU,qBAAqB;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAA;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,YAAY,CAAC,+BAA+B,CAAA;CAC9D;AAgBD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,OAAO,GAAE,qBAA0B;;;;;EAkGxE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/interception/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAKhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC3F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAMpD,KAAK,WAAW,GAAG,MAAM,GAAG,cAAc,GAAG,MAAM,CAAA;AAOnD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,qBAAqB;;gBAalC,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,iBAAiB,EAChC,OAAO,EAAE,WAAW,CAAC,OAAO;WAcnB,QAAQ,CACjB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,iBAAiB,EAChC,OAAO,EAAE,WAAW,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/interception/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAKhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC3F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAMpD,KAAK,WAAW,GAAG,MAAM,GAAG,cAAc,GAAG,MAAM,CAAA;AAOnD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,qBAAqB;;gBAalC,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,iBAAiB,EAChC,OAAO,EAAE,WAAW,CAAC,OAAO;WAcnB,QAAQ,CACjB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,iBAAiB,EAChC,OAAO,EAAE,WAAW,CAAC,OAAO;IA2NhC;;OAEG;IACH,IAAI,KAAK,IAAI,KAAK,CAAC,kCAAkC,EAAE,CAEtD;IAED;;OAEG;IACH,KAAK;IAKL;;;OAGG;IACH,KAAK;IAOL;;;;OAIG;IACG,OAAO;IAgBb;;;;;OAKG;IACH,OAAO,CAAC,SAAS,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,OAAO;IAMrD;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,kBAAkB;IAIvC;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,GAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAY3F;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,GAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAM;IAI/E;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO;IAMpB;;OAEG;IACH,SAAS;IAIT;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;IAO5C;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM;IAIhC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,kCAAkC,KAAK,IAAI,GAAG,qBAAqB;IAClH,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,kCAAkC,KAAK,IAAI,GAAG,qBAAqB;IAC9G,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,qBAAqB;IACnF,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,qBAAqB;IAC/E,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,kCAAkC,KAAK,IAAI,GAAG,qBAAqB;IAYrH,eAAe,CAAE,EACb,OAA8C,EAC9C,QAAgD,EAChD,UAAU,GACb,GAAE,cAAmB;CA2BzB;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,cAqBvD"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "webdriverio",
|
|
3
3
|
"description": "Next-gen browser and mobile automation test framework for Node.js",
|
|
4
|
-
"version": "9.1.
|
|
4
|
+
"version": "9.1.3",
|
|
5
5
|
"homepage": "https://webdriver.io",
|
|
6
6
|
"author": "Christian Bromann <mail@bromann.dev>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -76,19 +76,19 @@
|
|
|
76
76
|
"dependencies": {
|
|
77
77
|
"@types/node": "^20.11.30",
|
|
78
78
|
"@types/sinonjs__fake-timers": "^8.1.5",
|
|
79
|
-
"@wdio/config": "9.1.
|
|
80
|
-
"@wdio/logger": "9.1.
|
|
79
|
+
"@wdio/config": "9.1.3",
|
|
80
|
+
"@wdio/logger": "9.1.3",
|
|
81
81
|
"@wdio/protocols": "9.0.8",
|
|
82
82
|
"@wdio/repl": "9.0.8",
|
|
83
|
-
"@wdio/types": "9.1.
|
|
84
|
-
"@wdio/utils": "9.1.
|
|
83
|
+
"@wdio/types": "9.1.3",
|
|
84
|
+
"@wdio/utils": "9.1.3",
|
|
85
85
|
"archiver": "^7.0.1",
|
|
86
86
|
"aria-query": "^5.3.0",
|
|
87
87
|
"cheerio": "^1.0.0-rc.12",
|
|
88
88
|
"css-shorthand-properties": "^1.1.1",
|
|
89
89
|
"css-value": "^0.0.1",
|
|
90
90
|
"grapheme-splitter": "^1.0.4",
|
|
91
|
-
"htmlfy": "^0.
|
|
91
|
+
"htmlfy": "^0.3.0",
|
|
92
92
|
"import-meta-resolve": "^4.0.0",
|
|
93
93
|
"is-plain-obj": "^4.1.0",
|
|
94
94
|
"jszip": "^3.10.1",
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
"rgb2hex": "0.2.5",
|
|
101
101
|
"serialize-error": "^11.0.3",
|
|
102
102
|
"urlpattern-polyfill": "^10.0.0",
|
|
103
|
-
"webdriver": "9.1.
|
|
103
|
+
"webdriver": "9.1.3"
|
|
104
104
|
},
|
|
105
105
|
"peerDependencies": {
|
|
106
106
|
"puppeteer-core": "^22.3.0"
|
|
@@ -110,5 +110,5 @@
|
|
|
110
110
|
"optional": true
|
|
111
111
|
}
|
|
112
112
|
},
|
|
113
|
-
"gitHead": "
|
|
113
|
+
"gitHead": "db677c6008e388301aba23f655679f4c5b6ea023"
|
|
114
114
|
}
|