UNPKG

@qavajs/steps-wdio

Version:

qavajs steps to interact with webdriverio

149 lines 5.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ChainItem = exports.locator = exports.Selector = void 0; exports.query = query; exports.element = element; class Selector { constructor(selector, type) { this.type = 'simple'; this.selector = selector; if (type) { this.type = type; } } /** * Define current locator as component * @param { new () => void } component */ as(component) { this.component = component; return this; } } exports.Selector = Selector; const locator = function locator(selector) { return new Selector(selector); }; exports.locator = locator; exports.locator.template = function (selector) { return new Selector(selector, 'template'); }; exports.locator.native = function (selector) { return new Selector(selector, 'native'); }; exports.locator.as = function (component) { const selector = new Selector(null); selector.component = component; return selector; }; class ChainItem { constructor({ alias, argument, selector, type }) { this.alias = alias; this.argument = argument; this.selector = selector; this.type = type; } } exports.ChainItem = ChainItem; function query(root, path) { var _a; const elements = path.split(/\s*>\s*/); const tokens = []; let currentComponent = typeof root === 'function' ? new root() : root; let currentAlias = 'App'; for (const element of elements) { const groups = (_a = element.match(/^(?<alias>.+?)(?:\((?<argument>.+)\))?$/)) === null || _a === void 0 ? void 0 : _a.groups; const alias = groups.alias.replace(/\s/g, ''); if (!currentComponent) throw new Error(`Alias '${currentAlias}' is not a component`); let currentElement = currentComponent[alias]; if (!currentElement && (!currentComponent.defaultResolver || typeof currentComponent.defaultResolver !== 'function')) { throw new Error(`Alias '${alias}' has not been found in '${currentAlias}'`); } if (!currentElement && currentComponent.defaultResolver) { currentElement = {}; currentElement.selector = currentComponent.defaultResolver({ alias: groups.alias, argument: groups.argument }); currentElement.type = 'native'; } currentAlias = groups.alias; currentComponent = currentElement.component ? new currentElement.component() : null; tokens.push(new ChainItem({ alias, argument: groups.argument, selector: currentElement.selector, type: currentElement.type, })); } return tokens; } function element(path) { const chain = query(this.config.pageObject, path); const driver = this.wdio.driver; const logger = this; const logItem = (item) => `.$('${item.type === 'template' ? item.selector(item.argument) : item.selector}')`; const log = (logChain) => logger.log(`${path} -> ${logChain.replace(/^\./, '')}`); const getter = function () { let current = driver; let logChain = ''; for (const item of chain) { logChain += logItem(item); switch (item.type) { case 'simple': current = item.selector ? current.$(item.selector) : current; break; case 'template': current = current.$(item.selector(item.argument)); break; case 'native': current = item.selector({ browser: driver, driver, parent: current, argument: item.argument }); break; } } log(logChain); return current; }; getter.collection = function () { let current = driver; let logChain = ''; for (let i = 0; i < chain.length; i++) { const item = chain[i]; logChain += logItem(item); if (i === chain.length - 1) { log(logChain); switch (item.type) { case 'simple': return current.$$(item.selector); case 'template': return current.$$(item.selector(item.argument)); case 'native': return item.selector({ browser: driver, driver, parent: current, argument: item.argument }); } } switch (item.type) { case 'simple': current = item.selector ? current.$(item.selector) : current; break; case 'template': current = current.$(item.selector(item.argument)); break; case 'native': current = item.selector({ browser: driver, driver, parent: current, argument: item.argument }); break; } } }; return getter; } //# sourceMappingURL=pageObject.js.map