UNPKG

@luminati-io/webdriverio8

Version:

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

169 lines 14.4 kB
import zip from 'lodash.zip'; import clone from 'lodash.clonedeep'; import { webdriverMonad, wrapCommand } from '@wdio/utils'; import { multiremoteHandler } from './middlewares.js'; import { getPrototype } from './utils/index.js'; /** * Multiremote class */ export default class MultiRemote { instances = {}; baseInstance; sessionId; /** * add instance to multibrowser instance */ async addInstance(browserName, client) { this.instances[browserName] = await client; return this.instances[browserName]; } /** * modifier for multibrowser instance */ modifier(wrapperClient) { const propertiesObject = {}; propertiesObject.commandList = { value: wrapperClient.commandList }; propertiesObject.options = { value: wrapperClient.options }; propertiesObject.getInstance = { value: (browserName) => this.instances[browserName] }; for (const commandName of wrapperClient.commandList) { propertiesObject[commandName] = { value: this.commandWrapper(commandName), configurable: true }; } propertiesObject.__propertiesObject__ = { value: propertiesObject }; this.baseInstance = new MultiRemoteDriver(this.instances, propertiesObject); const client = Object.create(this.baseInstance, propertiesObject); /** * attach instances to wrapper client * ToDo(Christian): deprecate and remove */ for (const [identifier, instance] of Object.entries(this.instances)) { client[identifier] = instance; } return client; } /** * helper method to generate element objects from results, so that we can call, e.g. * * ``` * const elem = $('#elem') * elem.getHTML() * ``` * * or in case multiremote is used * * ``` * const elems = $$('div') * elems[0].getHTML() * ``` */ static elementWrapper(instances, result, propertiesObject, scope) { const prototype = { ...propertiesObject, ...clone(getPrototype('element')), scope: { value: 'element' } }; const element = webdriverMonad({}, (client) => { /** * attach instances to wrapper client */ for (const [i, identifier] of Object.entries(Object.keys(instances))) { // @ts-expect-error ToDo(Christian): deprecate client[identifier] = result[i]; } client.instances = Object.keys(instances); client.isMultiremote = true; client.selector = result[0] ? result[0].selector : null; // @ts-expect-error ToDo(Christian): remove eventually delete client.sessionId; return client; }, prototype); // @ts-ignore return element(this.sessionId, multiremoteHandler(scope.commandWrapper.bind(scope))); } /** * handle commands for multiremote instances */ commandWrapper(commandName) { const instances = this.instances; const self = this; if (commandName === 'getInstance') { return function (browserName) { if (!this[browserName]) { throw new Error(`Multiremote object has no instance named "${browserName}"`); } return this[browserName]; }; } return wrapCommand(commandName, async function (...args) { const mElem = this; const scope = this.selector ? Object.entries(mElem.instances.reduce((ins, instanceName) => ( // @ts-expect-error ToDo(Christian): deprecate { ...ins, [instanceName]: mElem[instanceName] }), {})) : Object.entries(instances); const result = await Promise.all(scope.map(([, instance]) => instance[commandName](...args))); /** * return element object to call commands directly */ if (commandName === '$') { const elem = MultiRemote.elementWrapper(instances, result, this.__propertiesObject__, self); return elem; } else if (commandName === '$$') { const zippedResult = zip(...result); return zippedResult.map((singleResult) => MultiRemote.elementWrapper(instances, singleResult, this.__propertiesObject__, self)); } return result; }); } } /** * event listener class that propagates events to sub drivers */ /* istanbul ignore next */ export class MultiRemoteDriver { instances; isMultiremote = true; __propertiesObject__; constructor(instances, propertiesObject) { this.instances = Object.keys(instances); this.__propertiesObject__ = propertiesObject; } on(eventName, emitter) { this.instances.forEach((instanceName) => this.getInstance(instanceName).on(eventName, emitter)); return undefined; } once(eventName, emitter) { this.instances.forEach((instanceName) => this.getInstance(instanceName).once(eventName, emitter)); return undefined; } emit(eventName, emitter) { return this.instances.map((instanceName) => this.getInstance(instanceName).emit(eventName, emitter)).some(Boolean); } eventNames() { return this.instances.map((instanceName) => this.getInstance(instanceName).eventNames()); // special behavior of event methods for multiremote } getMaxListeners() { return this.instances.map((instanceName) => this.getInstance(instanceName).getMaxListeners()); // special behavior of event methods for multiremote } listenerCount(eventName) { return this.instances.map((instanceName) => this.getInstance(instanceName).listenerCount(eventName)); // special behavior of event methods for multiremote } listeners(eventName) { return this.instances.map((instanceName) => this.getInstance(instanceName).listeners(eventName)).reduce((prev, cur) => { prev.concat(cur); return prev; }, []); } removeListener(eventName, emitter) { this.instances.forEach((instanceName) => this.getInstance(instanceName).removeListener(eventName, emitter)); return undefined; } removeAllListeners(eventName) { this.instances.forEach((instanceName) => this.getInstance(instanceName).removeAllListeners(eventName)); return undefined; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlyZW1vdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbXVsdGlyZW1vdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxNQUFNLGtCQUFrQixDQUFBO0FBQ3BDLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBSXpELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUsvQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sV0FBVztJQUM1QixTQUFTLEdBQXdDLEVBQUUsQ0FBQTtJQUNuRCxZQUFZLENBQW9CO0lBQ2hDLFNBQVMsQ0FBUztJQUVsQjs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUUsV0FBbUIsRUFBRSxNQUFXO1FBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsTUFBTSxNQUE2QixDQUFBO1FBQ2pFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUUsYUFBZ0k7UUFDdEksTUFBTSxnQkFBZ0IsR0FBdUMsRUFBRSxDQUFBO1FBQy9ELGdCQUFnQixDQUFDLFdBQVcsR0FBRyxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDbkUsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMzRCxnQkFBZ0IsQ0FBQyxXQUFXLEdBQUc7WUFDM0IsS0FBSyxFQUFFLENBQUMsV0FBbUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7U0FDOUQsQ0FBQTtRQUVE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