UNPKG

webdriverio

Version:

Next-gen browser and mobile automation test framework for Node.js

1,023 lines (998 loc) 414 kB
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$$(