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