@qavajs/steps-wdio
Version:
qavajs steps to interact with webdriverio
149 lines • 5.35 kB
JavaScript
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
;