@luminati-io/webdriverio8
Version:
Next-gen browser and mobile automation test framework for Node.js
60 lines (58 loc) • 4.27 kB
JavaScript
import { getElement } from '../../utils/getElementObject.js';
import { getBrowserObject } from '../../utils/index.js';
import { ELEMENT_KEY } from '../../constants.js';
/**
*
* The `custom$` allows you to use a custom strategy declared by using `browser.addLocatorStrategy`.
* Read more on custom selector stratgies in the [Selector docs](../../selectors#custom-selector-strategies).
*
* <example>
:example.js
it('should fetch the project title', async () => {
await browser.url('https://webdriver.io')
await browser.addLocatorStrategy('myStrat', (selector) => {
return document.querySelectorAll(selector)
})
const header = await browser.custom$('myStrat', 'header')
const projectTitle = await header.custom$('myStrat', '.projectTitle')
console.log(projectTitle.getText()) // WEBDRIVER I/O
})
* </example>
*
* @alias custom$
* @param {string} strategyName
* @param {*} strategyArguments
* @example https://github.com/webdriverio/example-recipes/blob/f5730428ec3605e856e90bf58be17c9c9da891de/queryElements/customStrategy.js#L2-L11
* @example https://github.com/webdriverio/example-recipes/blob/f5730428ec3605e856e90bf58be17c9c9da891de/queryElements/example.html#L8-L12
* @example https://github.com/webdriverio/example-recipes/blob/f5730428ec3605e856e90bf58be17c9c9da891de/queryElements/customStrategy.js#L16-L19
* @return {Element}
*/
export async function custom$(strategyName, ...strategyArguments) {
const browserObject = getBrowserObject(this);
const strategy = browserObject.strategies.get(strategyName);
if (!strategy) {
throw Error('No strategy found for ' + strategyName);
}
/**
* fail if root element is not found, similar to:
* $('.notExisting').$('.someElem')
*/
if (!this.elementId) {
throw Error(`Can't call custom$ on element with selector "${this.selector}" because element wasn't found`);
}
const strategyRef = { strategy, strategyName, strategyArguments: [...strategyArguments, this] };
let res = await browserObject.execute(strategy, ...strategyArguments, this);
/**
* if the user's script returns multiple elements
* then we just return the first one as this method
* is intended to return just one element
*/
if (Array.isArray(res)) {
res = res[0];
}
if (res && typeof res[ELEMENT_KEY] === 'string') {
return await getElement.call(this, strategyRef, res);
}
return await getElement.call(this, strategyRef, new Error('no such element'));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tJC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9lbGVtZW50L2N1c3RvbSQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUdoRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBRXpCLFlBQW9CLEVBQ3BCLEdBQUcsaUJBQXdCO0lBRTNCLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzVDLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBMkIsQ0FBQTtJQUVyRixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDWixNQUFNLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxZQUFZLENBQUMsQ0FBQTtJQUN4RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsQixNQUFNLEtBQUssQ0FBQyxnREFBZ0QsSUFBSSxDQUFDLFFBQVEsZ0NBQWdDLENBQUMsQ0FBQTtJQUM5RyxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLENBQUMsR0FBRyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFBO0lBRS9GLElBQUksR0FBRyxHQUFHLE1BQU0sYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUUzRTs7OztPQUlHO0lBQ0gsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNoQixDQUFDO0lBRUQsSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUMsT0FBTyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUN4RCxDQUFDO0lBRUQsT0FBTyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7QUFDakYsQ0FBQyJ9