@testim/testim-cli
Version:
Command line interface for running Testing on you CI
123 lines (95 loc) • 17 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
var _utilsErrorHandler = require('../utils/ErrorHandler');
var DEFAULT_SELECTOR = 'css selector';
var findStrategy = function findStrategy() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var value = args[0];
var relative = args.length > 1 ? args[1] : false;
var xpathPrefix = relative ? './' : '//';
/**
* set default selector
*/
var using = DEFAULT_SELECTOR;
if (typeof value !== 'string') {
throw new _utilsErrorHandler.ProtocolError('selector needs to be typeof `string`');
}
if (args.length === 3) {
return {
using: args[0],
value: args[1]
};
}
// check value type
// use id strategy if value starts with # and doesnt contain any other CSS selector-relevant character
if (value.indexOf('#') === 0 && value.search(/(\s|>|\.|[|])/) === -1) {
using = 'id';
value = value.slice(1);
// use xPath strategy if value starts with //
} else if (value.indexOf('/') === 0 || value.indexOf('(') === 0 || value.indexOf('../') === 0 || value.indexOf('./') === 0 || value.indexOf('*/') === 0) {
using = 'xpath';
// use link text startegy if value startes with =
} else if (value.indexOf('=') === 0) {
using = 'link text';
value = value.slice(1);
// use partial link text startegy if value startes with *=
} else if (value.indexOf('*=') === 0) {
using = 'partial link text';
value = value.slice(2);
// use tag name strategy if value contains a tag
// e.g. "<div>" or "<div />"
} else if (value.search(/<[a-zA-Z\-]+( \/)*>/g) >= 0) {
using = 'tag name';
value = value.replace(/<|>|\/|\s/g, '');
// use name strategy if value queries elements with name attributes
// e.g. "[name='myName']" or '[name="myName"]'
} else if (value.search(/^\[name=("|')([a-zA-z0-9\-_ ]+)("|')\]$/) >= 0) {
using = 'name';
value = value.match(/^\[name=("|')([a-zA-z0-9\-_ ]+)("|')\]$/)[2];
// any element with given text e.g. h1=Welcome
} else if (value.search(/^[a-z0-9]*=(.)+$/) >= 0) {
var query = value.split(/=/);
var tag = query.shift();
using = 'xpath';
value = '' + xpathPrefix + (tag.length ? tag : '*') + '[normalize-space() = "' + query.join('=') + '"]';
// any element containing given text
} else if (value.search(/^[a-z0-9]*\*=(.)+$/) >= 0) {
var query = value.split(/\*=/);
var tag = query.shift();
using = 'xpath';
value = '' + xpathPrefix + (tag.length ? tag : '*') + '[contains(., "' + query.join('*=') + '")]';
// any element with certian class or id + given content
} else if (value.search(/^[a-z0-9]*(\.|#)-?[_a-zA-Z]+[_a-zA-Z0-9-]*=(.)+$/) >= 0) {
var query = value.split(/=/);
var tag = query.shift();
var classOrId = tag.substr(tag.search(/(\.|#)/), 1) === '#' ? 'id' : 'class';
var classOrIdName = tag.slice(tag.search(/(\.|#)/) + 1);
tag = tag.substr(0, tag.search(/(\.|#)/));
using = 'xpath';
value = '' + xpathPrefix + (tag.length ? tag : '*') + '[contains(@' + classOrId + ', "' + classOrIdName + '") and normalize-space() = "' + query.join('=') + '"]';
// any element with certian class or id + has certain content
} else if (value.search(/^[a-z0-9]*(\.|#)-?[_a-zA-Z]+[_a-zA-Z0-9-]*\*=(.)+$/) >= 0) {
var query = value.split(/\*=/);
var tag = query.shift();
var classOrId = tag.substr(tag.search(/(\.|#)/), 1) === '#' ? 'id' : 'class';
var classOrIdName = tag.slice(tag.search(/(\.|#)/) + 1);
tag = tag.substr(0, tag.search(/(\.|#)/));
using = 'xpath';
value = xpathPrefix + (tag.length ? tag : '*') + '[contains(@' + classOrId + ', "' + classOrIdName + '") and contains(., "' + query.join('*=') + '")]';
value = '' + xpathPrefix + (tag.length ? tag : '*') + '[contains(@' + classOrId + ', "' + classOrIdName + '") and contains(., "' + query.join('*=') + '")]';
// allow to move up to the parent or select current element
} else if (value === '..' || value === '.') {
using = 'xpath';
}
return {
using: using,
value: value
};
};
exports['default'] = findStrategy;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oZWxwZXJzL2ZpbmRFbGVtZW50U3RyYXRlZ3kuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O2lDQUE4Qix1QkFBdUI7O0FBRXJELElBQU0sZ0JBQWdCLEdBQUcsY0FBYyxDQUFBOztBQUV2QyxJQUFJLFlBQVksR0FBRyxTQUFmLFlBQVksR0FBc0I7c0NBQU4sSUFBSTtBQUFKLFlBQUk7OztBQUNoQyxRQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbkIsUUFBSSxRQUFRLEdBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQUFBQyxDQUFBO0FBQ2xELFFBQUksV0FBVyxHQUFHLFFBQVEsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFBOzs7OztBQUt4QyxRQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQTs7QUFFNUIsUUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7QUFDM0IsY0FBTSxxQ0FBa0Isc0NBQXNDLENBQUMsQ0FBQTtLQUNsRTs7QUFFRCxRQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ25CLGVBQU87QUFDSCxpQkFBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDZCxpQkFBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDakIsQ0FBQTtLQUNKOzs7O0FBSUQsUUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ2xFLGFBQUssR0FBRyxJQUFJLENBQUE7QUFDWixhQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTs7O0tBR3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxL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LENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQTtBQUN0SixpREFBSyxRQUFNLFdBQVcsSUFBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUEsbUJBQWMsU0FBUyxXQUFNLGFBQWEsNEJBQXVCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQUssQ0FBQTs7O3lDQUd4SSxNQUFNLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssR0FBRyxFQUFFO0FBQ3hDLHFEQUFLLEdBQUcsT0FBTyxDQUFBOzZDQUNsQjs7QUFFRCxXQUFPO0FBQ0gsYUFBSyxFQUFFLEtBQUs7QUFDWixhQUFLLEVBQUUsS0FBSztLQUNmLENBQUE7Q0FDSixDQUFBOztxQkFFYyxZQUFZIiwiZmlsZSI6ImZpbmRFbGVtZW50U3RyYXRlZ3kuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm90b2NvbEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyJ1xuXG5jb25zdCBERUZBVUxUX1NFTEVDVE9SID0gJ2NzcyBzZWxlY3RvcidcblxubGV0IGZpbmRTdHJhdGVneSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgbGV0IHZhbHVlID0gYXJnc1swXVxuICAgIGxldCByZWxhdGl2ZSA9IChhcmdzLmxlbmd0aCA+IDEgPyBhcmdzWzFdIDogZmFsc2UpXG4gICAgbGV0IHhwYXRoUHJlZml4ID0gcmVsYXRpdmUgPyAnLi8nIDogJy8vJ1xuXG4gICAgLyoqXG4gICAgICogc2V0IGRlZmF1bHQgc2VsZWN0b3JcbiAgICAgKi9cbiAgICBsZXQgdXNpbmcgPSBERUZBVUxUX1NFTEVDVE9SXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFcnJvcignc2VsZWN0b3IgbmVlZHMgdG8gYmUgdHlwZW9mIGBzdHJpbmdgJylcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVzaW5nOiBhcmdzWzBdLFxuICAgICAgICAgICAgdmFsdWU6IGFyZ3NbMV1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNoZWNrIHZhbHVlIHR5cGVcbiAgICAvLyB1c2UgaWQgc3RyYXRlZ3kgaWYgdmFsdWUgc3RhcnRzIHdpdGggIyBhbmQgZG9lc250IGNvbnRhaW4gYW55IG90aGVyIENTUyBzZWxlY3Rvci1yZWxldmFudCBjaGFyYWN0ZXJcbiAgICBpZiAodmFsdWUuaW5kZXhPZignIycpID09PSAwICYmIHZhbHVlLnNlYXJjaCgvKFxcc3w+fFxcLnxbfF0pLykgPT09IC0xKSB7XG4gICAgICAgIHVzaW5nID0gJ2lkJ1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpXG5cbiAgICAvLyB1c2UgeFBhdGggc3RyYXRlZ3kgaWYgdmFsdWUgc3RhcnRzIHdpdGggLy9cbiAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJy8nKSA9PT0gMCB8fCB2YWx1ZS5pbmRleE9mKCcoJykgPT09IDAgfHxcbiAgICAgICAgICAgICAgIHZhbHVlLmluZGV4T2YoJy4uLycpID09PSAwIHx8IHZhbHVlLmluZGV4T2YoJy4vJykgPT09IDAgfHxcbiAgICAgICAgICAgICAgIHZhbHVlLmluZGV4T2YoJyovJykgPT09IDApIHtcbiAgICAgICAgdXNpbmcgPSAneHBhdGgnXG5cbiAgICAvLyB1c2UgbGluayB0ZXh0IHN0YXJ0ZWd5IGlmIHZhbHVlIHN0YXJ0ZXMgd2l0aCA9XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCc9JykgPT09IDApIHtcbiAgICAgICAgdXNpbmcgPSAnbGluayB0ZXh0J1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpXG5cbiAgICAvLyB1c2UgcGFydGlhbCBsaW5rIHRleHQgc3RhcnRlZ3kgaWYgdmFsdWUgc3RhcnRlcyB3aXRoICo9XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCcqPScpID09PSAwKSB7XG4gICAgICAgIHVzaW5nID0gJ3BhcnRpYWwgbGluayB0ZXh0J1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDIpXG5cbiAgICAvLyB1c2UgdGFnIG5hbWUgc3RyYXRlZ3kgaWYgdmFsdWUgY29udGFpbnMgYSB0YWdcbiAgICAvLyBlLmcuIFwiPGRpdj5cIiBvciBcIjxkaXYgLz5cIlxuICAgIH0gZWxzZSBpZiAodmFsdWUuc2VhcmNoKC88W2EtekEtWlxcLV0rKCBcXC8pKj4vZykgPj0gMCkge1xuICAgICAgICB1c2luZyA9ICd0YWcgbmFtZSdcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC88fD58XFwvfFxccy9nLCAnJylcblxuICAgIC8vIHVzZSBuYW1lIHN0cmF0ZWd5IGlmIHZhbHVlIHF1ZXJpZXMgZWxlbWVudHMgd2l0aCBuYW1lIGF0dHJpYnV0ZXNcbiAgICAvLyBlLmcuIFwiW25hbWU9J215TmFtZSddXCIgb3IgJ1tuYW1lPVwibXlOYW1lXCJdJ1xuICAgIH0gZWxzZSBpZiAodmFsdWUuc2VhcmNoKC9eXFxbbmFtZT0oXCJ8JykoW2EtekEtejAtOVxcLV8gXSspKFwifCcpXFxdJC8pID49IDApIHtcbiAgICAgICAgdXNpbmcgPSAnbmFtZSdcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXRjaCgvXlxcW25hbWU9KFwifCcpKFthLXpBLXowLTlcXC1fIF0rKShcInwnKVxcXSQvKVsyXVxuXG4gICAgLy8gYW55IGVsZW1lbnQgd2l0aCBnaXZlbiB0ZXh0IGUuZy4gaDE9V2VsY29tZVxuICAgIH0gZWxzZSBpZiAodmFsdWUuc2VhcmNoKC9eW2EtejAtOV0qPSguKSskLykgPj0gMCkge1xuICAgICAgICBsZXQgcXVlcnkgPSB2YWx1ZS5zcGxpdCgvPS8pXG4gICAgICAgIGxldCB0YWcgPSBxdWVyeS5zaGlmdCgpXG5cbiAgICAgICAgdXNpbmcgPSAneHBhdGgnXG4gICAgICAgIHZhbHVlID0gYCR7eHBhdGhQcmVmaXh9JHt0YWcubGVuZ3RoID8gdGFnIDogJyonfVtub3JtYWxpemUtc3BhY2UoKSA9IFwiJHtxdWVyeS5qb2luKCc9Jyl9XCJdYFxuXG4gICAgLy8gYW55IGVsZW1lbnQgY29udGFpbmluZyBnaXZlbiB0ZXh0XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5zZWFyY2goL15bYS16MC05XSpcXCo9KC4pKyQvKSA+PSAwKSB7XG4gICAgICAgIGxldCBxdWVyeSA9IHZhbHVlLnNwbGl0KC9cXCo9LylcbiAgICAgICAgbGV0IHRhZyA9IHF1ZXJ5LnNoaWZ0KClcblxuICAgICAgICB1c2luZyA9ICd4cGF0aCdcbiAgICAgICAgdmFsdWUgPSBgJHt4cGF0aFByZWZpeH0ke3RhZy5sZW5ndGggPyB0YWcgOiAnKid9W2NvbnRhaW5zKC4sIFwiJHtxdWVyeS5qb2luKCcqPScpfVwiKV1gXG5cbiAgICAvLyBhbnkgZWxlbWVudCB3aXRoIGNlcnRpYW4gY2xhc3Mgb3IgaWQgKyBnaXZlbiBjb250ZW50XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5zZWFyY2goL15bYS16MC05XSooXFwufCMpLT9bX2EtekEtWl0rW19hLXpBLVowLTktXSo9KC4pKyQvKSA+PSAwKSB7XG4gICAgICAgIGxldCBxdWVyeSA9IHZhbHVlLnNwbGl0KC89LylcbiAgICAgICAgbGV0IHRhZyA9IHF1ZXJ5LnNoaWZ0KClcblxuICAgICAgICBsZXQgY2xhc3NPcklkID0gdGFnLnN1YnN0cih0YWcuc2VhcmNoKC8oXFwufCMpLyksIDEpID09PSAnIycgPyAnaWQnIDogJ2NsYXNzJ1xuICAgICAgICBsZXQgY2xhc3NPcklkTmFtZSA9IHRhZy5zbGljZSh0YWcuc2VhcmNoKC8oXFwufCMpLykgKyAxKVxuXG4gICAgICAgIHRhZyA9IHRhZy5zdWJzdHIoMCwgdGFnLnNlYXJjaCgvKFxcLnwjKS8pKVxuICAgICAgICB1c2luZyA9ICd4cGF0aCdcbiAgICAgICAgdmFsdWUgPSBgJHt4cGF0aFByZWZpeH0ke3RhZy5sZW5ndGggPyB0YWcgOiAnKid9W2NvbnRhaW5zKEAke2NsYXNzT3JJZH0sIFwiJHtjbGFzc09ySWROYW1lfVwiKSBhbmQgbm9ybWFsaXplLXNwYWNlKCkgPSBcIiR7cXVlcnkuam9pbignPScpfVwiXWBcblxuICAgIC8vIGFueSBlbGVtZW50IHdpdGggY2VydGlhbiBjbGFzcyBvciBpZCArIGhhcyBjZXJ0YWluIGNvbnRlbnRcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnNlYXJjaCgvXlthLXowLTldKihcXC58IyktP1tfYS16QS1aXStbX2EtekEtWjAtOS1dKlxcKj0oLikrJC8pID49IDApIHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gdmFsdWUuc3BsaXQoL1xcKj0vKVxuICAgICAgICBsZXQgdGFnID0gcXVlcnkuc2hpZnQoKVxuXG4gICAgICAgIGxldCBjbGFzc09ySWQgPSB0YWcuc3Vic3RyKHRhZy5zZWFyY2goLyhcXC58IykvKSwgMSkgPT09ICcjJyA/ICdpZCcgOiAnY2xhc3MnXG4gICAgICAgIGxldCBjbGFzc09ySWROYW1lID0gdGFnLnNsaWNlKHRhZy5zZWFyY2goLyhcXC58IykvKSArIDEpXG5cbiAgICAgICAgdGFnID0gdGFnLnN1YnN0cigwLCB0YWcuc2VhcmNoKC8oXFwufCMpLykpXG4gICAgICAgIHVzaW5nID0gJ3hwYXRoJ1xuICAgICAgICB2YWx1ZSA9IHhwYXRoUHJlZml4ICsgKHRhZy5sZW5ndGggPyB0YWcgOiAnKicpICsgJ1tjb250YWlucyhAJyArIGNsYXNzT3JJZCArICcsIFwiJyArIGNsYXNzT3JJZE5hbWUgKyAnXCIpIGFuZCBjb250YWlucyguLCBcIicgKyBxdWVyeS5qb2luKCcqPScpICsgJ1wiKV0nXG4gICAgICAgIHZhbHVlID0gYCR7eHBhdGhQcmVmaXh9JHt0YWcubGVuZ3RoID8gdGFnIDogJyonfVtjb250YWlucyhAJHtjbGFzc09ySWR9LCBcIiR7Y2xhc3NPcklkTmFtZX1cIikgYW5kIGNvbnRhaW5zKC4sIFwiJHtxdWVyeS5qb2luKCcqPScpfVwiKV1gXG5cbiAgICAvLyBhbGxvdyB0byBtb3ZlIHVwIHRvIHRoZSBwYXJlbnQgb3Igc2VsZWN0IGN1cnJlbnQgZWxlbWVudFxuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICcuLicgfHwgdmFsdWUgPT09ICcuJykge1xuICAgICAgICB1c2luZyA9ICd4cGF0aCdcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB1c2luZzogdXNpbmcsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZmluZFN0cmF0ZWd5XG4iXX0=