@luminati-io/webdriverio8
Version:
Next-gen browser and mobile automation test framework for Node.js
169 lines • 14.4 kB
JavaScript
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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