webdriverio 9.7.2 → 9.7.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/switchFrame.d.ts.map +1 -1
- package/build/index.js +261 -244
- package/build/node.js +264 -247
- package/build/session/context.d.ts.map +1 -1
- package/package.json +5 -5
package/build/node.js
CHANGED
|
@@ -143,8 +143,8 @@ var SessionManager = class {
|
|
|
143
143
|
* @param browser WebdriverIO.Browser
|
|
144
144
|
* @param scope scope of the session manager, e.g. context, network etc.
|
|
145
145
|
*/
|
|
146
|
-
constructor(
|
|
147
|
-
this.#browser =
|
|
146
|
+
constructor(browser2, scope) {
|
|
147
|
+
this.#browser = browser2;
|
|
148
148
|
this.#browser.on("command", this.#onCommand.bind(this));
|
|
149
149
|
this.#scope = scope;
|
|
150
150
|
}
|
|
@@ -174,17 +174,17 @@ var SessionManager = class {
|
|
|
174
174
|
!process.env.WDIO_UNIT_TESTS
|
|
175
175
|
);
|
|
176
176
|
}
|
|
177
|
-
static getSessionManager(
|
|
177
|
+
static getSessionManager(browser2, Manager) {
|
|
178
178
|
const scope = Manager.name;
|
|
179
179
|
let sessionManagerInstances = sessionManager.get(scope);
|
|
180
180
|
if (!sessionManagerInstances) {
|
|
181
181
|
sessionManagerInstances = /* @__PURE__ */ new Map();
|
|
182
182
|
sessionManager.set(scope, sessionManagerInstances);
|
|
183
183
|
}
|
|
184
|
-
let sessionManagerInstance = sessionManagerInstances.get(
|
|
184
|
+
let sessionManagerInstance = sessionManagerInstances.get(browser2);
|
|
185
185
|
if (!sessionManagerInstance) {
|
|
186
|
-
sessionManagerInstance = new Manager(
|
|
187
|
-
sessionManagerInstances.set(
|
|
186
|
+
sessionManagerInstance = new Manager(browser2);
|
|
187
|
+
sessionManagerInstances.set(browser2, sessionManagerInstance);
|
|
188
188
|
}
|
|
189
189
|
return sessionManagerInstance;
|
|
190
190
|
}
|
|
@@ -211,19 +211,19 @@ function getMobileContext({ capabilities, isAndroid, isNativeContext }) {
|
|
|
211
211
|
isAndroid && capabilities?.browserName?.toLowerCase() === "chrome" ? "CHROMIUM" : void 0
|
|
212
212
|
);
|
|
213
213
|
}
|
|
214
|
-
function calculateAndroidPinchAndZoomSpeed({ browser, duration, scale }) {
|
|
215
|
-
const deviceScreenSize = (
|
|
214
|
+
function calculateAndroidPinchAndZoomSpeed({ browser: browser2, duration, scale }) {
|
|
215
|
+
const deviceScreenSize = (browser2.capabilities?.deviceScreenSize || "1080x2400").split("x").reduce((a, b) => a * b);
|
|
216
216
|
const baseDistance = Math.sqrt(deviceScreenSize);
|
|
217
217
|
const gestureDistance = Math.max(baseDistance * Math.abs(scale), baseDistance * 0.1);
|
|
218
218
|
const durationSeconds = duration / 1e3;
|
|
219
219
|
return Math.floor(gestureDistance / durationSeconds);
|
|
220
220
|
}
|
|
221
|
-
function validatePinchAndZoomOptions({ browser, gesture, options }) {
|
|
221
|
+
function validatePinchAndZoomOptions({ browser: browser2, gesture, options }) {
|
|
222
222
|
if (typeof options !== "undefined" && (typeof options !== "object" || Array.isArray(options))) {
|
|
223
223
|
throw new TypeError("Options must be an object");
|
|
224
224
|
}
|
|
225
225
|
const DEFAULT_SCALE = 0.5;
|
|
226
|
-
const DEFAULT_DURATION =
|
|
226
|
+
const DEFAULT_DURATION = browser2.isIOS ? 1.5 : 1500;
|
|
227
227
|
const MIN_SCALE = 0;
|
|
228
228
|
const MAX_SCALE = 1;
|
|
229
229
|
const MIN_DURATION_MS = 500;
|
|
@@ -232,29 +232,29 @@ function validatePinchAndZoomOptions({ browser, gesture, options }) {
|
|
|
232
232
|
const scale = typeof scaleOption === "number" ? scaleOption >= MIN_SCALE && scaleOption <= MAX_SCALE ? scaleOption : (() => {
|
|
233
233
|
throw new Error(`The 'scale' option must be a number between ${MIN_SCALE} and ${MAX_SCALE}`);
|
|
234
234
|
})() : DEFAULT_SCALE;
|
|
235
|
-
const duration = typeof durationOption === "number" ? durationOption >= MIN_DURATION_MS && durationOption <= MAX_DURATION_MS ?
|
|
235
|
+
const duration = typeof durationOption === "number" ? durationOption >= MIN_DURATION_MS && durationOption <= MAX_DURATION_MS ? browser2.isIOS ? durationOption / 1e3 : durationOption : (() => {
|
|
236
236
|
throw new Error(`The 'duration' option must be between ${MIN_DURATION_MS} and ${MAX_DURATION_MS} ms (${MIN_DURATION_MS / 1e3} and ${MAX_DURATION_MS / 1e3} seconds)`);
|
|
237
237
|
})() : DEFAULT_DURATION;
|
|
238
238
|
return {
|
|
239
239
|
duration,
|
|
240
|
-
scale:
|
|
240
|
+
scale: browser2.isIOS && gesture === "zoom" ? scale * 10 : scale
|
|
241
241
|
};
|
|
242
242
|
}
|
|
243
243
|
|
|
244
244
|
// src/session/context.ts
|
|
245
245
|
var log2 = logger2("webdriverio:context");
|
|
246
246
|
var COMMANDS_REQUIRING_RESET = ["deleteSession", "refresh", "switchToParentFrame"];
|
|
247
|
-
function getContextManager(
|
|
248
|
-
return SessionManager.getSessionManager(
|
|
247
|
+
function getContextManager(browser2) {
|
|
248
|
+
return SessionManager.getSessionManager(browser2, ContextManager);
|
|
249
249
|
}
|
|
250
250
|
var ContextManager = class _ContextManager extends SessionManager {
|
|
251
251
|
#browser;
|
|
252
252
|
#currentContext;
|
|
253
253
|
#mobileContext;
|
|
254
254
|
#isNativeContext;
|
|
255
|
-
constructor(
|
|
256
|
-
super(
|
|
257
|
-
this.#browser =
|
|
255
|
+
constructor(browser2) {
|
|
256
|
+
super(browser2, _ContextManager.name);
|
|
257
|
+
this.#browser = browser2;
|
|
258
258
|
const capabilities = this.#browser.capabilities;
|
|
259
259
|
this.#isNativeContext = getNativeContext({ capabilities, isMobile: this.#browser.isMobile });
|
|
260
260
|
this.#mobileContext = getMobileContext({
|
|
@@ -267,6 +267,22 @@ var ContextManager = class _ContextManager extends SessionManager {
|
|
|
267
267
|
return;
|
|
268
268
|
}
|
|
269
269
|
this.#browser.on("command", this.#onCommand.bind(this));
|
|
270
|
+
this.#browser.sessionSubscribe({
|
|
271
|
+
events: ["browsingContext.navigationStarted"]
|
|
272
|
+
});
|
|
273
|
+
this.#browser.on("browsingContext.navigationStarted", async (nav) => {
|
|
274
|
+
if (!this.#currentContext || nav.context === this.#currentContext) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const { contexts } = await this.#browser.browsingContextGetTree({});
|
|
278
|
+
const hasContext = this.findContext(this.#currentContext, contexts, "byContextId");
|
|
279
|
+
const newContext = contexts.find((context) => context.context === nav.context);
|
|
280
|
+
if (!hasContext && newContext) {
|
|
281
|
+
this.setCurrentContext(newContext.context);
|
|
282
|
+
this.#browser.switchToWindow(this.#currentContext);
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
});
|
|
270
286
|
if (this.#browser.isMobile) {
|
|
271
287
|
this.#browser.on("result", this.#onCommandResultMobile.bind(this));
|
|
272
288
|
}
|
|
@@ -445,11 +461,11 @@ async function saveScreenshot(filepath) {
|
|
|
445
461
|
await assertDirectoryExists(absoluteFilepath);
|
|
446
462
|
let screenBuffer;
|
|
447
463
|
if (this.isBidi) {
|
|
448
|
-
const
|
|
449
|
-
const contextManager = getContextManager(
|
|
464
|
+
const browser2 = getBrowserObject(this);
|
|
465
|
+
const contextManager = getContextManager(browser2);
|
|
450
466
|
const context = await contextManager.getCurrentContext();
|
|
451
467
|
const tree = await this.browsingContextGetTree({});
|
|
452
|
-
const { data } = contextManager.findParentContext(context, tree.contexts) ? await
|
|
468
|
+
const { data } = contextManager.findParentContext(context, tree.contexts) ? await browser2.$("html").getElement().then(
|
|
453
469
|
(el) => this.takeElementScreenshot(el.elementId).then((data2) => ({ data: data2 }))
|
|
454
470
|
) : await this.browsingContextCaptureScreenshot({ context });
|
|
455
471
|
screenBuffer = data;
|
|
@@ -495,8 +511,8 @@ import logger3 from "@wdio/logger";
|
|
|
495
511
|
import { getBrowserObject as getBrowserObject2 } from "@wdio/utils";
|
|
496
512
|
var log3 = logger3("webdriverio");
|
|
497
513
|
async function implicitWait(currentElement, commandName) {
|
|
498
|
-
const
|
|
499
|
-
const skipForMobileScroll =
|
|
514
|
+
const browser2 = getBrowserObject2(currentElement);
|
|
515
|
+
const skipForMobileScroll = browser2.isMobile && await browser2.isNativeContext && (commandName === "scrollIntoView" || commandName === "tap");
|
|
500
516
|
if (!currentElement.elementId && !commandName.match(/(waitUntil|waitFor|isExisting|is?\w+Displayed|is?\w+Clickable)/) && !skipForMobileScroll) {
|
|
501
517
|
log3.debug(
|
|
502
518
|
`command ${commandName} was called on an element ("${currentElement.selector}") that wasn't found, waiting for it...`
|
|
@@ -626,13 +642,13 @@ var WebDriverError = class extends Error {
|
|
|
626
642
|
}
|
|
627
643
|
};
|
|
628
644
|
function getElement(selector, res, props = { isReactElement: false, isShadowElement: false }) {
|
|
629
|
-
const
|
|
645
|
+
const browser2 = getBrowserObject3(this);
|
|
630
646
|
const browserCommandKeys = Object.keys(browser_exports);
|
|
631
647
|
const propertiesObject = {
|
|
632
648
|
/**
|
|
633
649
|
* filter out browser commands from object
|
|
634
650
|
*/
|
|
635
|
-
...Object.entries(clone(
|
|
651
|
+
...Object.entries(clone(browser2.__propertiesObject__)).reduce((commands, [name, descriptor]) => {
|
|
636
652
|
if (!browserCommandKeys.includes(name)) {
|
|
637
653
|
commands[name] = descriptor;
|
|
638
654
|
}
|
|
@@ -664,19 +680,19 @@ function getElement(selector, res, props = { isReactElement: false, isShadowElem
|
|
|
664
680
|
const elementInstance = element(this.sessionId, elementErrorHandler(wrapCommand));
|
|
665
681
|
const origAddCommand = elementInstance.addCommand.bind(elementInstance);
|
|
666
682
|
elementInstance.addCommand = (name, fn) => {
|
|
667
|
-
|
|
683
|
+
browser2.__propertiesObject__[name] = { value: fn };
|
|
668
684
|
origAddCommand(name, fn);
|
|
669
685
|
};
|
|
670
686
|
return elementInstance;
|
|
671
687
|
}
|
|
672
688
|
var getElements = function getElements2(selector, elemResponse, props = { isReactElement: false, isShadowElement: false }) {
|
|
673
|
-
const
|
|
689
|
+
const browser2 = getBrowserObject3(this);
|
|
674
690
|
const browserCommandKeys = Object.keys(browser_exports);
|
|
675
691
|
const propertiesObject = {
|
|
676
692
|
/**
|
|
677
693
|
* filter out browser commands from object
|
|
678
694
|
*/
|
|
679
|
-
...Object.entries(clone(
|
|
695
|
+
...Object.entries(clone(browser2.__propertiesObject__)).reduce((commands, [name, descriptor]) => {
|
|
680
696
|
if (!browserCommandKeys.includes(name)) {
|
|
681
697
|
commands[name] = descriptor;
|
|
682
698
|
}
|
|
@@ -715,7 +731,7 @@ var getElements = function getElements2(selector, elemResponse, props = { isReac
|
|
|
715
731
|
const elementInstance = element(this.sessionId, elementErrorHandler(wrapCommand));
|
|
716
732
|
const origAddCommand = elementInstance.addCommand.bind(elementInstance);
|
|
717
733
|
elementInstance.addCommand = (name, fn) => {
|
|
718
|
-
|
|
734
|
+
browser2.__propertiesObject__[name] = { value: fn };
|
|
719
735
|
origAddCommand(name, fn);
|
|
720
736
|
};
|
|
721
737
|
return elementInstance;
|
|
@@ -1617,8 +1633,8 @@ var ClockManager = class {
|
|
|
1617
1633
|
#browser;
|
|
1618
1634
|
#resetFn = () => Promise.resolve();
|
|
1619
1635
|
#isInstalled = false;
|
|
1620
|
-
constructor(
|
|
1621
|
-
this.#browser =
|
|
1636
|
+
constructor(browser2) {
|
|
1637
|
+
this.#browser = browser2;
|
|
1622
1638
|
}
|
|
1623
1639
|
/**
|
|
1624
1640
|
* Install fake timers on the browser. If you call the `emulate` command, WebdriverIO will automatically install
|
|
@@ -3060,13 +3076,13 @@ var deviceDescriptorsSource = {
|
|
|
3060
3076
|
};
|
|
3061
3077
|
|
|
3062
3078
|
// src/commands/browser/emulate.ts
|
|
3063
|
-
function storeRestoreFunction(
|
|
3064
|
-
if (!restoreFunctions.has(
|
|
3065
|
-
restoreFunctions.set(
|
|
3079
|
+
function storeRestoreFunction(browser2, scope, fn) {
|
|
3080
|
+
if (!restoreFunctions.has(browser2)) {
|
|
3081
|
+
restoreFunctions.set(browser2, /* @__PURE__ */ new Map());
|
|
3066
3082
|
}
|
|
3067
|
-
const restoreFunctionsList = restoreFunctions.get(
|
|
3083
|
+
const restoreFunctionsList = restoreFunctions.get(browser2)?.get(scope);
|
|
3068
3084
|
const updatedList = restoreFunctionsList ? [...restoreFunctionsList, fn] : [fn];
|
|
3069
|
-
restoreFunctions.get(
|
|
3085
|
+
restoreFunctions.get(browser2)?.set(scope, updatedList);
|
|
3070
3086
|
}
|
|
3071
3087
|
async function emulate(scope, options) {
|
|
3072
3088
|
if (!this.isBidi) {
|
|
@@ -3457,8 +3473,8 @@ var ReferenceValue = class {
|
|
|
3457
3473
|
|
|
3458
3474
|
// src/session/polyfill.ts
|
|
3459
3475
|
import logger5 from "@wdio/logger";
|
|
3460
|
-
function getPolyfillManager(
|
|
3461
|
-
return SessionManager.getSessionManager(
|
|
3476
|
+
function getPolyfillManager(browser2) {
|
|
3477
|
+
return SessionManager.getSessionManager(browser2, PolyfillManager);
|
|
3462
3478
|
}
|
|
3463
3479
|
var log5 = logger5("webdriverio:PolyfillManager");
|
|
3464
3480
|
var polyfillFn = function webdriverioPolyfill() {
|
|
@@ -3473,9 +3489,9 @@ var PolyfillManager = class _PolyfillManager extends SessionManager {
|
|
|
3473
3489
|
#initialize;
|
|
3474
3490
|
#browser;
|
|
3475
3491
|
#scriptsRegisteredInContexts = /* @__PURE__ */ new Set();
|
|
3476
|
-
constructor(
|
|
3477
|
-
super(
|
|
3478
|
-
this.#browser =
|
|
3492
|
+
constructor(browser2) {
|
|
3493
|
+
super(browser2, _PolyfillManager.name);
|
|
3494
|
+
this.#browser = browser2;
|
|
3479
3495
|
if (!this.isEnabled()) {
|
|
3480
3496
|
this.#initialize = Promise.resolve(true);
|
|
3481
3497
|
return;
|
|
@@ -3525,8 +3541,8 @@ async function execute(script, ...args) {
|
|
|
3525
3541
|
throw new Error("number or type of arguments don't agree with execute protocol command");
|
|
3526
3542
|
}
|
|
3527
3543
|
if (this.isBidi && !this.isMultiremote) {
|
|
3528
|
-
const
|
|
3529
|
-
const contextManager = getContextManager(
|
|
3544
|
+
const browser2 = getBrowserObject4(this);
|
|
3545
|
+
const contextManager = getContextManager(browser2);
|
|
3530
3546
|
const context = await contextManager.getCurrentContext();
|
|
3531
3547
|
const userScript = typeof script === "string" ? new Function(script) : script;
|
|
3532
3548
|
const functionDeclaration = createFunctionDeclarationFromString(userScript);
|
|
@@ -3538,7 +3554,7 @@ async function execute(script, ...args) {
|
|
|
3538
3554
|
context
|
|
3539
3555
|
}
|
|
3540
3556
|
};
|
|
3541
|
-
const result = await
|
|
3557
|
+
const result = await browser2.scriptCallFunction(params);
|
|
3542
3558
|
return parseScriptResult(params, result);
|
|
3543
3559
|
}
|
|
3544
3560
|
if (typeof script === "function") {
|
|
@@ -3558,8 +3574,8 @@ async function executeAsync(script, ...args) {
|
|
|
3558
3574
|
throw new Error("number or type of arguments don't agree with execute protocol command");
|
|
3559
3575
|
}
|
|
3560
3576
|
if (this.isBidi && !this.isMultiremote) {
|
|
3561
|
-
const
|
|
3562
|
-
const contextManager = getContextManager(
|
|
3577
|
+
const browser2 = getBrowserObject5(this);
|
|
3578
|
+
const contextManager = getContextManager(browser2);
|
|
3563
3579
|
const context = await contextManager.getCurrentContext();
|
|
3564
3580
|
const userScript = typeof script === "string" ? new Function(script) : script;
|
|
3565
3581
|
const functionDeclaration = new Function(`
|
|
@@ -3581,7 +3597,7 @@ async function executeAsync(script, ...args) {
|
|
|
3581
3597
|
context
|
|
3582
3598
|
}
|
|
3583
3599
|
};
|
|
3584
|
-
const result = await
|
|
3600
|
+
const result = await browser2.scriptCallFunction(params);
|
|
3585
3601
|
return parseScriptResult(params, result);
|
|
3586
3602
|
}
|
|
3587
3603
|
if (typeof script === "function") {
|
|
@@ -3733,8 +3749,8 @@ async function getPuppeteer() {
|
|
|
3733
3749
|
// src/commands/browser/getWindowSize.ts
|
|
3734
3750
|
import { getBrowserObject as getBrowserObject6 } from "@wdio/utils";
|
|
3735
3751
|
async function getWindowSize() {
|
|
3736
|
-
const
|
|
3737
|
-
const { width, height } = await
|
|
3752
|
+
const browser2 = getBrowserObject6(this);
|
|
3753
|
+
const { width, height } = await browser2.getWindowRect();
|
|
3738
3754
|
return { width, height };
|
|
3739
3755
|
}
|
|
3740
3756
|
|
|
@@ -3952,18 +3968,18 @@ var WebDriverInterception = class _WebDriverInterception {
|
|
|
3952
3968
|
#requestOverwrites = [];
|
|
3953
3969
|
#respondOverwrites = [];
|
|
3954
3970
|
#calls = [];
|
|
3955
|
-
constructor(pattern, mockId, filterOptions,
|
|
3971
|
+
constructor(pattern, mockId, filterOptions, browser2) {
|
|
3956
3972
|
this.#pattern = pattern;
|
|
3957
3973
|
this.#mockId = mockId;
|
|
3958
3974
|
this.#filterOptions = filterOptions;
|
|
3959
|
-
this.#browser =
|
|
3960
|
-
|
|
3961
|
-
|
|
3975
|
+
this.#browser = browser2;
|
|
3976
|
+
browser2.on("network.beforeRequestSent", this.#handleBeforeRequestSent.bind(this));
|
|
3977
|
+
browser2.on("network.responseStarted", this.#handleResponseStarted.bind(this));
|
|
3962
3978
|
}
|
|
3963
|
-
static async initiate(url2, filterOptions,
|
|
3979
|
+
static async initiate(url2, filterOptions, browser2) {
|
|
3964
3980
|
const pattern = parseUrlPattern(url2);
|
|
3965
3981
|
if (!hasSubscribedToEvents) {
|
|
3966
|
-
await
|
|
3982
|
+
await browser2.sessionSubscribe({
|
|
3967
3983
|
events: [
|
|
3968
3984
|
"network.beforeRequestSent",
|
|
3969
3985
|
"network.responseStarted"
|
|
@@ -3972,7 +3988,7 @@ var WebDriverInterception = class _WebDriverInterception {
|
|
|
3972
3988
|
log8.info("subscribed to network events");
|
|
3973
3989
|
hasSubscribedToEvents = true;
|
|
3974
3990
|
}
|
|
3975
|
-
const interception = await
|
|
3991
|
+
const interception = await browser2.networkAddIntercept({
|
|
3976
3992
|
phases: ["beforeRequestSent", "responseStarted"],
|
|
3977
3993
|
urlPatterns: [{
|
|
3978
3994
|
type: "pattern",
|
|
@@ -3983,7 +3999,7 @@ var WebDriverInterception = class _WebDriverInterception {
|
|
|
3983
3999
|
search: getPatternParam(pattern, "search")
|
|
3984
4000
|
}]
|
|
3985
4001
|
});
|
|
3986
|
-
return new _WebDriverInterception(pattern, interception.intercept, filterOptions,
|
|
4002
|
+
return new _WebDriverInterception(pattern, interception.intercept, filterOptions, browser2);
|
|
3987
4003
|
}
|
|
3988
4004
|
#emit(event, args) {
|
|
3989
4005
|
if (!this.#eventHandler.has(event)) {
|
|
@@ -4275,8 +4291,8 @@ async function mock(url2, filterOptions) {
|
|
|
4275
4291
|
if (!this.isBidi) {
|
|
4276
4292
|
throw new Error("Mocking is only supported when running tests using WebDriver Bidi");
|
|
4277
4293
|
}
|
|
4278
|
-
const
|
|
4279
|
-
const contextManager = getContextManager(
|
|
4294
|
+
const browser2 = getBrowserObject7(this);
|
|
4295
|
+
const contextManager = getContextManager(browser2);
|
|
4280
4296
|
const context = await contextManager.getCurrentContext();
|
|
4281
4297
|
if (!SESSION_MOCKS[context]) {
|
|
4282
4298
|
SESSION_MOCKS[context] = /* @__PURE__ */ new Set();
|
|
@@ -4396,8 +4412,8 @@ import logger13 from "@wdio/logger";
|
|
|
4396
4412
|
import logger12 from "@wdio/logger";
|
|
4397
4413
|
import customElementWrapper from "./scripts/customElement.js";
|
|
4398
4414
|
var log12 = logger12("webdriverio:ShadowRootManager");
|
|
4399
|
-
function getShadowRootManager(
|
|
4400
|
-
return SessionManager.getSessionManager(
|
|
4415
|
+
function getShadowRootManager(browser2) {
|
|
4416
|
+
return SessionManager.getSessionManager(browser2, ShadowRootManager);
|
|
4401
4417
|
}
|
|
4402
4418
|
var ShadowRootManager = class _ShadowRootManager extends SessionManager {
|
|
4403
4419
|
#browser;
|
|
@@ -4405,9 +4421,9 @@ var ShadowRootManager = class _ShadowRootManager extends SessionManager {
|
|
|
4405
4421
|
#shadowRoots = /* @__PURE__ */ new Map();
|
|
4406
4422
|
#documentElement;
|
|
4407
4423
|
#frameDepth = 0;
|
|
4408
|
-
constructor(
|
|
4409
|
-
super(
|
|
4410
|
-
this.#browser =
|
|
4424
|
+
constructor(browser2) {
|
|
4425
|
+
super(browser2, _ShadowRootManager.name);
|
|
4426
|
+
this.#browser = browser2;
|
|
4411
4427
|
if (!this.isEnabled()) {
|
|
4412
4428
|
this.#initialize = Promise.resolve(true);
|
|
4413
4429
|
return;
|
|
@@ -4662,8 +4678,8 @@ var ShadowRootTree = class _ShadowRootTree {
|
|
|
4662
4678
|
};
|
|
4663
4679
|
|
|
4664
4680
|
// src/session/networkManager.ts
|
|
4665
|
-
function getNetworkManager(
|
|
4666
|
-
return SessionManager.getSessionManager(
|
|
4681
|
+
function getNetworkManager(browser2) {
|
|
4682
|
+
return SessionManager.getSessionManager(browser2, NetworkManager);
|
|
4667
4683
|
}
|
|
4668
4684
|
var UNKNOWN_NAVIGATION_ID = "UNKNOWN_NAVIGATION_ID";
|
|
4669
4685
|
var SUPPORTED_NAVIGATION_PROTOCOLS = ["http", "https", "data", "file"];
|
|
@@ -4672,9 +4688,9 @@ var NetworkManager = class _NetworkManager extends SessionManager {
|
|
|
4672
4688
|
#initialize;
|
|
4673
4689
|
#requests = /* @__PURE__ */ new Map();
|
|
4674
4690
|
#lastNetworkId;
|
|
4675
|
-
constructor(
|
|
4676
|
-
super(
|
|
4677
|
-
this.#browser =
|
|
4691
|
+
constructor(browser2) {
|
|
4692
|
+
super(browser2, _NetworkManager.name);
|
|
4693
|
+
this.#browser = browser2;
|
|
4678
4694
|
if (!this.isEnabled()) {
|
|
4679
4695
|
this.#initialize = Promise.resolve(true);
|
|
4680
4696
|
return;
|
|
@@ -4849,16 +4865,16 @@ function headerListToObject(headers) {
|
|
|
4849
4865
|
}
|
|
4850
4866
|
|
|
4851
4867
|
// src/session/dialog.ts
|
|
4852
|
-
function getDialogManager(
|
|
4853
|
-
return SessionManager.getSessionManager(
|
|
4868
|
+
function getDialogManager(browser2) {
|
|
4869
|
+
return SessionManager.getSessionManager(browser2, DialogManager);
|
|
4854
4870
|
}
|
|
4855
4871
|
var DialogManager = class _DialogManager extends SessionManager {
|
|
4856
4872
|
#browser;
|
|
4857
4873
|
#initialize;
|
|
4858
4874
|
#autoHandleDialog = true;
|
|
4859
|
-
constructor(
|
|
4860
|
-
super(
|
|
4861
|
-
this.#browser =
|
|
4875
|
+
constructor(browser2) {
|
|
4876
|
+
super(browser2, _DialogManager.name);
|
|
4877
|
+
this.#browser = browser2;
|
|
4862
4878
|
if (!this.isEnabled()) {
|
|
4863
4879
|
this.#initialize = Promise.resolve(true);
|
|
4864
4880
|
return;
|
|
@@ -4907,12 +4923,12 @@ var Dialog = class {
|
|
|
4907
4923
|
#message;
|
|
4908
4924
|
#defaultValue;
|
|
4909
4925
|
#type;
|
|
4910
|
-
constructor(event,
|
|
4926
|
+
constructor(event, browser2) {
|
|
4911
4927
|
this.#message = event.message;
|
|
4912
4928
|
this.#defaultValue = event.defaultValue;
|
|
4913
4929
|
this.#type = event.type;
|
|
4914
4930
|
this.#context = event.context;
|
|
4915
|
-
this.#browser =
|
|
4931
|
+
this.#browser = browser2;
|
|
4916
4932
|
}
|
|
4917
4933
|
message() {
|
|
4918
4934
|
return this.#message;
|
|
@@ -5114,8 +5130,8 @@ async function setWindowSize(width, height) {
|
|
|
5114
5130
|
if (width < minWindowSize2 || width > maxWindowSize2 || height < minWindowSize2 || height > maxWindowSize2) {
|
|
5115
5131
|
throw new Error("setWindowSize expects width and height to be a number in the 0 to 2^31 \u2212 1 range");
|
|
5116
5132
|
}
|
|
5117
|
-
const
|
|
5118
|
-
await
|
|
5133
|
+
const browser2 = getBrowserObject8(this);
|
|
5134
|
+
await browser2.setWindowRect(null, null, width, height);
|
|
5119
5135
|
}
|
|
5120
5136
|
|
|
5121
5137
|
// src/commands/browser/switchWindow.ts
|
|
@@ -5314,6 +5330,7 @@ async function switchFrame(context) {
|
|
|
5314
5330
|
if (!result || result.type !== "success" || result.result.type !== "boolean" || !result.result.value) {
|
|
5315
5331
|
continue;
|
|
5316
5332
|
}
|
|
5333
|
+
await browser.switchFrame(null);
|
|
5317
5334
|
await this.switchFrame(contextId);
|
|
5318
5335
|
return contextId;
|
|
5319
5336
|
}
|
|
@@ -5323,23 +5340,23 @@ async function switchFrame(context) {
|
|
|
5323
5340
|
`Invalid type for context parameter: ${typeof context}, expected one of number, string or null. Check out our docs: https://webdriver.io/docs/api/browser/switchFrame.html`
|
|
5324
5341
|
);
|
|
5325
5342
|
}
|
|
5326
|
-
function switchToFrameHelper(
|
|
5327
|
-
const sessionContext = getContextManager(
|
|
5343
|
+
function switchToFrameHelper(browser2, context) {
|
|
5344
|
+
const sessionContext = getContextManager(browser2);
|
|
5328
5345
|
sessionContext.setCurrentContext(context);
|
|
5329
5346
|
}
|
|
5330
|
-
async function switchToFrameUsingElement(
|
|
5331
|
-
const frame = await
|
|
5347
|
+
async function switchToFrameUsingElement(browser2, element) {
|
|
5348
|
+
const frame = await browser2.execute(
|
|
5332
5349
|
(iframe) => iframe.contentWindow,
|
|
5333
5350
|
element
|
|
5334
5351
|
);
|
|
5335
|
-
switchToFrameHelper(
|
|
5352
|
+
switchToFrameHelper(browser2, frame.context);
|
|
5336
5353
|
const elementId = element[ELEMENT_KEY8];
|
|
5337
|
-
await switchToFrame(
|
|
5354
|
+
await switchToFrame(browser2, { [ELEMENT_KEY8]: elementId });
|
|
5338
5355
|
return frame.context;
|
|
5339
5356
|
}
|
|
5340
|
-
function switchToFrame(
|
|
5357
|
+
function switchToFrame(browser2, frame) {
|
|
5341
5358
|
process.env.DISABLE_WEBDRIVERIO_DEPRECATION_WARNINGS = "true";
|
|
5342
|
-
return
|
|
5359
|
+
return browser2.switchToFrame(frame).finally(async () => {
|
|
5343
5360
|
delete process.env.DISABLE_WEBDRIVERIO_DEPRECATION_WARNINGS;
|
|
5344
5361
|
});
|
|
5345
5362
|
}
|
|
@@ -5350,8 +5367,8 @@ import { getBrowserObject as getBrowserObject9 } from "@wdio/utils";
|
|
|
5350
5367
|
var log16 = logger16("webdriverio:throttle");
|
|
5351
5368
|
async function throttle(params) {
|
|
5352
5369
|
log16.warn('Command "throttle" is deprecated and will be removed with the next major version release! Use `throttleNetwork` instead.');
|
|
5353
|
-
const
|
|
5354
|
-
await
|
|
5370
|
+
const browser2 = getBrowserObject9(this);
|
|
5371
|
+
await browser2.throttleNetwork(params);
|
|
5355
5372
|
}
|
|
5356
5373
|
|
|
5357
5374
|
// src/commands/browser/throttleCPU.ts
|
|
@@ -5450,8 +5467,8 @@ async function throttleNetwork(params) {
|
|
|
5450
5467
|
throw new Error(`Invalid parameter for "throttleNetwork". Expected it to be typeof object or one of the following values: ${NETWORK_PRESET_TYPES.join(", ")} but found "${params}"`);
|
|
5451
5468
|
}
|
|
5452
5469
|
if (this.isSauce) {
|
|
5453
|
-
const
|
|
5454
|
-
await
|
|
5470
|
+
const browser2 = getBrowserObject10(this);
|
|
5471
|
+
await browser2.sauceThrottleNetwork(params);
|
|
5455
5472
|
return null;
|
|
5456
5473
|
}
|
|
5457
5474
|
const failedConnectionMessage = "No Puppeteer connection could be established which is required to use this command";
|
|
@@ -5613,8 +5630,8 @@ var SWIPE_DEFAULTS = {
|
|
|
5613
5630
|
PERCENT: 0.95
|
|
5614
5631
|
};
|
|
5615
5632
|
async function swipe(options) {
|
|
5616
|
-
const
|
|
5617
|
-
if (!
|
|
5633
|
+
const browser2 = this;
|
|
5634
|
+
if (!browser2.isNativeContext) {
|
|
5618
5635
|
throw new Error("The swipe command is only available for mobile platforms in the NATIVE context.");
|
|
5619
5636
|
}
|
|
5620
5637
|
let { scrollableElement, from, to } = options || {};
|
|
@@ -5622,18 +5639,18 @@ async function swipe(options) {
|
|
|
5622
5639
|
log17.warn("`scrollableElement` is provided, so `from` and `to` will be ignored.");
|
|
5623
5640
|
}
|
|
5624
5641
|
if (!from || !to) {
|
|
5625
|
-
scrollableElement = scrollableElement || await getScrollableElement(
|
|
5642
|
+
scrollableElement = scrollableElement || await getScrollableElement(browser2);
|
|
5626
5643
|
({ from, to } = await calculateFromTo({
|
|
5627
|
-
browser,
|
|
5644
|
+
browser: browser2,
|
|
5628
5645
|
direction: options?.direction || SWIPE_DEFAULTS.DIRECTION,
|
|
5629
5646
|
percentage: options?.percent,
|
|
5630
5647
|
scrollableElement
|
|
5631
5648
|
}));
|
|
5632
5649
|
}
|
|
5633
|
-
return w3cSwipe({ browser, duration: options?.duration || SWIPE_DEFAULTS.DURATION, from, to });
|
|
5650
|
+
return w3cSwipe({ browser: browser2, duration: options?.duration || SWIPE_DEFAULTS.DURATION, from, to });
|
|
5634
5651
|
}
|
|
5635
5652
|
async function calculateFromTo({
|
|
5636
|
-
browser,
|
|
5653
|
+
browser: browser2,
|
|
5637
5654
|
direction,
|
|
5638
5655
|
percentage,
|
|
5639
5656
|
scrollableElement
|
|
@@ -5648,7 +5665,7 @@ async function calculateFromTo({
|
|
|
5648
5665
|
swipePercentage = percentage;
|
|
5649
5666
|
}
|
|
5650
5667
|
}
|
|
5651
|
-
const { x, y, width, height } = await
|
|
5668
|
+
const { x, y, width, height } = await browser2.getElementRect(await scrollableElement?.elementId);
|
|
5652
5669
|
const scrollRectangles = {
|
|
5653
5670
|
top: { x: Math.round(x + width / 2), y: Math.round(y + height - height * swipePercentage) },
|
|
5654
5671
|
right: { x: Math.round(x + width * swipePercentage), y: Math.round(y + height / 2) },
|
|
@@ -5679,35 +5696,35 @@ async function calculateFromTo({
|
|
|
5679
5696
|
}
|
|
5680
5697
|
return { from, to };
|
|
5681
5698
|
}
|
|
5682
|
-
async function getScrollableElement(
|
|
5699
|
+
async function getScrollableElement(browser2) {
|
|
5683
5700
|
const defaultAndroidSelector = "//android.widget.ScrollView";
|
|
5684
5701
|
const defaultIosSelector = '-ios predicate string:type == "XCUIElementTypeApplication"';
|
|
5685
|
-
const selector =
|
|
5702
|
+
const selector = browser2.isIOS ? (
|
|
5686
5703
|
// For iOS, we need to find the application element, if we can't find it, we should throw an error
|
|
5687
5704
|
defaultIosSelector
|
|
5688
5705
|
) : (
|
|
5689
5706
|
// There is always a scrollview for Android or, if this fails we should throw an error
|
|
5690
5707
|
defaultAndroidSelector
|
|
5691
5708
|
);
|
|
5692
|
-
const scrollableElements = await
|
|
5709
|
+
const scrollableElements = await browser2.$$(
|
|
5693
5710
|
selector
|
|
5694
5711
|
);
|
|
5695
5712
|
if (scrollableElements.length > 0) {
|
|
5696
5713
|
return scrollableElements[0];
|
|
5697
5714
|
}
|
|
5698
5715
|
throw new Error(
|
|
5699
|
-
`Default scrollable element '${
|
|
5716
|
+
`Default scrollable element '${browser2.isIOS ? defaultIosSelector : defaultAndroidSelector}' was not found. Our advice is to provide a scrollable element like this:
|
|
5700
5717
|
|
|
5701
5718
|
await browser.swipe({ scrollableElement: $('#scrollable') });
|
|
5702
5719
|
|
|
5703
5720
|
`
|
|
5704
5721
|
);
|
|
5705
5722
|
}
|
|
5706
|
-
async function w3cSwipe({ browser, duration, from, to }) {
|
|
5707
|
-
await
|
|
5708
|
-
parameters: { pointerType:
|
|
5723
|
+
async function w3cSwipe({ browser: browser2, duration, from, to }) {
|
|
5724
|
+
await browser2.action("pointer", {
|
|
5725
|
+
parameters: { pointerType: browser2.isMobile ? "touch" : "mouse" }
|
|
5709
5726
|
}).move(from.x, from.y).down().pause(10).move({ duration, x: to.x, y: to.y }).up().perform();
|
|
5710
|
-
return
|
|
5727
|
+
return browser2.pause(500);
|
|
5711
5728
|
}
|
|
5712
5729
|
|
|
5713
5730
|
// src/commands/mobile/tap.ts
|
|
@@ -5717,18 +5734,18 @@ var log18 = logger18("webdriver");
|
|
|
5717
5734
|
async function tap(options) {
|
|
5718
5735
|
const isElement2 = this.selector !== void 0;
|
|
5719
5736
|
const element = isElement2 ? this : null;
|
|
5720
|
-
const
|
|
5721
|
-
if (!
|
|
5737
|
+
const browser2 = isElement2 ? getBrowserObject11(this) : this;
|
|
5738
|
+
if (!browser2.isMobile) {
|
|
5722
5739
|
throw new Error("The tap command is only available for mobile platforms.");
|
|
5723
5740
|
}
|
|
5724
5741
|
validateTapOptions(options);
|
|
5725
5742
|
if (element) {
|
|
5726
|
-
return await elementTap(
|
|
5743
|
+
return await elementTap(browser2, element, options);
|
|
5727
5744
|
}
|
|
5728
5745
|
if (!options || options.x === void 0 || options.y === void 0) {
|
|
5729
5746
|
throw new Error("The tap command requires x and y coordinates to be set for screen taps.");
|
|
5730
5747
|
}
|
|
5731
|
-
return await screenTap(
|
|
5748
|
+
return await screenTap(browser2, options);
|
|
5732
5749
|
}
|
|
5733
5750
|
function validateTapOptions(options) {
|
|
5734
5751
|
if (options) {
|
|
@@ -5754,9 +5771,9 @@ function validateTapOptions(options) {
|
|
|
5754
5771
|
}
|
|
5755
5772
|
}
|
|
5756
5773
|
}
|
|
5757
|
-
async function elementTap(
|
|
5758
|
-
if (
|
|
5759
|
-
return await nativeTap(element,
|
|
5774
|
+
async function elementTap(browser2, element, options) {
|
|
5775
|
+
if (browser2.isNativeContext) {
|
|
5776
|
+
return await nativeTap(element, browser2, options);
|
|
5760
5777
|
}
|
|
5761
5778
|
if (options) {
|
|
5762
5779
|
log18.warn("The options object is not supported in Web environments and will be ignored.");
|
|
@@ -5766,18 +5783,18 @@ async function elementTap(browser, element, options) {
|
|
|
5766
5783
|
async function webTap(element) {
|
|
5767
5784
|
return element.click();
|
|
5768
5785
|
}
|
|
5769
|
-
async function executeNativeTap(
|
|
5770
|
-
return await
|
|
5771
|
-
`mobile: ${
|
|
5772
|
-
{ ...
|
|
5786
|
+
async function executeNativeTap(browser2, options) {
|
|
5787
|
+
return await browser2.execute(
|
|
5788
|
+
`mobile: ${browser2.isIOS ? "tap" : "clickGesture"}`,
|
|
5789
|
+
{ ...browser2.isIOS ? { x: 0, y: 0 } : {}, ...options }
|
|
5773
5790
|
);
|
|
5774
5791
|
}
|
|
5775
|
-
async function nativeTap(element,
|
|
5792
|
+
async function nativeTap(element, browser2, options = {}) {
|
|
5776
5793
|
try {
|
|
5777
5794
|
if (!element.elementId) {
|
|
5778
5795
|
throw new Error("no such element");
|
|
5779
5796
|
}
|
|
5780
|
-
return await executeNativeTap(
|
|
5797
|
+
return await executeNativeTap(browser2, { elementId: element.elementId });
|
|
5781
5798
|
} catch (error) {
|
|
5782
5799
|
let err = error;
|
|
5783
5800
|
if (typeof error === "string") {
|
|
@@ -5795,7 +5812,7 @@ async function nativeTap(element, browser, options = {}) {
|
|
|
5795
5812
|
);
|
|
5796
5813
|
try {
|
|
5797
5814
|
await element.scrollIntoView(scrollIntoViewOptions);
|
|
5798
|
-
return await executeNativeTap(
|
|
5815
|
+
return await executeNativeTap(browser2, { elementId: element.elementId });
|
|
5799
5816
|
} catch (scrollError) {
|
|
5800
5817
|
let err2 = scrollError;
|
|
5801
5818
|
if (typeof scrollError === "string") {
|
|
@@ -5826,12 +5843,12 @@ await elem.tap({
|
|
|
5826
5843
|
}
|
|
5827
5844
|
}
|
|
5828
5845
|
}
|
|
5829
|
-
async function screenTap(
|
|
5846
|
+
async function screenTap(browser2, options) {
|
|
5830
5847
|
const { x, y } = options;
|
|
5831
|
-
if (
|
|
5832
|
-
return await executeNativeTap(
|
|
5848
|
+
if (browser2.isNativeContext) {
|
|
5849
|
+
return await executeNativeTap(browser2, options);
|
|
5833
5850
|
}
|
|
5834
|
-
return await
|
|
5851
|
+
return await browser2.action(
|
|
5835
5852
|
"pointer",
|
|
5836
5853
|
{
|
|
5837
5854
|
parameters: { pointerType: "touch" }
|
|
@@ -5843,19 +5860,19 @@ async function screenTap(browser, options) {
|
|
|
5843
5860
|
import logger19 from "@wdio/logger";
|
|
5844
5861
|
var log19 = logger19("webdriver");
|
|
5845
5862
|
async function getContext(options) {
|
|
5846
|
-
const
|
|
5847
|
-
if (!
|
|
5863
|
+
const browser2 = this;
|
|
5864
|
+
if (!browser2.isMobile) {
|
|
5848
5865
|
throw new Error("The `getContext` command is only available for mobile platforms.");
|
|
5849
5866
|
}
|
|
5850
|
-
const currentAppiumContext = await
|
|
5867
|
+
const currentAppiumContext = await browser2.getAppiumContext();
|
|
5851
5868
|
if (!options || !options?.returnDetailedContext || currentAppiumContext === "NATIVE_APP") {
|
|
5852
5869
|
return currentAppiumContext;
|
|
5853
5870
|
}
|
|
5854
5871
|
delete options.returnDetailedContext;
|
|
5855
|
-
return getDetailedContext(
|
|
5872
|
+
return getDetailedContext(browser2, currentAppiumContext, options);
|
|
5856
5873
|
}
|
|
5857
|
-
async function getDetailedContext(
|
|
5858
|
-
const detailedContexts = await
|
|
5874
|
+
async function getDetailedContext(browser2, currentAppiumContext, options) {
|
|
5875
|
+
const detailedContexts = await browser2.getContexts({
|
|
5859
5876
|
...{ options },
|
|
5860
5877
|
// Defaults
|
|
5861
5878
|
returnDetailedContexts: true,
|
|
@@ -5882,13 +5899,13 @@ async function getDetailedContext(browser, currentAppiumContext, options) {
|
|
|
5882
5899
|
import logger20 from "@wdio/logger";
|
|
5883
5900
|
var log20 = logger20("webdriver");
|
|
5884
5901
|
async function getContexts(options) {
|
|
5885
|
-
const
|
|
5886
|
-
if (!
|
|
5902
|
+
const browser2 = this;
|
|
5903
|
+
if (!browser2.isMobile) {
|
|
5887
5904
|
throw new Error("The `getContexts` command is only available for mobile platforms.");
|
|
5888
5905
|
}
|
|
5889
5906
|
if (!options || !options.returnDetailedContexts) {
|
|
5890
5907
|
log20.info("The standard Appium `contexts` method is used. If you want to get more detailed data, you can set `returnDetailedContexts` to `true`.");
|
|
5891
|
-
return
|
|
5908
|
+
return browser2.getAppiumContexts();
|
|
5892
5909
|
}
|
|
5893
5910
|
const defaultOptions = {
|
|
5894
5911
|
androidWebviewConnectionRetryTime: 500,
|
|
@@ -5897,7 +5914,7 @@ async function getContexts(options) {
|
|
|
5897
5914
|
isAndroidWebviewVisible: true,
|
|
5898
5915
|
returnAndroidDescriptionData: false
|
|
5899
5916
|
};
|
|
5900
|
-
return getCurrentContexts({ browser, ...{ ...defaultOptions, ...options } });
|
|
5917
|
+
return getCurrentContexts({ browser: browser2, ...{ ...defaultOptions, ...options } });
|
|
5901
5918
|
}
|
|
5902
5919
|
var CHROME_PACKAGE_NAME = "com.android.chrome";
|
|
5903
5920
|
async function parsedAndroidContexts({
|
|
@@ -5964,18 +5981,18 @@ async function parsedAndroidContexts({
|
|
|
5964
5981
|
return result;
|
|
5965
5982
|
}
|
|
5966
5983
|
async function getCurrentContexts({
|
|
5967
|
-
browser,
|
|
5984
|
+
browser: browser2,
|
|
5968
5985
|
androidWebviewConnectionRetryTime,
|
|
5969
5986
|
androidWebviewConnectTimeout,
|
|
5970
5987
|
filterByCurrentAndroidApp,
|
|
5971
5988
|
isAndroidWebviewVisible,
|
|
5972
5989
|
returnAndroidDescriptionData
|
|
5973
5990
|
}) {
|
|
5974
|
-
const contexts = await
|
|
5975
|
-
if (
|
|
5991
|
+
const contexts = await browser2.execute("mobile: getContexts");
|
|
5992
|
+
if (browser2.isIOS) {
|
|
5976
5993
|
return contexts;
|
|
5977
5994
|
}
|
|
5978
|
-
const packageName = await
|
|
5995
|
+
const packageName = await browser2.getCurrentPackage();
|
|
5979
5996
|
const startTime = Date.now();
|
|
5980
5997
|
const retryInterval = androidWebviewConnectionRetryTime;
|
|
5981
5998
|
let isPackageNameMissing = false;
|
|
@@ -6014,8 +6031,8 @@ async function getCurrentContexts({
|
|
|
6014
6031
|
import logger21 from "@wdio/logger";
|
|
6015
6032
|
var log21 = logger21("webdriver");
|
|
6016
6033
|
async function switchContext(options) {
|
|
6017
|
-
const
|
|
6018
|
-
if (!
|
|
6034
|
+
const browser2 = this;
|
|
6035
|
+
if (!browser2.isMobile) {
|
|
6019
6036
|
throw new Error("The `switchContext` command is only available for mobile platforms.");
|
|
6020
6037
|
}
|
|
6021
6038
|
if (!options) {
|
|
@@ -6023,14 +6040,14 @@ async function switchContext(options) {
|
|
|
6023
6040
|
}
|
|
6024
6041
|
if (typeof options === "string") {
|
|
6025
6042
|
log21.info("The standard Appium `context`-method is used. If you want to switch to a webview with a specific title or url, please provide an object with the `title` or `url` property. See https://webdriver.io/docs/api/mobile/switchContext for more information.");
|
|
6026
|
-
return
|
|
6043
|
+
return browser2.switchAppiumContext(options);
|
|
6027
6044
|
}
|
|
6028
6045
|
if (!options.title && !options.url) {
|
|
6029
6046
|
throw new Error("You need to provide at least a `title` or `url` property to use full potential of the `switchContext` command. See https://webdriver.io/docs/api/mobile/switchContext for more information.");
|
|
6030
6047
|
}
|
|
6031
|
-
return switchToContext({ browser, options });
|
|
6048
|
+
return switchToContext({ browser: browser2, options });
|
|
6032
6049
|
}
|
|
6033
|
-
async function switchToContext({ browser, options }) {
|
|
6050
|
+
async function switchToContext({ browser: browser2, options }) {
|
|
6034
6051
|
const getContextsOptions = {
|
|
6035
6052
|
returnDetailedContexts: true,
|
|
6036
6053
|
filterByCurrentAndroidApp: false,
|
|
@@ -6039,19 +6056,19 @@ async function switchToContext({ browser, options }) {
|
|
|
6039
6056
|
...options?.androidWebviewConnectionRetryTime && { androidWebviewConnectionRetryTime: options.androidWebviewConnectionRetryTime },
|
|
6040
6057
|
...options?.androidWebviewConnectTimeout && { androidWebviewConnectTimeout: options.androidWebviewConnectTimeout }
|
|
6041
6058
|
};
|
|
6042
|
-
const contexts = await
|
|
6043
|
-
const identifier =
|
|
6044
|
-
const { matchingContext, reasons } = findMatchingContext({ browser, contexts, identifier, ...options?.title && { title: options.title }, ...options?.url && { url: options.url } });
|
|
6059
|
+
const contexts = await browser2.getContexts(getContextsOptions);
|
|
6060
|
+
const identifier = browser2.isIOS ? (await browser2.execute("mobile: activeAppInfo"))?.bundleId : await browser2.getCurrentPackage();
|
|
6061
|
+
const { matchingContext, reasons } = findMatchingContext({ browser: browser2, contexts, identifier, ...options?.title && { title: options.title }, ...options?.url && { url: options.url } });
|
|
6045
6062
|
if (!matchingContext) {
|
|
6046
6063
|
throw new Error(reasons.join("\n"));
|
|
6047
6064
|
}
|
|
6048
6065
|
log21.info("WebdriverIO found a matching context:", JSON.stringify(matchingContext, null, 2));
|
|
6049
|
-
if (!
|
|
6066
|
+
if (!browser2.isIOS) {
|
|
6050
6067
|
const webviewName = `WEBVIEW_${identifier}`;
|
|
6051
|
-
await
|
|
6068
|
+
await browser2.switchAppiumContext(webviewName);
|
|
6052
6069
|
}
|
|
6053
|
-
const switchFunction =
|
|
6054
|
-
const matchingContextId =
|
|
6070
|
+
const switchFunction = browser2.isIOS ? browser2.switchAppiumContext.bind(browser2) : browser2.switchToWindow.bind(browser2);
|
|
6071
|
+
const matchingContextId = browser2.isIOS ? matchingContext.id : matchingContext.webviewPageId;
|
|
6055
6072
|
return switchFunction(matchingContextId);
|
|
6056
6073
|
}
|
|
6057
6074
|
function findMatchingContext({
|
|
@@ -6219,9 +6236,9 @@ async function actionClick(element, options) {
|
|
|
6219
6236
|
if (!buttonValue.includes(button)) {
|
|
6220
6237
|
throw new Error("Button type not supported.");
|
|
6221
6238
|
}
|
|
6222
|
-
const
|
|
6239
|
+
const browser2 = getBrowserObject12(element);
|
|
6223
6240
|
if (x || y) {
|
|
6224
|
-
const { width, height } = await
|
|
6241
|
+
const { width, height } = await browser2.getElementRect(element.elementId);
|
|
6225
6242
|
if (x && x < -Math.floor(width / 2) || x && x > Math.floor(width / 2)) {
|
|
6226
6243
|
log22.warn("x would cause a out of bounds error as it goes outside of element");
|
|
6227
6244
|
}
|
|
@@ -6230,8 +6247,8 @@ async function actionClick(element, options) {
|
|
|
6230
6247
|
}
|
|
6231
6248
|
}
|
|
6232
6249
|
const clickNested = async () => {
|
|
6233
|
-
await
|
|
6234
|
-
parameters: { pointerType:
|
|
6250
|
+
await browser2.action("pointer", {
|
|
6251
|
+
parameters: { pointerType: browser2.isMobile ? "touch" : "mouse" }
|
|
6235
6252
|
}).move({ origin: element, x, y }).down({ button }).pause(duration).up({ button }).perform(skipRelease);
|
|
6236
6253
|
};
|
|
6237
6254
|
try {
|
|
@@ -6290,8 +6307,8 @@ async function custom$2(strategyName, ...strategyArguments) {
|
|
|
6290
6307
|
// src/commands/element/doubleClick.ts
|
|
6291
6308
|
import { getBrowserObject as getBrowserObject15 } from "@wdio/utils";
|
|
6292
6309
|
async function doubleClick() {
|
|
6293
|
-
const
|
|
6294
|
-
return
|
|
6310
|
+
const browser2 = getBrowserObject15(this);
|
|
6311
|
+
return browser2.action("pointer", { parameters: { pointerType: "mouse" } }).move({ origin: this }).down().up().pause(10).down().up().perform();
|
|
6295
6312
|
}
|
|
6296
6313
|
|
|
6297
6314
|
// src/commands/element/dragAndDrop.ts
|
|
@@ -6315,8 +6332,8 @@ async function dragAndDrop(target, options = {}) {
|
|
|
6315
6332
|
throw new Error('command dragAndDrop requires an WebdriverIO Element or and object with "x" and "y" variables as first parameter');
|
|
6316
6333
|
}
|
|
6317
6334
|
const ACTION_BUTTON = 0;
|
|
6318
|
-
const
|
|
6319
|
-
const defaultOptions = { duration:
|
|
6335
|
+
const browser2 = getBrowserObject16(this);
|
|
6336
|
+
const defaultOptions = { duration: browser2.isMobile ? 250 : 10 };
|
|
6320
6337
|
const { duration } = { ...defaultOptions, ...options };
|
|
6321
6338
|
const isMovingToElement = moveToElement.constructor.name === "Element";
|
|
6322
6339
|
const sourceRef = { [ELEMENT_KEY11]: this[ELEMENT_KEY11] };
|
|
@@ -6325,23 +6342,23 @@ async function dragAndDrop(target, options = {}) {
|
|
|
6325
6342
|
const targetOrigin = isMovingToElement ? targetRef : "pointer";
|
|
6326
6343
|
const targetX = isMovingToElement ? 0 : moveToCoordinates.x;
|
|
6327
6344
|
const targetY = isMovingToElement ? 0 : moveToCoordinates.y;
|
|
6328
|
-
return
|
|
6329
|
-
parameters: { pointerType:
|
|
6345
|
+
return browser2.action("pointer", {
|
|
6346
|
+
parameters: { pointerType: browser2.isMobile ? "touch" : "mouse" }
|
|
6330
6347
|
}).move({ duration: 0, origin, x: 0, y: 0 }).down({ button: ACTION_BUTTON }).pause(10).move({ duration, origin: targetOrigin, x: targetX, y: targetY }).up({ button: ACTION_BUTTON }).perform();
|
|
6331
6348
|
}
|
|
6332
6349
|
|
|
6333
6350
|
// src/commands/element/execute.ts
|
|
6334
6351
|
import { getBrowserObject as getBrowserObject17 } from "@wdio/utils";
|
|
6335
6352
|
async function execute2(script, ...args) {
|
|
6336
|
-
const
|
|
6337
|
-
return
|
|
6353
|
+
const browser2 = getBrowserObject17(this);
|
|
6354
|
+
return browser2.execute(script, this, ...args);
|
|
6338
6355
|
}
|
|
6339
6356
|
|
|
6340
6357
|
// src/commands/element/executeAsync.ts
|
|
6341
6358
|
import { getBrowserObject as getBrowserObject18 } from "@wdio/utils";
|
|
6342
6359
|
async function executeAsync2(script, ...args) {
|
|
6343
|
-
const
|
|
6344
|
-
return
|
|
6360
|
+
const browser2 = getBrowserObject18(this);
|
|
6361
|
+
return browser2.executeAsync(script, this, ...args);
|
|
6345
6362
|
}
|
|
6346
6363
|
|
|
6347
6364
|
// src/commands/element/getAttribute.ts
|
|
@@ -6415,9 +6432,9 @@ function mergeEqualSymmetricalValue(cssValues) {
|
|
|
6415
6432
|
return newCssValues.join(" ");
|
|
6416
6433
|
}
|
|
6417
6434
|
async function getPseudoElementCSSValue(elem, options) {
|
|
6418
|
-
const
|
|
6435
|
+
const browser2 = getBrowserObject19(elem);
|
|
6419
6436
|
const { cssProperty, pseudoElement } = options;
|
|
6420
|
-
const cssValue2 = await
|
|
6437
|
+
const cssValue2 = await browser2.execute(
|
|
6421
6438
|
(elem2, pseudoElement2, cssProperty2) => window.getComputedStyle(elem2, pseudoElement2)[cssProperty2],
|
|
6422
6439
|
elem,
|
|
6423
6440
|
pseudoElement,
|
|
@@ -6450,7 +6467,7 @@ import getHTMLShadowScript from "./scripts/getHTMLShadow.js";
|
|
|
6450
6467
|
var SHADOW_ID_ATTR_NAME = "data-wdio-shadow-id";
|
|
6451
6468
|
var SHADOW_ID_ATTR = `[${SHADOW_ID_ATTR_NAME}]`;
|
|
6452
6469
|
async function getHTML(options = {}) {
|
|
6453
|
-
const
|
|
6470
|
+
const browser2 = getBrowserObject20(this);
|
|
6454
6471
|
if (typeof options !== "object" && typeof options === "boolean") {
|
|
6455
6472
|
options = { includeSelectorTag: options };
|
|
6456
6473
|
} else if (typeof options !== "object") {
|
|
@@ -6464,7 +6481,7 @@ async function getHTML(options = {}) {
|
|
|
6464
6481
|
excludeElements: []
|
|
6465
6482
|
}, options);
|
|
6466
6483
|
const basicGetHTML = (elementId, includeSelectorTag2) => {
|
|
6467
|
-
return
|
|
6484
|
+
return browser2.execute(getHTMLScript, {
|
|
6468
6485
|
[ELEMENT_KEY12]: elementId,
|
|
6469
6486
|
// w3c compatible
|
|
6470
6487
|
ELEMENT: elementId
|
|
@@ -6480,12 +6497,12 @@ async function getHTML(options = {}) {
|
|
|
6480
6497
|
);
|
|
6481
6498
|
}
|
|
6482
6499
|
const { load } = await import("cheerio");
|
|
6483
|
-
const shadowRootManager = getShadowRootManager(
|
|
6484
|
-
const contextManager = getContextManager(
|
|
6500
|
+
const shadowRootManager = getShadowRootManager(browser2);
|
|
6501
|
+
const contextManager = getContextManager(browser2);
|
|
6485
6502
|
const context = await contextManager.getCurrentContext();
|
|
6486
6503
|
const shadowRootElementPairs = shadowRootManager.getShadowElementPairsByContextId(context, this.elementId);
|
|
6487
6504
|
const elementsWithShadowRootAndIdVerified = (await Promise.all(
|
|
6488
|
-
shadowRootElementPairs.map(([elemId, elem]) =>
|
|
6505
|
+
shadowRootElementPairs.map(([elemId, elem]) => browser2.execute((elem2) => elem2.tagName, { [ELEMENT_KEY12]: elemId }).then(
|
|
6489
6506
|
() => [elemId, elem],
|
|
6490
6507
|
() => void 0
|
|
6491
6508
|
))
|
|
@@ -6494,7 +6511,7 @@ async function getHTML(options = {}) {
|
|
|
6494
6511
|
{ [ELEMENT_KEY12]: elemId },
|
|
6495
6512
|
shadowId ? { [ELEMENT_KEY12]: shadowId } : void 0
|
|
6496
6513
|
]);
|
|
6497
|
-
const { html, shadowElementHTML } = await
|
|
6514
|
+
const { html, shadowElementHTML } = await browser2.execute(
|
|
6498
6515
|
getHTMLShadowScript,
|
|
6499
6516
|
{ [ELEMENT_KEY12]: this.elementId },
|
|
6500
6517
|
includeSelectorTag,
|
|
@@ -6604,8 +6621,8 @@ async function isClickable() {
|
|
|
6604
6621
|
if (this.isMobile && this.isNativeContext) {
|
|
6605
6622
|
throw new Error("Method not supported in mobile native environment. It is unlikely that you need to use this command.");
|
|
6606
6623
|
}
|
|
6607
|
-
const
|
|
6608
|
-
return
|
|
6624
|
+
const browser2 = getBrowserObject21(this);
|
|
6625
|
+
return browser2.execute(isElementClickableScript, {
|
|
6609
6626
|
[ELEMENT_KEY13]: this.elementId,
|
|
6610
6627
|
// w3c compatible
|
|
6611
6628
|
ELEMENT: this.elementId
|
|
@@ -6618,12 +6635,12 @@ import { getBrowserObject as getBrowserObject22 } from "@wdio/utils";
|
|
|
6618
6635
|
import isElementDisplayedLegacyScript from "./scripts/isElementDisplayed.js";
|
|
6619
6636
|
import isElementInViewportScript from "./scripts/isElementInViewport.js";
|
|
6620
6637
|
async function isDisplayed(commandParams = DEFAULT_PARAMS) {
|
|
6621
|
-
const
|
|
6638
|
+
const browser2 = getBrowserObject22(this);
|
|
6622
6639
|
if (!await hasElementId(this)) {
|
|
6623
6640
|
return false;
|
|
6624
6641
|
}
|
|
6625
|
-
const isNativeApplication = !
|
|
6626
|
-
if (
|
|
6642
|
+
const isNativeApplication = !browser2.capabilities.browserName;
|
|
6643
|
+
if (browser2.isMobile && isNativeApplication) {
|
|
6627
6644
|
if (commandParams?.withinViewport) {
|
|
6628
6645
|
throw new Error(
|
|
6629
6646
|
"Cannot determine element visibility within viewport for native mobile apps as it is not feasible to determine full vertical and horizontal application bounds. In most cases a basic visibility check should suffice."
|
|
@@ -6633,12 +6650,12 @@ async function isDisplayed(commandParams = DEFAULT_PARAMS) {
|
|
|
6633
6650
|
}
|
|
6634
6651
|
let hadToFallback = false;
|
|
6635
6652
|
const [isDisplayed2, displayProperty] = await Promise.all([
|
|
6636
|
-
|
|
6653
|
+
browser2.execute(function checkVisibility(elem, params) {
|
|
6637
6654
|
return elem.checkVisibility(params);
|
|
6638
6655
|
}, this, commandParams).catch((err) => {
|
|
6639
6656
|
if (err.message.includes("checkVisibility is not a function")) {
|
|
6640
6657
|
hadToFallback = true;
|
|
6641
|
-
return
|
|
6658
|
+
return browser2.execute(isElementDisplayedLegacyScript, this);
|
|
6642
6659
|
}
|
|
6643
6660
|
throw err;
|
|
6644
6661
|
}),
|
|
@@ -6649,9 +6666,9 @@ async function isDisplayed(commandParams = DEFAULT_PARAMS) {
|
|
|
6649
6666
|
]);
|
|
6650
6667
|
const hasDisplayContentsCSSProperty = displayProperty.value === "contents";
|
|
6651
6668
|
const shouldRecheckContentVisibility = !hadToFallback && hasDisplayContentsCSSProperty;
|
|
6652
|
-
const finalResponse = shouldRecheckContentVisibility ? await
|
|
6669
|
+
const finalResponse = shouldRecheckContentVisibility ? await browser2.execute(isElementDisplayedLegacyScript, this).catch(() => false) : isDisplayed2;
|
|
6653
6670
|
if (finalResponse && commandParams?.withinViewport) {
|
|
6654
|
-
return
|
|
6671
|
+
return browser2.execute(isElementInViewportScript, this);
|
|
6655
6672
|
}
|
|
6656
6673
|
return finalResponse;
|
|
6657
6674
|
}
|
|
@@ -6677,9 +6694,9 @@ var getWebElement = (el) => ({
|
|
|
6677
6694
|
// jsonwp compatible
|
|
6678
6695
|
});
|
|
6679
6696
|
async function isEqual(el) {
|
|
6680
|
-
const
|
|
6681
|
-
if (
|
|
6682
|
-
const context = await
|
|
6697
|
+
const browser2 = getBrowserObject23(this);
|
|
6698
|
+
if (browser2.isMobile) {
|
|
6699
|
+
const context = await browser2.getContext().catch(() => void 0);
|
|
6683
6700
|
const contextId = typeof context === "string" ? context : context?.id;
|
|
6684
6701
|
if (contextId && contextId.toLowerCase().includes("native")) {
|
|
6685
6702
|
return this.elementId === el.elementId;
|
|
@@ -6687,7 +6704,7 @@ async function isEqual(el) {
|
|
|
6687
6704
|
}
|
|
6688
6705
|
let result;
|
|
6689
6706
|
try {
|
|
6690
|
-
result = await
|
|
6707
|
+
result = await browser2.execute(
|
|
6691
6708
|
/* istanbul ignore next */
|
|
6692
6709
|
function(el1, el2) {
|
|
6693
6710
|
return el1 === el2;
|
|
@@ -6718,8 +6735,8 @@ import { ELEMENT_KEY as ELEMENT_KEY15 } from "webdriver";
|
|
|
6718
6735
|
import { getBrowserObject as getBrowserObject24 } from "@wdio/utils";
|
|
6719
6736
|
import isFocusedScript from "./scripts/isFocused.js";
|
|
6720
6737
|
async function isFocused() {
|
|
6721
|
-
const
|
|
6722
|
-
return
|
|
6738
|
+
const browser2 = await getBrowserObject24(this);
|
|
6739
|
+
return browser2.execute(isFocusedScript, {
|
|
6723
6740
|
[ELEMENT_KEY15]: this.elementId,
|
|
6724
6741
|
// w3c compatible
|
|
6725
6742
|
ELEMENT: this.elementId
|
|
@@ -6737,8 +6754,8 @@ import { ELEMENT_KEY as ELEMENT_KEY16 } from "webdriver";
|
|
|
6737
6754
|
import { getBrowserObject as getBrowserObject25 } from "@wdio/utils";
|
|
6738
6755
|
import isElementStable from "./scripts/isElementStable.js";
|
|
6739
6756
|
async function isStable() {
|
|
6740
|
-
const
|
|
6741
|
-
return await
|
|
6757
|
+
const browser2 = getBrowserObject25(this);
|
|
6758
|
+
return await browser2.executeAsync(isElementStable, {
|
|
6742
6759
|
[ELEMENT_KEY16]: this.elementId,
|
|
6743
6760
|
// w3c compatible
|
|
6744
6761
|
ELEMENT: this.elementId
|
|
@@ -6751,9 +6768,9 @@ import logger23 from "@wdio/logger";
|
|
|
6751
6768
|
import { getBrowserObject as getBrowserObject26 } from "@wdio/utils";
|
|
6752
6769
|
var log23 = logger23("webdriver");
|
|
6753
6770
|
async function moveTo({ xOffset, yOffset } = {}) {
|
|
6754
|
-
const
|
|
6771
|
+
const browser2 = getBrowserObject26(this);
|
|
6755
6772
|
if (xOffset || yOffset) {
|
|
6756
|
-
const { width, height } = await
|
|
6773
|
+
const { width, height } = await browser2.getElementRect(this.elementId);
|
|
6757
6774
|
if (xOffset && xOffset < -Math.floor(width / 2) || xOffset && xOffset > Math.floor(width / 2)) {
|
|
6758
6775
|
log23.warn("xOffset would cause a out of bounds error as it goes outside of element");
|
|
6759
6776
|
}
|
|
@@ -6762,7 +6779,7 @@ async function moveTo({ xOffset, yOffset } = {}) {
|
|
|
6762
6779
|
}
|
|
6763
6780
|
}
|
|
6764
6781
|
const moveToNested = async () => {
|
|
6765
|
-
await
|
|
6782
|
+
await browser2.action("pointer", { parameters: { pointerType: "mouse" } }).move({ origin: this, x: xOffset || 0, y: yOffset || 0 }).perform();
|
|
6766
6783
|
};
|
|
6767
6784
|
try {
|
|
6768
6785
|
await moveToNested();
|
|
@@ -6806,10 +6823,10 @@ function previousElement() {
|
|
|
6806
6823
|
import { getBrowserObject as getBrowserObject27 } from "@wdio/utils";
|
|
6807
6824
|
import { waitToLoadReact as waitToLoadReact3, react$$ as react$$Script2 } from "./scripts/resq.js";
|
|
6808
6825
|
async function react$$2(selector, { props = {}, state = {} } = {}) {
|
|
6809
|
-
const
|
|
6826
|
+
const browser2 = await getBrowserObject27(this);
|
|
6810
6827
|
await this.executeScript(resqScript.toString(), []);
|
|
6811
|
-
await
|
|
6812
|
-
const res = await
|
|
6828
|
+
await browser2.execute(waitToLoadReact3);
|
|
6829
|
+
const res = await browser2.execute(
|
|
6813
6830
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6814
6831
|
react$$Script2,
|
|
6815
6832
|
selector,
|
|
@@ -6825,10 +6842,10 @@ async function react$$2(selector, { props = {}, state = {} } = {}) {
|
|
|
6825
6842
|
import { getBrowserObject as getBrowserObject28 } from "@wdio/utils";
|
|
6826
6843
|
import { waitToLoadReact as waitToLoadReact4, react$ as react$Script2 } from "./scripts/resq.js";
|
|
6827
6844
|
async function react$2(selector, { props = {}, state = {} } = {}) {
|
|
6828
|
-
const
|
|
6845
|
+
const browser2 = await getBrowserObject28(this);
|
|
6829
6846
|
await this.executeScript(resqScript.toString(), []);
|
|
6830
|
-
await
|
|
6831
|
-
const res = await
|
|
6847
|
+
await browser2.execute(waitToLoadReact4);
|
|
6848
|
+
const res = await browser2.execute(
|
|
6832
6849
|
react$Script2,
|
|
6833
6850
|
selector,
|
|
6834
6851
|
props,
|
|
@@ -6849,11 +6866,11 @@ import { ELEMENT_KEY as ELEMENT_KEY17 } from "webdriver";
|
|
|
6849
6866
|
import { getBrowserObject as getBrowserObject29 } from "@wdio/utils";
|
|
6850
6867
|
var log24 = logger24("webdriverio");
|
|
6851
6868
|
async function scrollIntoView(options = { block: "start", inline: "nearest" }) {
|
|
6852
|
-
const
|
|
6853
|
-
if (
|
|
6854
|
-
if (await
|
|
6869
|
+
const browser2 = getBrowserObject29(this);
|
|
6870
|
+
if (browser2.isMobile) {
|
|
6871
|
+
if (await browser2.isNativeContext) {
|
|
6855
6872
|
return nativeMobileScrollIntoView({
|
|
6856
|
-
browser,
|
|
6873
|
+
browser: browser2,
|
|
6857
6874
|
element: this,
|
|
6858
6875
|
options: options || {}
|
|
6859
6876
|
});
|
|
@@ -6861,9 +6878,9 @@ async function scrollIntoView(options = { block: "start", inline: "nearest" }) {
|
|
|
6861
6878
|
return scrollIntoViewWeb.call(this, options);
|
|
6862
6879
|
}
|
|
6863
6880
|
try {
|
|
6864
|
-
const elemRect = await
|
|
6865
|
-
const viewport = await
|
|
6866
|
-
let [scrollX, scrollY] = await
|
|
6881
|
+
const elemRect = await browser2.getElementRect(this.elementId);
|
|
6882
|
+
const viewport = await browser2.getWindowSize();
|
|
6883
|
+
let [scrollX, scrollY] = await browser2.execute(() => [
|
|
6867
6884
|
window.scrollX,
|
|
6868
6885
|
window.scrollY
|
|
6869
6886
|
]);
|
|
@@ -6898,7 +6915,7 @@ async function scrollIntoView(options = { block: "start", inline: "nearest" }) {
|
|
|
6898
6915
|
}
|
|
6899
6916
|
deltaX = Math.round(deltaX - scrollX);
|
|
6900
6917
|
deltaY = Math.round(deltaY - scrollY);
|
|
6901
|
-
await
|
|
6918
|
+
await browser2.action("wheel").scroll({ duration: 0, x: deltaX, y: deltaY, origin: this }).perform();
|
|
6902
6919
|
} catch (err) {
|
|
6903
6920
|
log24.warn(
|
|
6904
6921
|
`Failed to execute "scrollIntoView" using WebDriver Actions API: ${err.message}!
|
|
@@ -6908,7 +6925,7 @@ Re-attempting using \`Element.scrollIntoView\` via Web API.`
|
|
|
6908
6925
|
}
|
|
6909
6926
|
}
|
|
6910
6927
|
async function mobileScrollUntilVisible({
|
|
6911
|
-
browser,
|
|
6928
|
+
browser: browser2,
|
|
6912
6929
|
direction,
|
|
6913
6930
|
duration,
|
|
6914
6931
|
element,
|
|
@@ -6928,7 +6945,7 @@ async function mobileScrollUntilVisible({
|
|
|
6928
6945
|
if (isVisible) {
|
|
6929
6946
|
break;
|
|
6930
6947
|
}
|
|
6931
|
-
await
|
|
6948
|
+
await browser2.swipe({
|
|
6932
6949
|
direction,
|
|
6933
6950
|
...duration ? { duration } : {},
|
|
6934
6951
|
...percent ? { percent } : {},
|
|
@@ -6940,7 +6957,7 @@ async function mobileScrollUntilVisible({
|
|
|
6940
6957
|
return { hasScrolled, isVisible };
|
|
6941
6958
|
}
|
|
6942
6959
|
async function nativeMobileScrollIntoView({
|
|
6943
|
-
browser,
|
|
6960
|
+
browser: browser2,
|
|
6944
6961
|
element,
|
|
6945
6962
|
options
|
|
6946
6963
|
}) {
|
|
@@ -6953,7 +6970,7 @@ async function nativeMobileScrollIntoView({
|
|
|
6953
6970
|
...options || {}
|
|
6954
6971
|
};
|
|
6955
6972
|
const { hasScrolled, isVisible } = await mobileScrollUntilVisible({
|
|
6956
|
-
browser,
|
|
6973
|
+
browser: browser2,
|
|
6957
6974
|
element,
|
|
6958
6975
|
maxScrolls: mobileOptions.maxScrolls,
|
|
6959
6976
|
direction: mobileOptions.direction,
|
|
@@ -6962,7 +6979,7 @@ async function nativeMobileScrollIntoView({
|
|
|
6962
6979
|
...mobileOptions?.scrollableElement ? { scrollableElement: mobileOptions.scrollableElement } : {}
|
|
6963
6980
|
});
|
|
6964
6981
|
if (hasScrolled && isVisible) {
|
|
6965
|
-
return
|
|
6982
|
+
return browser2.pause(1e3);
|
|
6966
6983
|
} else if (isVisible) {
|
|
6967
6984
|
return;
|
|
6968
6985
|
}
|
|
@@ -6976,8 +6993,8 @@ await elem.scrollIntoView({
|
|
|
6976
6993
|
`);
|
|
6977
6994
|
}
|
|
6978
6995
|
function scrollIntoViewWeb(options = { block: "start", inline: "nearest" }) {
|
|
6979
|
-
const
|
|
6980
|
-
return
|
|
6996
|
+
const browser2 = getBrowserObject29(this);
|
|
6997
|
+
return browser2.execute(
|
|
6981
6998
|
(elem, options2) => elem.scrollIntoView(options2),
|
|
6982
6999
|
{
|
|
6983
7000
|
[ELEMENT_KEY17]: this.elementId,
|
|
@@ -7375,11 +7392,11 @@ var createRoleBaseXpathSelector = (role) => {
|
|
|
7375
7392
|
// src/commands/element/shadow$$.ts
|
|
7376
7393
|
var log25 = logger25("webdriverio");
|
|
7377
7394
|
async function shadow$$(selector) {
|
|
7378
|
-
const
|
|
7395
|
+
const browser2 = getBrowserObject30(this);
|
|
7379
7396
|
try {
|
|
7380
|
-
const shadowRoot = await
|
|
7397
|
+
const shadowRoot = await browser2.getElementShadowRoot(this.elementId);
|
|
7381
7398
|
const { using, value } = findStrategy(selector, this.isW3C, this.isMobile);
|
|
7382
|
-
const res = await
|
|
7399
|
+
const res = await browser2.findElementsFromShadowRoot(shadowRoot[SHADOW_ELEMENT_KEY], using, value);
|
|
7383
7400
|
const elements = await getElements.call(this, selector, res, { isShadowElement: true });
|
|
7384
7401
|
return enhanceElementsArray(elements, this, selector);
|
|
7385
7402
|
} catch (err) {
|
|
@@ -7398,11 +7415,11 @@ import { shadowFnFactory as shadowFnFactory2 } from "./scripts/shadowFnFactory.j
|
|
|
7398
7415
|
import { getBrowserObject as getBrowserObject31 } from "@wdio/utils";
|
|
7399
7416
|
var log26 = logger26("webdriverio");
|
|
7400
7417
|
async function shadow$(selector) {
|
|
7401
|
-
const
|
|
7418
|
+
const browser2 = getBrowserObject31(this);
|
|
7402
7419
|
try {
|
|
7403
|
-
const shadowRoot = await
|
|
7420
|
+
const shadowRoot = await browser2.getElementShadowRoot(this.elementId);
|
|
7404
7421
|
const { using, value } = findStrategy(selector, this.isW3C, this.isMobile);
|
|
7405
|
-
const res = await
|
|
7422
|
+
const res = await browser2.findElementFromShadowRoot(shadowRoot[SHADOW_ELEMENT_KEY2], using, value);
|
|
7406
7423
|
return getElement.call(this, selector, res, { isShadowElement: true });
|
|
7407
7424
|
} catch (err) {
|
|
7408
7425
|
log26.warn(
|
|
@@ -7510,8 +7527,8 @@ var waitUntil2 = waitUntil;
|
|
|
7510
7527
|
// src/commands/mobile/longPress.ts
|
|
7511
7528
|
import { getBrowserObject as getBrowserObject32 } from "@wdio/utils";
|
|
7512
7529
|
function longPress(options) {
|
|
7513
|
-
const
|
|
7514
|
-
if (!
|
|
7530
|
+
const browser2 = getBrowserObject32(this);
|
|
7531
|
+
if (!browser2.isMobile) {
|
|
7515
7532
|
throw new Error("The longPress command is only available for mobile platforms.");
|
|
7516
7533
|
}
|
|
7517
7534
|
if (typeof options !== "undefined" && (typeof options !== "object" || Array.isArray(options))) {
|
|
@@ -7529,12 +7546,12 @@ function longPress(options) {
|
|
|
7529
7546
|
// src/commands/mobile/pinch.ts
|
|
7530
7547
|
import { getBrowserObject as getBrowserObject33 } from "@wdio/utils";
|
|
7531
7548
|
async function pinch(options = {}) {
|
|
7532
|
-
const
|
|
7533
|
-
if (!
|
|
7549
|
+
const browser2 = getBrowserObject33(this);
|
|
7550
|
+
if (!browser2.isMobile) {
|
|
7534
7551
|
throw new Error("The pinch command is only available for mobile platforms.");
|
|
7535
7552
|
}
|
|
7536
|
-
const { duration, scale } = validatePinchAndZoomOptions({ browser, gesture: "pinch", options });
|
|
7537
|
-
const gestureConfig =
|
|
7553
|
+
const { duration, scale } = validatePinchAndZoomOptions({ browser: browser2, gesture: "pinch", options });
|
|
7554
|
+
const gestureConfig = browser2.isIOS ? {
|
|
7538
7555
|
elementId: await this.elementId,
|
|
7539
7556
|
scale,
|
|
7540
7557
|
velocity: -Math.abs(duration)
|
|
@@ -7542,29 +7559,29 @@ async function pinch(options = {}) {
|
|
|
7542
7559
|
} : {
|
|
7543
7560
|
elementId: await this.elementId,
|
|
7544
7561
|
percent: scale,
|
|
7545
|
-
speed: calculateAndroidPinchAndZoomSpeed({ browser, duration, scale })
|
|
7562
|
+
speed: calculateAndroidPinchAndZoomSpeed({ browser: browser2, duration, scale })
|
|
7546
7563
|
};
|
|
7547
|
-
return
|
|
7564
|
+
return browser2.execute(browser2.isIOS ? "mobile: pinch" : "mobile: pinchCloseGesture", gestureConfig);
|
|
7548
7565
|
}
|
|
7549
7566
|
|
|
7550
7567
|
// src/commands/mobile/zoom.ts
|
|
7551
7568
|
import { getBrowserObject as getBrowserObject34 } from "@wdio/utils";
|
|
7552
7569
|
async function zoom(options = {}) {
|
|
7553
|
-
const
|
|
7554
|
-
if (!
|
|
7570
|
+
const browser2 = getBrowserObject34(this);
|
|
7571
|
+
if (!browser2.isMobile) {
|
|
7555
7572
|
throw new Error("The zoom command is only available for mobile platforms.");
|
|
7556
7573
|
}
|
|
7557
|
-
const { duration, scale } = validatePinchAndZoomOptions({ browser, gesture: "zoom", options });
|
|
7558
|
-
const gestureConfig =
|
|
7574
|
+
const { duration, scale } = validatePinchAndZoomOptions({ browser: browser2, gesture: "zoom", options });
|
|
7575
|
+
const gestureConfig = browser2.isIOS ? {
|
|
7559
7576
|
elementId: await this.elementId,
|
|
7560
7577
|
scale,
|
|
7561
7578
|
velocity: duration
|
|
7562
7579
|
} : {
|
|
7563
7580
|
elementId: await this.elementId,
|
|
7564
7581
|
percent: scale,
|
|
7565
|
-
speed: calculateAndroidPinchAndZoomSpeed({ browser, duration, scale })
|
|
7582
|
+
speed: calculateAndroidPinchAndZoomSpeed({ browser: browser2, duration, scale })
|
|
7566
7583
|
};
|
|
7567
|
-
return
|
|
7584
|
+
return browser2.execute(browser2.isIOS ? "mobile: pinch" : "mobile: pinchOpenGesture", gestureConfig);
|
|
7568
7585
|
}
|
|
7569
7586
|
|
|
7570
7587
|
// src/utils/index.ts
|
|
@@ -7904,9 +7921,9 @@ function transformClassicToBidiSelector(using, value) {
|
|
|
7904
7921
|
throw new Error(`Can't transform classic selector ${using} to Bidi selector`);
|
|
7905
7922
|
}
|
|
7906
7923
|
async function findDeepElement(selector) {
|
|
7907
|
-
const
|
|
7908
|
-
const shadowRootManager = getShadowRootManager(
|
|
7909
|
-
const contextManager = getContextManager(
|
|
7924
|
+
const browser2 = getBrowserObject35(this);
|
|
7925
|
+
const shadowRootManager = getShadowRootManager(browser2);
|
|
7926
|
+
const contextManager = getContextManager(browser2);
|
|
7910
7927
|
const context = await contextManager.getCurrentContext();
|
|
7911
7928
|
const shadowRoots = shadowRootManager.getShadowElementsByContextId(
|
|
7912
7929
|
context,
|
|
@@ -7915,7 +7932,7 @@ async function findDeepElement(selector) {
|
|
|
7915
7932
|
const { using, value } = findStrategy(selector, this.isW3C, this.isMobile);
|
|
7916
7933
|
const locator = transformClassicToBidiSelector(using, value);
|
|
7917
7934
|
const startNodes = shadowRoots.length > 0 ? shadowRoots.map((shadowRootNodeId) => ({ sharedId: shadowRootNodeId })) : this.elementId ? [{ sharedId: this.elementId }] : void 0;
|
|
7918
|
-
const deepElementResult = await
|
|
7935
|
+
const deepElementResult = await browser2.browsingContextLocateNodes({ locator, context, startNodes }).then(async (result) => {
|
|
7919
7936
|
const nodes = result.nodes.filter((node) => Boolean(node.sharedId)).map((node) => ({
|
|
7920
7937
|
[ELEMENT_KEY18]: node.sharedId,
|
|
7921
7938
|
locator
|
|
@@ -7924,7 +7941,7 @@ async function findDeepElement(selector) {
|
|
|
7924
7941
|
return nodes[0];
|
|
7925
7942
|
}
|
|
7926
7943
|
const scopedNodes = await Promise.all(nodes.map(async (node) => {
|
|
7927
|
-
const isIn = await
|
|
7944
|
+
const isIn = await browser2.execute(
|
|
7928
7945
|
elementContains,
|
|
7929
7946
|
{ [ELEMENT_KEY18]: this.elementId },
|
|
7930
7947
|
node
|
|
@@ -7934,7 +7951,7 @@ async function findDeepElement(selector) {
|
|
|
7934
7951
|
return scopedNodes[0];
|
|
7935
7952
|
}, (err) => {
|
|
7936
7953
|
log27.warn(`Failed to execute browser.browsingContextLocateNodes({ ... }) due to ${err}, falling back to regular WebDriver Classic command`);
|
|
7937
|
-
return this && "elementId" in this && this.elementId ? this.findElementFromElement(this.elementId, using, value) :
|
|
7954
|
+
return this && "elementId" in this && this.elementId ? this.findElementFromElement(this.elementId, using, value) : browser2.findElement(using, value);
|
|
7938
7955
|
});
|
|
7939
7956
|
if (!deepElementResult) {
|
|
7940
7957
|
return new Error(`Couldn't find element with selector "${selector}"`);
|
|
@@ -7942,9 +7959,9 @@ async function findDeepElement(selector) {
|
|
|
7942
7959
|
return deepElementResult;
|
|
7943
7960
|
}
|
|
7944
7961
|
async function findDeepElements(selector) {
|
|
7945
|
-
const
|
|
7946
|
-
const shadowRootManager = getShadowRootManager(
|
|
7947
|
-
const contextManager = getContextManager(
|
|
7962
|
+
const browser2 = getBrowserObject35(this);
|
|
7963
|
+
const shadowRootManager = getShadowRootManager(browser2);
|
|
7964
|
+
const contextManager = getContextManager(browser2);
|
|
7948
7965
|
const context = await contextManager.getCurrentContext();
|
|
7949
7966
|
const shadowRoots = shadowRootManager.getShadowElementsByContextId(
|
|
7950
7967
|
context,
|
|
@@ -7953,7 +7970,7 @@ async function findDeepElements(selector) {
|
|
|
7953
7970
|
const { using, value } = findStrategy(selector, this.isW3C, this.isMobile);
|
|
7954
7971
|
const locator = transformClassicToBidiSelector(using, value);
|
|
7955
7972
|
const startNodes = shadowRoots.length > 0 ? shadowRoots.map((shadowRootNodeId) => ({ sharedId: shadowRootNodeId })) : this.elementId ? [{ sharedId: this.elementId }] : void 0;
|
|
7956
|
-
const deepElementResult = await
|
|
7973
|
+
const deepElementResult = await browser2.browsingContextLocateNodes({ locator, context, startNodes }).then(async (result) => {
|
|
7957
7974
|
const nodes = result.nodes.filter((node) => Boolean(node.sharedId)).map((node) => ({
|
|
7958
7975
|
[ELEMENT_KEY18]: node.sharedId,
|
|
7959
7976
|
locator
|
|
@@ -7962,7 +7979,7 @@ async function findDeepElements(selector) {
|
|
|
7962
7979
|
return nodes;
|
|
7963
7980
|
}
|
|
7964
7981
|
const scopedNodes = await Promise.all(nodes.map(async (node) => {
|
|
7965
|
-
const isIn = await
|
|
7982
|
+
const isIn = await browser2.execute(
|
|
7966
7983
|
elementContains,
|
|
7967
7984
|
{ [ELEMENT_KEY18]: this.elementId },
|
|
7968
7985
|
node
|
|
@@ -7972,7 +7989,7 @@ async function findDeepElements(selector) {
|
|
|
7972
7989
|
return scopedNodes;
|
|
7973
7990
|
}, (err) => {
|
|
7974
7991
|
log27.warn(`Failed to execute browser.browsingContextLocateNodes({ ... }) due to ${err}, falling back to regular WebDriver Classic command`);
|
|
7975
|
-
return this && "elementId" in this && this.elementId ? this.findElementsFromElement(this.elementId, using, value) :
|
|
7992
|
+
return this && "elementId" in this && this.elementId ? this.findElementsFromElement(this.elementId, using, value) : browser2.findElements(using, value);
|
|
7976
7993
|
});
|
|
7977
7994
|
return deepElementResult;
|
|
7978
7995
|
}
|
|
@@ -8472,7 +8489,7 @@ var NOOP2 = () => {
|
|
|
8472
8489
|
var ProtocolStub = class {
|
|
8473
8490
|
static async newSession(options) {
|
|
8474
8491
|
const capabilities = emulateSessionCapabilities(options.capabilities);
|
|
8475
|
-
const
|
|
8492
|
+
const browser2 = {
|
|
8476
8493
|
options,
|
|
8477
8494
|
capabilities,
|
|
8478
8495
|
requestedCapabilities: capabilities,
|
|
@@ -8488,9 +8505,9 @@ var ProtocolStub = class {
|
|
|
8488
8505
|
overwriteCommand: NOOP2,
|
|
8489
8506
|
...capabilitiesEnvironmentDetector(capabilities)
|
|
8490
8507
|
};
|
|
8491
|
-
|
|
8492
|
-
|
|
8493
|
-
return
|
|
8508
|
+
browser2.addCommand = (...args) => browser2.customCommands.push(args);
|
|
8509
|
+
browser2.overwriteCommand = (...args) => browser2.overwrittenCommands.push(args);
|
|
8510
|
+
return browser2;
|
|
8494
8511
|
}
|
|
8495
8512
|
/**
|
|
8496
8513
|
* added just in case user wants to somehow reload webdriver before it was started.
|