webdriverio
Version:
Next-gen browser and mobile automation test framework for Node.js
1,023 lines (998 loc) • 414 kB
JavaScript
var __defProp = Object.defineProperty;
var __typeError = (msg) => {
throw TypeError(msg);
};
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
var __privateWrapper = (obj, member, setter, getter) => ({
set _(value) {
__privateSet(obj, member, value, setter);
},
get _() {
return __privateGet(obj, member, getter);
}
});
// src/index.ts
import logger27 from "@wdio/logger";
import WebDriver, { DEFAULTS } from "webdriver";
import { validateConfig } from "@wdio/config";
import { enableFileLogging, wrapCommand as wrapCommand3, isBidi } from "@wdio/utils";
// src/multiremote.ts
import zip from "lodash.zip";
import clone2 from "lodash.clonedeep";
import { webdriverMonad as webdriverMonad2, wrapCommand as wrapCommand2 } from "@wdio/utils";
// src/middlewares.ts
import { ELEMENT_KEY as ELEMENT_KEY21 } from "webdriver";
import { getBrowserObject as getBrowserObject36 } from "@wdio/utils";
// src/utils/implicitWait.ts
import logger from "@wdio/logger";
import { getBrowserObject } from "@wdio/utils";
var log = logger("webdriverio");
async function implicitWait(currentElement, commandName) {
const browser2 = getBrowserObject(currentElement);
const skipForMobileScroll = browser2.isMobile && await browser2.isNativeContext && (commandName === "scrollIntoView" || commandName === "tap");
if (!currentElement.elementId && !/(waitUntil|waitFor|isExisting|is?\w+Displayed|is?\w+Clickable)/.test(commandName) && !skipForMobileScroll) {
log.debug(
"command ".concat(commandName, ' was called on an element ("').concat(currentElement.selector, '") ') + "that wasn't found, waiting for it..."
);
try {
await currentElement.waitForExist();
return currentElement.parent.$(currentElement.selector).getElement();
} catch {
if (currentElement.selector.toString().includes("this.previousElementSibling")) {
throw new Error(
"Can't call ".concat(commandName, ' on previous element of element with selector "').concat(currentElement.parent.selector, "\" because sibling wasn't found")
);
}
if (currentElement.selector.toString().includes("this.nextElementSibling")) {
throw new Error(
"Can't call ".concat(commandName, ' on next element of element with selector "').concat(currentElement.parent.selector, "\" because sibling wasn't found")
);
}
if (currentElement.selector.toString().includes("this.parentElement")) {
throw new Error(
"Can't call ".concat(commandName, ' on parent element of element with selector "').concat(currentElement.parent.selector, "\" because it wasn't found")
);
}
throw new Error(
"Can't call ".concat(commandName, ' on element with selector "').concat(currentElement.selector, "\" because element wasn't found")
);
}
}
return currentElement;
}
// src/utils/refetchElement.ts
async function refetchElement(currentElement, commandName) {
const selectors = [];
while (currentElement.elementId && currentElement.parent) {
selectors.push({ selector: currentElement.selector, index: currentElement.index || 0 });
currentElement = currentElement.parent;
}
selectors.reverse();
const length = selectors.length;
return selectors.reduce(async (elementPromise, { selector, index }, currentIndex) => {
var _a;
const resolvedElement = await elementPromise;
let nextElement2 = index > 0 ? await ((_a = resolvedElement.$$(selector)[index]) == null ? void 0 : _a.getElement()) : null;
nextElement2 = nextElement2 || await resolvedElement.$(selector).getElement();
return await implicitWait(nextElement2, currentIndex + 1 < length ? "$" : commandName);
}, Promise.resolve(currentElement));
}
// src/utils/index.ts
import cssValue from "css-value";
import rgb2hex from "rgb2hex";
import GraphemeSplitter from "grapheme-splitter";
import logger26 from "@wdio/logger";
import isPlainObject from "is-plain-obj";
import { ELEMENT_KEY as ELEMENT_KEY20 } from "webdriver";
import { UNICODE_CHARACTERS as UNICODE_CHARACTERS2, asyncIterators, getBrowserObject as getBrowserObject35 } from "@wdio/utils";
// src/commands/browser.ts
var browser_exports = {};
__export(browser_exports, {
$: () => $,
$$: () => $$,
SESSION_MOCKS: () => SESSION_MOCKS,
action: () => action,
actions: () => actions,
addInitScript: () => addInitScript,
call: () => call,
custom$: () => custom$,
custom$$: () => custom$$,
debug: () => debug,
deepLink: () => deepLink,
deleteCookies: () => deleteCookies,
downloadFile: () => downloadFile,
emulate: () => emulate,
execute: () => execute,
executeAsync: () => executeAsync,
getContext: () => getContext,
getContexts: () => getContexts,
getCookies: () => getCookies,
getPuppeteer: () => getPuppeteer,
getWindowSize: () => getWindowSize,
keys: () => keys,
mock: () => mock,
mockClearAll: () => mockClearAll,
mockRestoreAll: () => mockRestoreAll,
newWindow: () => newWindow2,
pause: () => pause,
react$: () => react$3,
react$$: () => react$$3,
relaunchActiveApp: () => relaunchActiveApp,
reloadSession: () => reloadSession,
restore: () => restore,
savePDF: () => savePDF,
saveRecordingScreen: () => saveRecordingScreen,
saveScreenshot: () => saveScreenshot,
scroll: () => scroll,
setCookies: () => setCookies,
setTimeout: () => setTimeout2,
setViewport: () => setViewport,
setWindowSize: () => setWindowSize,
swipe: () => swipe,
switchContext: () => switchContext,
switchFrame: () => switchFrame,
switchWindow: () => switchWindow,
tap: () => tap,
throttle: () => throttle,
throttleCPU: () => throttleCPU,
throttleNetwork: () => throttleNetwork,
touchAction: () => touchAction2,
uploadFile: () => uploadFile,
url: () => url,
waitUntil: () => waitUntil
});
// src/utils/getElementObject.ts
import { webdriverMonad, wrapCommand } from "@wdio/utils";
import clone from "lodash.clonedeep";
import { ELEMENT_KEY } from "webdriver";
import { getBrowserObject as getBrowserObject2 } from "@wdio/utils";
var WebDriverError = class extends Error {
constructor(obj) {
const { name, stack } = obj;
const { error, stacktrace } = obj;
super(error || name || "");
Object.assign(this, {
message: obj.message,
stack: stacktrace || stack
});
}
};
function getElement(selector, res, props = { isReactElement: false, isShadowElement: false }) {
const browser2 = getBrowserObject2(this);
const browserCommandKeys = Object.keys(browser_exports);
const propertiesObject = {
/**
* filter out browser commands from object
*/
...Object.entries(clone(browser2.__propertiesObject__)).reduce((commands, [name, descriptor]) => {
if (!browserCommandKeys.includes(name)) {
commands[name] = descriptor;
}
return commands;
}, {}),
...getPrototype("element"),
scope: { value: "element" }
};
propertiesObject.emit = { value: this.emit.bind(this) };
const element = webdriverMonad(this.options, (client) => {
const elementId = getElementFromResponse(res);
if (elementId) {
client.elementId = elementId;
client[ELEMENT_KEY] = elementId;
if (res && this.isBidi && "locator" in res) {
client.locator = res.locator;
}
} else {
client.error = res;
}
if (selector) {
client.selector = selector;
}
client.parent = this;
client.isReactElement = props.isReactElement;
client.isShadowElement = props.isShadowElement;
return client;
}, propertiesObject);
const elementInstance = element(this.sessionId, elementErrorHandler(wrapCommand));
const origAddCommand = elementInstance.addCommand.bind(elementInstance);
elementInstance.addCommand = (name, fn) => {
browser2.__propertiesObject__[name] = { value: fn };
origAddCommand(name, fn);
};
return elementInstance;
}
var getElements = function getElements2(selector, elemResponse, props = { isReactElement: false, isShadowElement: false }) {
const browser2 = getBrowserObject2(this);
const browserCommandKeys = Object.keys(browser_exports);
const propertiesObject = {
/**
* filter out browser commands from object
*/
...Object.entries(clone(browser2.__propertiesObject__)).reduce((commands, [name, descriptor]) => {
if (!browserCommandKeys.includes(name)) {
commands[name] = descriptor;
}
return commands;
}, {}),
...getPrototype("element")
};
if (elemResponse.length === 0) {
return [];
}
const elements = [elemResponse].flat(1).map((res, i) => {
if (res.selector && "$$" in res) {
return res;
}
propertiesObject.scope = { value: "element" };
propertiesObject.emit = { value: this.emit.bind(this) };
const element = webdriverMonad(this.options, (client) => {
const elementId = getElementFromResponse(res);
if (elementId) {
client.elementId = elementId;
client[ELEMENT_KEY] = elementId;
if (res && this.isBidi && "locator" in res) {
client.locator = res.locator;
}
} else {
res = res;
client.error = res instanceof Error ? res : new WebDriverError(res);
}
client.selector = Array.isArray(selector) ? selector[i].selector : selector;
client.parent = this;
client.index = i;
client.isReactElement = props.isReactElement;
client.isShadowElement = props.isShadowElement;
return client;
}, propertiesObject);
const elementInstance = element(this.sessionId, elementErrorHandler(wrapCommand));
const origAddCommand = elementInstance.addCommand.bind(elementInstance);
elementInstance.addCommand = (name, fn) => {
browser2.__propertiesObject__[name] = { value: fn };
origAddCommand(name, fn);
};
return elementInstance;
});
return elements;
};
// src/constants.ts
import { UNICODE_CHARACTERS, HOOK_DEFINITION } from "@wdio/utils";
var WDIO_DEFAULTS = {
/**
* allows to specify automation protocol
*/
automationProtocol: {
type: "string",
default: "webdriver",
validate: (param) => {
if (typeof param !== "string") {
throw new Error("automationProtocol should be a string");
}
if (typeof import.meta.resolve !== "function") {
return;
}
try {
import.meta.resolve(param);
} catch (err) {
const error = err instanceof Error ? err : new Error("unknown error");
throw new Error("Couldn't find automation protocol \"".concat(param, '": ').concat(error.message));
}
}
},
/**
* capabilities of WebDriver sessions
*/
capabilities: {
type: "object",
validate: (param) => {
if (typeof param === "object") {
return true;
}
throw new Error('the "capabilities" options needs to be an object or a list of objects');
},
required: true
},
/**
* Shorten navigateTo command calls by setting a base url
*/
baseUrl: {
type: "string"
},
/**
* Default interval for all waitFor* commands
*/
waitforInterval: {
type: "number",
default: 100
},
/**
* Default timeout for all waitFor* commands
*/
waitforTimeout: {
type: "number",
default: 5e3
},
/**
* Hooks
*/
onReload: HOOK_DEFINITION,
beforeCommand: HOOK_DEFINITION,
afterCommand: HOOK_DEFINITION
};
var FF_REMOTE_DEBUG_ARG = "-remote-debugging-port";
var DEEP_SELECTOR = ">>>";
var ARIA_SELECTOR = "aria/";
var restoreFunctions = /* @__PURE__ */ new Map();
var Key = {
/**
* Special control key that works cross browser for Mac, where it's the command key, and for
* Windows or Linux, where it is the control key.
*/
Ctrl: "WDIO_CONTROL",
NULL: UNICODE_CHARACTERS.NULL,
Cancel: UNICODE_CHARACTERS.Cancel,
Help: UNICODE_CHARACTERS.Help,
Backspace: UNICODE_CHARACTERS.Backspace,
Tab: UNICODE_CHARACTERS.Tab,
Clear: UNICODE_CHARACTERS.Clear,
Return: UNICODE_CHARACTERS.Return,
Enter: UNICODE_CHARACTERS.Enter,
Shift: UNICODE_CHARACTERS.Shift,
Control: UNICODE_CHARACTERS.Control,
Alt: UNICODE_CHARACTERS.Alt,
Pause: UNICODE_CHARACTERS.Pause,
Escape: UNICODE_CHARACTERS.Escape,
Space: UNICODE_CHARACTERS.Space,
PageUp: UNICODE_CHARACTERS.PageUp,
PageDown: UNICODE_CHARACTERS.PageDown,
End: UNICODE_CHARACTERS.End,
Home: UNICODE_CHARACTERS.Home,
ArrowLeft: UNICODE_CHARACTERS.ArrowLeft,
ArrowUp: UNICODE_CHARACTERS.ArrowUp,
ArrowRight: UNICODE_CHARACTERS.ArrowRight,
ArrowDown: UNICODE_CHARACTERS.ArrowDown,
Insert: UNICODE_CHARACTERS.Insert,
Delete: UNICODE_CHARACTERS.Delete,
Semicolon: UNICODE_CHARACTERS.Semicolon,
Equals: UNICODE_CHARACTERS.Equals,
Numpad0: UNICODE_CHARACTERS["Numpad 0"],
Numpad1: UNICODE_CHARACTERS["Numpad 1"],
Numpad2: UNICODE_CHARACTERS["Numpad 2"],
Numpad3: UNICODE_CHARACTERS["Numpad 3"],
Numpad4: UNICODE_CHARACTERS["Numpad 4"],
Numpad5: UNICODE_CHARACTERS["Numpad 5"],
Numpad6: UNICODE_CHARACTERS["Numpad 6"],
Numpad7: UNICODE_CHARACTERS["Numpad 7"],
Numpad8: UNICODE_CHARACTERS["Numpad 8"],
Numpad9: UNICODE_CHARACTERS["Numpad 9"],
Multiply: UNICODE_CHARACTERS.Multiply,
Add: UNICODE_CHARACTERS.Add,
Separator: UNICODE_CHARACTERS.Separator,
Subtract: UNICODE_CHARACTERS.Subtract,
Decimal: UNICODE_CHARACTERS.Decimal,
Divide: UNICODE_CHARACTERS.Divide,
F1: UNICODE_CHARACTERS.F1,
F2: UNICODE_CHARACTERS.F2,
F3: UNICODE_CHARACTERS.F3,
F4: UNICODE_CHARACTERS.F4,
F5: UNICODE_CHARACTERS.F5,
F6: UNICODE_CHARACTERS.F6,
F7: UNICODE_CHARACTERS.F7,
F8: UNICODE_CHARACTERS.F8,
F9: UNICODE_CHARACTERS.F9,
F10: UNICODE_CHARACTERS.F10,
F11: UNICODE_CHARACTERS.F11,
F12: UNICODE_CHARACTERS.F12,
Command: UNICODE_CHARACTERS.Command,
ZenkakuHankaku: UNICODE_CHARACTERS.ZenkakuHankaku
};
// src/commands/browser/$$.ts
async function $$(selector) {
var _a;
if (this.isBidi && typeof selector === "string" && !selector.startsWith(DEEP_SELECTOR)) {
if ((_a = globalThis.wdio) == null ? void 0 : _a.execute) {
const command = "$$";
const res3 = "elementId" in this ? await globalThis.wdio.executeWithScope(command, this.elementId, selector) : await globalThis.wdio.execute(command, selector);
const elements3 = await getElements.call(this, selector, res3);
return enhanceElementsArray(elements3, this, selector);
}
const res2 = await findDeepElements.call(this, selector);
const elements2 = await getElements.call(this, selector, res2);
return enhanceElementsArray(elements2, getParent.call(this, res2), selector);
}
let res = Array.isArray(selector) ? selector : await findElements.call(this, selector);
if (Array.isArray(selector) && isElement(selector[0])) {
res = [];
for (const el of selector) {
const $el = await findElement.call(this, el);
if ($el) {
res.push($el);
}
}
}
const elements = await getElements.call(this, selector, res);
return enhanceElementsArray(elements, getParent.call(this, res), selector);
}
function getParent(res) {
let parent = res.length > 0 ? res[0].parent || this : this;
if (typeof parent.$ === "undefined") {
parent = "selector" in parent ? getElement.call(this, parent.selector, parent) : this;
}
return parent;
}
// src/commands/browser/$.ts
import { ELEMENT_KEY as ELEMENT_KEY2 } from "webdriver";
async function $(selector) {
if (globalThis.wdio && typeof selector === "string" && !selector.startsWith(DEEP_SELECTOR)) {
const res2 = "elementId" in this ? await globalThis.wdio.executeWithScope("$", this.elementId, selector) : await globalThis.wdio.execute("$", selector);
return getElement.call(this, selector, res2);
}
if (typeof selector === "object") {
const elementRef = selector;
if (typeof elementRef[ELEMENT_KEY2] === "string") {
return getElement.call(this, void 0, elementRef);
}
}
const res = await findElement.call(this, selector);
return getElement.call(this, selector, res);
}
// src/utils/actions/base.ts
import { ELEMENT_KEY as ELEMENT_KEY3 } from "webdriver";
var actionIds = 0;
var _id, _type, _parameters, _instance;
var BaseAction = class {
constructor(instance, type, params) {
this.instance = instance;
__privateAdd(this, _id);
__privateAdd(this, _type);
__privateAdd(this, _parameters);
__privateAdd(this, _instance);
__publicField(this, "sequence", []);
__privateSet(this, _instance, instance);
__privateSet(this, _id, (params == null ? void 0 : params.id) || "action".concat(++actionIds));
__privateSet(this, _type, type);
__privateSet(this, _parameters, (params == null ? void 0 : params.parameters) || {});
}
toJSON() {
return {
id: __privateGet(this, _id),
type: __privateGet(this, _type),
parameters: __privateGet(this, _parameters),
actions: this.sequence
};
}
/**
* Inserts a pause action for the specified device, ensuring it idles for a tick.
* @param duration idle time of tick
*/
pause(duration) {
this.sequence.push({ type: "pause", duration });
return this;
}
/**
* Perform action sequence
* @param skipRelease set to true if `releaseActions` command should not be invoked
*/
async perform(skipRelease = false) {
for (const seq of this.sequence) {
if (!seq.origin || typeof seq.origin === "string") {
continue;
}
if (typeof seq.origin.then === "function") {
await seq.origin.waitForExist();
seq.origin = await seq.origin;
}
if (!seq.origin[ELEMENT_KEY3]) {
throw new Error("Couldn't find element for \"".concat(seq.type, '" action sequence'));
}
seq.origin = { [ELEMENT_KEY3]: seq.origin[ELEMENT_KEY3] };
}
await __privateGet(this, _instance).performActions([this.toJSON()]);
if (!skipRelease) {
await __privateGet(this, _instance).releaseActions();
}
}
};
_id = new WeakMap();
_type = new WeakMap();
_parameters = new WeakMap();
_instance = new WeakMap();
// src/environment.ts
var isNode = !!(typeof process !== "undefined" && process.version);
var environment = {
value: {
get readFileSync() {
throw new Error("Can't read files form file system in this environment");
},
get downloadFile() {
throw new Error("The `downloadFile` command is not available in this environment");
},
get savePDF() {
throw new Error("The `savePDF` command is not available in this environment");
},
get saveRecordingScreen() {
throw new Error("The `saveRecordingScreen` command is not available in this environment");
},
get uploadFile() {
throw new Error("The `uploadFile` command is not available in this environment");
},
get saveScreenshot() {
throw new Error("The `saveScreenshot` command for WebdriverIO.Browser is not available in this environment");
},
get saveElementScreenshot() {
throw new Error("The `saveScreenshot` command for WebdriverIO.Element is not available in this environment");
},
get osType() {
return () => "browser";
}
}
};
// src/utils/actions/key.ts
var _KeyAction_instances, sanitizeKey_fn;
var KeyAction = class extends BaseAction {
constructor(instance, params) {
super(instance, "key", params);
__privateAdd(this, _KeyAction_instances);
}
/**
* Generates a key up action.
* @param value key value
*/
up(value) {
this.sequence.push({ type: "keyUp", value: __privateMethod(this, _KeyAction_instances, sanitizeKey_fn).call(this, value) });
return this;
}
/**
* Generates a key down action.
* @param value key value
*/
down(value) {
this.sequence.push({ type: "keyDown", value: __privateMethod(this, _KeyAction_instances, sanitizeKey_fn).call(this, value) });
return this;
}
};
_KeyAction_instances = new WeakSet();
sanitizeKey_fn = function(value) {
var _a;
if (typeof value !== "string") {
throw new Error('Invalid type for key input: "'.concat(typeof value, '", expected a string!'));
}
const platformName = this.instance.capabilities.platformName;
const isMac = (
// check capabilities first
platformName && platformName.match(/mac(\s)*os/i) || // if not set, expect we run locally
((_a = this.instance.options.hostname) == null ? void 0 : _a.match(/0\.0\.0\.0|127\.0\.0\.1|local/i)) && environment.value.osType().match(/darwin/i)
);
if (value === Key.Ctrl) {
return isMac ? Key.Command : Key.Control;
}
if (value.length > 1) {
throw new Error('Your key input contains more than one character: "'.concat(value, '", only one is allowed though!'));
}
return value;
};
// src/utils/actions/pointer.ts
var buttonNumbers = [0, 1, 2];
var buttonNames = ["left", "middle", "right"];
var buttonValue = [...buttonNumbers, ...buttonNames];
var ORIGIN_DEFAULT = "viewport";
var BUTTON_DEFAULT = 0;
var POINTER_TYPE_DEFAULT = "mouse";
var UP_PARAM_DEFAULTS = {
button: BUTTON_DEFAULT
};
var PARAM_DEFAULTS = {
...UP_PARAM_DEFAULTS,
width: 0,
height: 0,
pressure: 0,
tangentialPressure: 0,
tiltX: 0,
tiltY: 0,
twist: 0,
altitudeAngle: 0,
azimuthAngle: 0
};
var MOVE_PARAM_DEFAULTS = {
x: 0,
y: 0,
duration: 100,
origin: ORIGIN_DEFAULT
};
function removeDefaultParams(seq) {
for (const [key, value] of Object.entries(seq)) {
if (value === 0 && !["x", "y", "button", "duration"].includes(key)) {
delete seq[key];
}
}
}
function mapButton(params) {
const buttons = {
left: 0,
middle: 1,
right: 2
};
if (typeof params === "number") {
return { button: params };
}
if (typeof params === "string") {
return { button: buttons[params] };
}
if (typeof params === "object" && typeof params.button === "string") {
return { ...params, button: buttons[params.button] };
}
return params;
}
var PointerAction = class extends BaseAction {
constructor(instance, params = {}) {
if (!params.parameters) {
params.parameters = { pointerType: POINTER_TYPE_DEFAULT };
}
super(instance, "pointer", params);
}
move(params = {}, y) {
const seq = {
type: "pointerMove",
// default params
...PARAM_DEFAULTS,
...UP_PARAM_DEFAULTS,
...MOVE_PARAM_DEFAULTS
};
if (typeof params === "number") {
Object.assign(seq, { x: params, y });
} else if (params) {
Object.assign(seq, params);
}
removeDefaultParams(seq);
this.sequence.push(seq);
return this;
}
up(params = UP_PARAM_DEFAULTS) {
this.sequence.push({
type: "pointerUp",
...mapButton(params)
});
return this;
}
down(params = {}) {
const seq = {
type: "pointerDown",
...PARAM_DEFAULTS,
...mapButton(params)
};
removeDefaultParams(seq);
this.sequence.push(seq);
return this;
}
/**
* An action that cancels this pointer's current input.
*/
cancel() {
this.sequence.push({ type: "pointerCancel" });
return this;
}
};
// src/utils/actions/wheel.ts
var DEFAULT_SCROLL_PARAMS = {
x: 0,
y: 0,
deltaX: 0,
deltaY: 0,
duration: 0
};
var WheelAction = class extends BaseAction {
constructor(instance, params) {
super(instance, "wheel", params);
}
/**
* Scrolls a page to given coordinates or origin.
*/
scroll(params) {
this.sequence.push({ type: "scroll", ...DEFAULT_SCROLL_PARAMS, ...params });
return this;
}
};
// src/commands/browser/action.ts
function action(type, opts) {
if (type === "key") {
return new KeyAction(this, opts);
}
if (type === "pointer") {
return new PointerAction(this, opts);
}
if (type === "wheel") {
return new WheelAction(this, opts);
}
throw new Error('Unsupported action type "'.concat(type, '", supported are "key", "pointer", "wheel"'));
}
// src/commands/browser/actions.ts
async function actions(actions2) {
await this.performActions(actions2.map((action2) => action2.toJSON()));
await this.releaseActions();
}
// src/utils/bidi/index.ts
import { ELEMENT_KEY as ELEMENT_KEY4 } from "webdriver";
// src/commands/constant.ts
var TOUCH_ACTIONS = ["press", "longPress", "tap", "moveTo", "wait", "release"];
var POS_ACTIONS = TOUCH_ACTIONS.slice(0, 4);
var ACCEPTED_OPTIONS = ["x", "y", "element"];
var SCRIPT_PREFIX = "/* __wdio script__ */";
var SCRIPT_SUFFIX = "/* __wdio script end__ */";
var resqScript = '!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.resq=e():(t.window=t.window||{},t.window.resq=e())}(window,(function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)r.d(n,o,function(e){return t[e]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=16)}([function(t,e,r){"use strict";r.d(e,"a",(function(){return m})),r.d(e,"d",(function(){return j})),r.d(e,"b",(function(){return M})),r.d(e,"c",(function(){return P}));var n=r(1),o=r.n(n),u=r(14),i=r.n(u),c=r(2),f=r.n(c),s=r(15),a=r.n(s);function l(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}var p=Array.isArray,d=Object.keys;function x(t){return"function"==typeof t}function y(t){return t instanceof HTMLElement||t instanceof Text}function h(t){return"object"===f()(t)&&!p(t)}function b(t){if(!t||"string"==typeof t)return t;var e=function(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?l(Object(r),!0).forEach((function(e){i()(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}({},t);return delete e.children,e}function v(t,e){var r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return!(!p(t)||!p(e))&&(r?t.length===e.length&&!t.find((function(t){return!e.includes(t)})):t.some((function(t){return e.includes(t)})))}function _(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=[];if(!d(t).length)return!0;if(null===e||!d(e).length)return!1;if(r)return a()(t,e);var o=d(t).filter((function(t){return d(e).includes(t)}));return o.forEach((function(r){h(t[r])&&h(e[r])&&(n=n.concat(_(t[r],e[r]))),(t[r]===e[r]||v(t[r],e[r]))&&n.push(e)})),n.length>0&&n.filter((function(t){return t})).length===o.length}function m(t){var e,r={children:[]};if(!t)return r;r.name=x(e=t.type)?e.displayName||e.name:e,r.props=b(t.memoizedProps),r.state=function(t){if(t){var e=t.baseState;return e||t}}(t.memoizedState);var n=t.child;if(n)for(r.children.push(n);n.sibling;)r.children.push(n.sibling),n=n.sibling;return r.children=r.children.map((function(t){return m(t)})),x(t.type)&&function(t){return t.children.length>1}(r)?(r.node=function(t){return t.children.map((function(t){return t.node})).filter((function(t){return!!t}))}(r),r.isFragment=!0):r.node=function(t){return y(t.stateNode)?t.stateNode:t.child&&y(t.child.stateNode)?t.child.stateNode:null}(t),r}function g(t){for(;t.length;){var e=t.shift();if(e.node)return e.node;e.children&&Array.isArray(e.children)&&t.push.apply(t,o()(e.children))}}function O(t,e){for(var r=[];t.length;){var n=t.shift().children;n&&Array.isArray(n)&&n.forEach((function(n){e(n)&&(!n.node&&Array.isArray(n.children)&&(n.node=g(n.children.concat([]))),r.push(n)),t.push(n)}))}return r}function w(t,e){var r=function(t){if(t){var e=t.split("(");return 1===e.length?t:e.find((function(t){return t.includes(")")})).replace(/\\)*/g,"")}}(e);return new RegExp("^"+t.split("*").map((function(t){return t.replace(/([.*+?^=!:${}()|[\\]/\\\\])/g,"\\\\$1")})).join(".+")+"$").test(r)}function j(t,e){var r=arguments.length>3?arguments[3]:void 0;return t.reduce((function(t,e){return t.concat(O(t,r&&"function"==typeof r?r:function(t){return"string"==typeof t.name?w(e,t.name):null!==t.name&&"object"===f()(t.name)&&w(e,t.name.displayName)}))}),[e])}function M(t,e,r){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];return x(r)?(console.warn("Functions are not supported as filter matchers"),[]):t.filter((function(t){return h(r)&&_(r,t[e],n)||p(r)&&v(r,t[e],n)||t[e]===r}))}function P(t){if(t.hasOwnProperty("_reactRootContainer"))return t._reactRootContainer._internalRoot.current;var e=Object.keys(t).find((function(t){return t.startsWith("__reactInternalInstance")||t.startsWith("__reactFiber")||t.startsWith("__reactContainer")}));return e?t[e]:void 0}},function(t,e,r){var n=r(17),o=r(18),u=r(19),i=r(20);t.exports=function(t){return n(t)||o(t)||u(t)||i()},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){function r(e){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?(t.exports=r=function(t){return typeof t},t.exports.default=t.exports,t.exports.__esModule=!0):(t.exports=r=function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t.exports.default=t.exports,t.exports.__esModule=!0),r(e)}t.exports=r,t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){function r(e){return t.exports=r=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},t.exports.default=t.exports,t.exports.__esModule=!0,r(e)}t.exports=r,t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){t.exports=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){function r(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}t.exports=function(t,e,n){return e&&r(t.prototype,e),n&&r(t,n),t},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){function r(e,n){return t.exports=r=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},t.exports.default=t.exports,t.exports.__esModule=!0,r(e,n)}t.exports=r,t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,r){var n=r(6);t.exports=function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&n(t,e)},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,r){var n=r(3),o=r(6),u=r(22),i=r(23);function c(e){var r="function"==typeof Map?new Map:void 0;return t.exports=c=function(t){if(null===t||!u(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==r){if(r.has(t))return r.get(t);r.set(t,e)}function e(){return i(t,arguments,n(this).constructor)}return e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),o(e,t)},t.exports.default=t.exports,t.exports.__esModule=!0,c(e)}t.exports=c,t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(t){"object"==typeof window&&(r=window)}t.exports=r},function(t,e){t.exports=function(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,r){"use strict";(function(t){r.d(e,"a",(function(){return o}));var n=r(0);function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:5e3,r=arguments.length>1?arguments[1]:void 0;if(t.isReactLoaded)return Promise.resolve("React already loaded");var o=function(){var t=document.createTreeWalker(document);if(r)return document.querySelector(r);for(;t.nextNode();)if(t.currentNode.hasOwnProperty("_reactRootContainer"))return t.currentNode};return new Promise((function(r,u){var i=!1,c=null;!function e(){var u=o();if(u&&(t.isReactLoaded=!0,t.rootReactElement=Object(n.c)(u),t.rootReactElement))return clearTimeout(c),r();i||setTimeout(e,200)}(),c=setTimeout((function(){i=!0,u("Timed out")}),e)}))}}).call(this,r(9))},function(t,e,r){"use strict";r.d(e,"a",(function(){return g}));var n=r(1),o=r.n(n),u=r(4),i=r.n(u),c=r(5),f=r.n(c),s=r(7),a=r.n(s),l=r(13),p=r.n(l),d=r(3),x=r.n(d),y=r(8),h=r.n(y),b=r(0);function v(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var r,n=x()(t);if(e){var o=x()(this).constructor;r=Reflect.construct(n,arguments,o)}else r=n.apply(this,arguments);return p()(this,r)}}var _=function(t){a()(r,t);var e=v(r);function r(t){return i()(this,r),t||(t=[]),e.call.apply(e,[this].concat(o()(t)))}return f()(r,[{key:"byProps",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{exact:!1},n=e.exact,o=Object(b.b)(this,"props",t,n);return new r(o)}},{key:"byState",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{exact:!1},n=e.exact,o=Object(b.b)(this,"state",t,n);return new r(o)}}]),r}(h()(Array)),m=function(t){a()(r,t);var e=v(r);function r(t,n){var o;for(var u in i()(this,r),(o=e.call(this,t))._nodes=n,t)o[u]=t[u];return o}return f()(r,[{key:"byProps",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{exact:!1},n=e.exact,o=Object(b.b)(this._nodes,"props",t,n)[0];return new r(o,this._nodes)}},{key:"byState",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{exact:!1},n=e.exact,o=Object(b.b)(this._nodes,"state",t,n)[0];return new r(o,this._nodes)}}]),r}(h()(Object)),g=function(){function t(e,r){i()(this,t),this.selectors=e.split(" ").filter((function(t){return!!t})).map((function(t){return t.trim()})),this.rootComponent=r,this.tree=Object(b.a)(this.rootComponent)}return f()(t,[{key:"find",value:function(){return this.nodes=new _(Object(b.d)(this.selectors,this.tree,!0)),new m(this.nodes[0],this.nodes)}},{key:"findAll",value:function(){return new _(Object(b.d)(this.selectors,this.tree))}}]),t}()},function(t,e,r){var n=r(2).default,o=r(21);t.exports=function(t,e){return!e||"object"!==n(e)&&"function"!=typeof e?o(t):e},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){t.exports=function(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,r){"use strict";var n=Array.isArray,o=Object.keys,u=Object.prototype.hasOwnProperty;t.exports=function t(e,r){if(e===r)return!0;if(e&&r&&"object"==typeof e&&"object"==typeof r){var i,c,f,s=n(e),a=n(r);if(s&&a){if((c=e.length)!=r.length)return!1;for(i=c;0!=i--;)if(!t(e[i],r[i]))return!1;return!0}if(s!=a)return!1;var l=e instanceof Date,p=r instanceof Date;if(l!=p)return!1;if(l&&p)return e.getTime()==r.getTime();var d=e instanceof RegExp,x=r instanceof RegExp;if(d!=x)return!1;if(d&&x)return e.toString()==r.toString();var y=o(e);if((c=y.length)!==o(r).length)return!1;for(i=c;0!=i--;)if(!u.call(r,y[i]))return!1;for(i=c;0!=i--;)if(!t(e[f=y[i]],r[f]))return!1;return!0}return e!=e&&r!=r}},function(t,e,r){"use strict";r.r(e),function(t){r.d(e,"resq$",(function(){return c})),r.d(e,"resq$$",(function(){return f}));var n=r(12),o=r(11);r.d(e,"waitToLoadReact",(function(){return o.a}));var u=r(0);function i(e,r,o){if(!o&&!t.isReactLoaded)throw new Error("Could not find the root element of your application");var i=t.rootReactElement;if(o instanceof HTMLElement&&(i=Object(u.c)(o)),!i)throw new Error("Could not find instance of React in given element");return new n.a(e,i)[r]()}function c(t,e){return i(t,"find",e)}function f(t,e){return i(t,"findAll",e)}}.call(this,r(9))},function(t,e,r){var n=r(10);t.exports=function(t){if(Array.isArray(t))return n(t)},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){t.exports=function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,r){var n=r(10);t.exports=function(t,e){if(t){if("string"==typeof t)return n(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(t,e):void 0}},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){t.exports=function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){t.exports=function(t){if(void 0===t)throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");return t},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){t.exports=function(t){return-1!==Function.toString.call(t).indexOf("[native code]")},t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e,r){var n=r(6),o=r(24);function u(e,r,i){return o()?(t.exports=u=Reflect.construct,t.exports.default=t.exports,t.exports.__esModule=!0):(t.exports=u=function(t,e,r){var o=[null];o.push.apply(o,e);var u=new(Function.bind.apply(t,o));return r&&n(u,r.prototype),u},t.exports.default=t.exports,t.exports.__esModule=!0),u.apply(null,arguments)}t.exports=u,t.exports.default=t.exports,t.exports.__esModule=!0},function(t,e){t.exports=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}},t.exports.default=t.exports,t.exports.__esModule=!0}])}));';
var formatArgs = function(scope, actions2) {
return actions2.map((action2) => {
if (Array.isArray(action2)) {
return formatArgs(scope, action2);
}
if (typeof action2 === "string") {
action2 = { action: action2 };
}
const formattedAction = {
action: action2.action,
options: {}
};
const actionElement = action2.element && typeof action2.element.elementId === "string" ? action2.element.elementId : scope.elementId;
if (POS_ACTIONS.includes(action2.action) && formattedAction.options && actionElement) {
formattedAction.options.element = actionElement;
}
if (formattedAction.options && typeof action2.x === "number" && isFinite(action2.x)) {
formattedAction.options.x = action2.x;
}
if (formattedAction.options && typeof action2.y === "number" && isFinite(action2.y)) {
formattedAction.options.y = action2.y;
}
if (formattedAction.options && action2.ms) {
formattedAction.options.ms = action2.ms;
}
if (formattedAction.options && Object.keys(formattedAction.options).length === 0) {
delete formattedAction.options;
}
return formattedAction;
});
};
var validateParameters = (params) => {
const options = Object.keys(params.options || {});
if (params.action === "release" && options.length !== 0) {
throw new Error(
'action "release" doesn\'t accept any options ' + '("'.concat(options.join('", "'), '" found)')
);
}
if (params.action === "wait" && (options.includes("x") || options.includes("y"))) {
throw new Error('action "wait" doesn\'t accept x or y options');
}
if (POS_ACTIONS.includes(params.action)) {
for (const option in params.options) {
if (!ACCEPTED_OPTIONS.includes(option)) {
throw new Error('action "'.concat(params.action, '" doesn\'t accept "').concat(option, '" as option'));
}
}
if (options.length === 0) {
throw new Error(
'Touch actions like "'.concat(params.action, '" need at least some kind of ') + 'position information like "element", "x" or "y" options, you\'ve none given.'
);
}
}
};
var touchAction = function(actions2) {
if (!this.multiTouchPerform || !this.touchPerform) {
throw new Error("touchAction can be used with Appium only.");
}
if (!Array.isArray(actions2)) {
actions2 = [actions2];
}
const formattedAction = formatArgs(this, actions2);
const protocolCommand = Array.isArray(actions2[0]) ? this.multiTouchPerform.bind(this) : this.touchPerform.bind(this);
formattedAction.forEach((params) => validateParameters(params));
return protocolCommand(formattedAction);
};
// src/utils/bidi/error.ts
var _params, _result, _WebdriverBidiExeception_instances, getCustomStack_fn, getFailureLine_fn;
var WebdriverBidiExeception = class extends Error {
constructor(params, result) {
super(result.exceptionDetails.text);
__privateAdd(this, _WebdriverBidiExeception_instances);
__privateAdd(this, _params);
__privateAdd(this, _result);
this.name = "WebdriverBidiExeception";
__privateSet(this, _params, params);
__privateSet(this, _result, result);
this.stack = __privateMethod(this, _WebdriverBidiExeception_instances, getCustomStack_fn).call(this);
}
};
_params = new WeakMap();
_result = new WeakMap();
_WebdriverBidiExeception_instances = new WeakSet();
getCustomStack_fn = function() {
const origStack = this.stack;
const failureLine = __privateMethod(this, _WebdriverBidiExeception_instances, getFailureLine_fn).call(this);
const stack = (origStack == null ? void 0 : origStack.split("\n")) || [];
const wrapCommandIndex = stack.findLastIndex((line) => line.includes("Context.executeAsync"));
const executeLine = stack[wrapCommandIndex - 1];
if (failureLine && executeLine) {
const line = executeLine.replace("file://", "").split(":");
const row = line.length > 3 ? line[2] : line[1];
const [errorMessage, ...restOfStack] = stack;
const linePrefix = " ".concat(row, " \u2502 ");
const codeLine = [
linePrefix + failureLine,
" ".repeat(linePrefix.length - 2) + "\u2575 " + "~".repeat(failureLine.length),
""
];
return [errorMessage, executeLine, ...codeLine, ...restOfStack].join("\n");
}
return origStack;
};
/**
* This is an attempt to identify the snippet of code that caused an execute(Async) function to
* throw an exception
* @param {string} script script that executed in the browser
* @param {number} columnNumber column in which the scrpt threw an exception
* @returns the line of failure in which the code threw an exception or `undefined` if we could not find it
*/
getFailureLine_fn = function() {
var _a;
const script = __privateGet(this, _params).functionDeclaration;
const exceptionDetails = __privateGet(this, _result).exceptionDetails;
const userScript = script.split("\n").find((l) => l.includes(SCRIPT_PREFIX));
if (!userScript) {
return;
}
let length = 0;
const isMinified = script.split("\n").some((line) => line.includes(SCRIPT_PREFIX) && line.includes(SCRIPT_SUFFIX));
if (isMinified) {
for (const line of userScript.split(";")) {
if (length + line.length >= exceptionDetails.columnNumber) {
return line.includes(SCRIPT_SUFFIX) ? line.slice(0, line.indexOf(SCRIPT_SUFFIX)) : line;
}
length += line.length;
}
} else {
const slicedScript = script.slice(
script.indexOf(SCRIPT_PREFIX) + SCRIPT_PREFIX.length,
script.indexOf(SCRIPT_SUFFIX)
);
const lineDiff = 9;
const line = (_a = slicedScript.split("\n")[exceptionDetails.lineNumber - lineDiff]) == null ? void 0 : _a.slice(exceptionDetails.columnNumber);
return line;
}
return void 0;
};
// src/utils/bidi/index.ts
function parseScriptResult(params, result) {
const type = result.type;
if (type === "success" /* Success */) {
return deserialize(result.result);
}
if (type === "exception" /* Exception */) {
throw new WebdriverBidiExeception(params, result);
}
throw new Error("Unknown evaluate result type: ".concat(type));
}
var references = /* @__PURE__ */ new Map();
function deserialize(result) {
const deserializedValue = deserializeValue(result);
references.clear();
return deserializedValue;
}
function deserializeValue(result) {
if (result && "internalId" in result && typeof result.internalId === "string") {
if ("value" in result) {
references.set(result.internalId, result.value);
} else {
result.value = references.get(result.internalId);
}
}
const { type, value } = result;
if (type === "regexp" /* RegularExpression */) {
return new RegExp(value.pattern, value.flags);
}
if (type === "array" /* Array */) {
return value.map((element) => deserializeValue(element));
}
if (type === "date" /* Date */) {
return new Date(value);
}
if (type === "map" /* Map */) {
return new Map(value.map(([key, value2]) => [typeof key === "string" ? key : deserializeValue(key), deserializeValue(value2)]));
}
if (type === "set" /* Set */) {
return new Set(value.map((element) => deserializeValue(element)));
}
if (type === "number" /* Number */ && value === "NaN") {
return NaN;
}
if (type === "number" /* Number */ && value === "Infinity") {
return Infinity;
}
if (type === "number" /* Number */ && value === "-Infinity") {
return -Infinity;
}
if (type === "number" /* Number */ && value === "-0") {
return -0;
}
if (type === "bigint" /* BigInt */) {
return BigInt(value);
}
if (type === "null" /* Null */) {
return null;
}
if (type === "object" /* Object */) {
return Object.fromEntries((value || []).map(([key, value2]) => {
return [typeof key === "string" ? key : deserializeValue(key), deserializeValue(value2)];
}));
}
if (type === "node" /* Node */) {
return { [ELEMENT_KEY4]: result.sharedId };
}
if (type === "error" /* Error */) {
return new Error("<unserializable error>");
}
return value;
}
// src/commands/browser/addInitScript.ts
async function addInitScript(script, ...args) {
if (typeof script !== "function") {
throw new Error("The `addInitScript` command requires a function as first parameter, but got: " + typeof script);
}
if (!this.isBidi) {
throw new Error("This command is only supported when automating browser using WebDriver Bidi protocol");
}
const serializedParameters = (args || []).map((arg) => JSON.stringify(arg));
const context = await this.getWindowHandle();
const fn = "(emit) => {\n const closure = new Function(`return ".concat(script.toString(), "`)\n return closure()(").concat(serializedParameters.length ? "".concat(serializedParameters.join(", "), ", emit") : "emit", ")\n }");
const channel = btoa(fn.toString());
const result = await this.scriptAddPreloadScript({
functionDeclaration: fn,
arguments: [{
type: "channel",
value: { channel }
}],
contexts: [context]
});
await this.sessionSubscribe({
events: ["script.message"]
});
const eventHandler = /* @__PURE__ */ new Map();
const messageHandler = (msg) => {
if (msg.channel === channel) {
const handler = eventHandler.get("data") || [];
return handler.forEach((fn2) => fn2(deserialize(msg.data)));
}
};
this.on("script.message", messageHandler);
const resetFn = () => {
eventHandler.clear();
this.off("script.message", messageHandler);
return this.scriptRemovePreloadScript({ script: result.script });
};
const returnVal = {
remove: resetFn,
on: (event, listener) => {
var _a;
if (!eventHandler.has(event)) {
eventHandler.set(event, []);
}
(_a = eventHandler.get(event)) == null ? void 0 : _a.push(listener);
}
};
return returnVal;
}
// src/commands/browser/call.ts
function call(fn) {
if (typeof fn === "function") {
return fn();
}
throw new Error('Command argument for "call" needs to be a function');
}
// src/commands/browser/custom$$.ts
import { ELEMENT_KEY as ELEMENT_KEY5 } from "webdriver";
async function custom$$(