@luminati-io/webdriverio8
Version:
Next-gen browser and mobile automation test framework for Node.js
133 lines • 12.6 kB
JavaScript
import logger from '@wdio/logger';
import WebDriver, { DEFAULTS } from '@luminati-io/webdriverio8-webdriver';
import { validateConfig } from '@wdio/config';
import { wrapCommand } from '@wdio/utils';
import MultiRemote from './multiremote.js';
import SevereServiceErrorImport from './utils/SevereServiceError.js';
import detectBackend from './utils/detectBackend.js';
import { getProtocolDriver } from './utils/driver.js';
import { WDIO_DEFAULTS, SupportedAutomationProtocols, Key as KeyConstant } from './constants.js';
import { getPrototype, addLocatorStrategyHandler, isStub } from './utils/index.js';
export * from './types.js';
export const Key = KeyConstant;
export const SevereServiceError = SevereServiceErrorImport;
/**
* A method to create a new session with WebdriverIO.
*
* <b>
* NOTE: If you hit "error TS2694: Namespace 'global.WebdriverIO' has no exported member 'Browser'" when using typescript,
* add "@wdio/globals/types" into tsconfig.json's "types" array will solve it: <code> { "compilerOptions": { "types": ["@wdio/globals/types"] } } </code>
* </b>
*
* @param params Options to create the session with
* @param remoteModifier Modifier function to change the monad object
* @return browser object with sessionId
* @see <a href="https://webdriver.io/docs/typescript">Typescript setup</a>
*/
export const remote = async function (params, remoteModifier) {
logger.setLogLevelsConfig(params.logLevels, params.logLevel);
const keysToKeep = Object.keys(process.env.WDIO_WORKER_ID ? params : DEFAULTS);
const config = validateConfig(WDIO_DEFAULTS, params, keysToKeep);
const modifier = (client, options) => {
/**
* overwrite instance options with default values of the protocol
* package (without undefined properties)
*/
Object.assign(options, Object.entries(config)
.reduce((a, [k, v]) => (typeof v === 'undefined' ? a : { ...a, [k]: v }), {}));
if (typeof remoteModifier === 'function') {
client = remoteModifier(client, options);
}
return client;
};
const { Driver, options } = await getProtocolDriver({ ...params, ...config });
const prototype = getPrototype('browser');
const instance = await Driver.newSession(options, modifier, prototype, wrapCommand);
/**
* we need to overwrite the original addCommand and overwriteCommand
*/
if (params.framework && !isStub(params.automationProtocol)) {
const origAddCommand = instance.addCommand.bind(instance);
instance.addCommand = (name, fn, attachToElement) => (origAddCommand(name, fn, attachToElement));
const origOverwriteCommand = instance.overwriteCommand.bind(instance);
instance.overwriteCommand = (name, fn, attachToElement) => (origOverwriteCommand(name, fn, attachToElement));
}
instance.addLocatorStrategy = addLocatorStrategyHandler(instance);
return instance;
};
export const attach = async function (attachOptions) {
/**
* copy instances properties into new object
*/
const params = {
automationProtocol: SupportedAutomationProtocols.webdriver,
...attachOptions,
...detectBackend(attachOptions.options),
requestedCapabilities: attachOptions.requestedCapabilities
};
const prototype = getPrototype('browser');
const { Driver } = await getProtocolDriver(params);
const driver = Driver.attachToSession(params, undefined, prototype, wrapCommand);
driver.addLocatorStrategy = addLocatorStrategyHandler(driver);
return driver;
};
/**
* WebdriverIO allows you to run multiple automated sessions in a single test.
* This is handy when you're testing features that require multiple users (for example, chat or WebRTC applications).
*
* Instead of creating a couple of remote instances where you need to execute common commands like newSession() or url() on each instance,
* you can simply create a multiremote instance and control all browsers at the same time.
*
* <b>
* NOTE: Multiremote is not meant to execute all your tests in parallel.
* It is intended to help coordinate multiple browsers and/or mobile devices for special integration tests (e.g. chat applications).
* </b>
*
* @param params capabilities to choose desired devices.
* @param automationProtocol
* @return All remote instances, the first result represents the capability defined first in the capability object,
* the second result the second capability and so on.
*
* @see <a href="https://webdriver.io/docs/multiremote">External document and example usage</a>.
*/
export const multiremote = async function (params, { automationProtocol } = {}) {
const multibrowser = new MultiRemote();
const browserNames = Object.keys(params);
/**
* create all instance sessions
*/
await Promise.all(browserNames.map(async (browserName) => {
const instance = await remote(params[browserName]);
return multibrowser.addInstance(browserName, instance);
}));
/**
* use attachToSession capability to wrap instances around blank pod
*/
const prototype = getPrototype('browser');
const sessionParams = isStub(automationProtocol) ? undefined : {
sessionId: '',
isW3C: multibrowser.instances[browserNames[0]].isW3C,
logLevel: multibrowser.instances[browserNames[0]].options.logLevel
};
const ProtocolDriver = automationProtocol && isStub(automationProtocol)
? (await import(automationProtocol)).default
: WebDriver;
const driver = ProtocolDriver.attachToSession(sessionParams, multibrowser.modifier.bind(multibrowser), prototype, wrapCommand);
/**
* in order to get custom command overwritten or added to multiremote instance
* we need to pass in the prototype of the multibrowser
*/
if (!isStub(automationProtocol)) {
const origAddCommand = driver.addCommand.bind(driver);
driver.addCommand = (name, fn, attachToElement) => {
return origAddCommand(name, fn, attachToElement, Object.getPrototypeOf(multibrowser.baseInstance), multibrowser.instances);
};
const origOverwriteCommand = driver.overwriteCommand.bind(driver);
driver.overwriteCommand = (name, fn, attachToElement) => {
return origOverwriteCommand(name, fn, attachToElement, Object.getPrototypeOf(multibrowser.baseInstance), multibrowser.instances);
};
}
driver.addLocatorStrategy = addLocatorStrategyHandler(driver);
return driver;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBRWpDLE9BQU8sU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUl6QyxPQUFPLFdBQVcsTUFBTSxrQkFBa0IsQ0FBQTtBQUMxQyxPQUFPLHdCQUF3QixNQUFNLCtCQUErQixDQUFBO0FBQ3BFLE9BQU8sYUFBYSxNQUFNLDBCQUEwQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsNEJBQTRCLEVBQUUsR0FBRyxJQUFJLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ2hHLE9BQU8sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFJbEYsY0FBYyxZQUFZLENBQUE7QUFDMUIsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQTtBQUM5QixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQTtBQUUxRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxXQUN2QixNQUFxQixFQUNyQixjQUF1RztJQUV2RyxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFNBQWdCLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FB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