UNPKG

glance-selector

Version:
277 lines (230 loc) 11.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _log = require("../log"); var _log2 = _interopRequireDefault(_log); var _extensions = require("../utils/extensions"); var _extensions2 = _interopRequireDefault(_extensions); var _arrayUtils = require("../utils/array-utils"); var _isDescendant = require("../utils/is-descendant"); var _isDescendant2 = _interopRequireDefault(_isDescendant); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Locator = function () { function Locator() { _classCallCheck(this, Locator); } _createClass(Locator, null, [{ key: "locate", value: function locate(data, resultHandler) { var target = data.target, scopeElement = data.scopeElement, scopeElements = data.scopeElements, config = data.config, extensions = data.extensions; var parent = scopeElement; var locators = Locator.getLocators(target, extensions) || Locator.getDefaultLocators(extensions, config.defaultProperties); var locate = function locate(target, resultHandler) { return (0, _arrayUtils.reduce)(locators, [], function (elements, locator, handler) { return locator(target, function (err, e) { if (err) { return handler(err, []); } if (e.length > 0) { _log2.default.debug("Matched " + e.length); } elements = elements.concat(e); return handler(err, elements); }); }, resultHandler); }; var beforeLocate = Locator.locateBeforeFromLabel(target.label, extensions); var afterLocate = Locator.locateAfterFromLabel(target.label, extensions); Locator.beforeLocate(extensions).forEach(function (before) { return before(data); }); beforeLocate.forEach(function (before) { return before({ label: target.label }); }); return Locator.locateInParent(locate, [], parent, null, scopeElements, target, data, function (err, elements) { if (err) { return resultHandler(err, []); } afterLocate.forEach(function (after) { return after({ label: target.label }); }); Locator.afterLocate(extensions).forEach(function (after) { return after(data); }); return resultHandler(err, elements); }); } }, { key: "locateInParent", value: function locateInParent(locate, elements, parent, previousParent, scopeElements, target, data, resultHandler) { if (parent && elements.length == 0) { return locate(_extends({}, data, { label: target.label, scopeElement: parent }), function (err, foundElements) { if (err) { return resultHandler(err, []); } return browserExecute(function (node, handler) { return handler(null, { node: node, parentNode: node.parentNode, continue: node.parentNode != null && node.parentNode.outerHTML != null }); }, parent, function (err, result) { if (err) { return resultHandler(err, []); } var flattenedElements = [].concat(foundElements); flattenedElements = flattenedElements.filter(function (e) { return scopeElements.indexOf(e) == -1 || scopeElements.filter(function (s) { return (0, _isDescendant2.default)(s, e); }).length > 0; }); if (result.continue && flattenedElements.length == 0) { _log2.default.debug("Elements not found, trying parent"); return Locator.locateInParent(locate, [].concat(foundElements), result.parentNode, result.node, scopeElements, target, data, resultHandler); } return resultHandler(null, flattenedElements); }); }); } else { elements = elements.filter(function (e) { return scopeElements.indexOf(e) == -1 || scopeElements.filter(function (s) { return (0, _isDescendant2.default)(s, e); }).length > 0; }); return resultHandler(null, elements); } } }, { key: "getLocator", value: function getLocator(locator) { if (Object.prototype.toString.call(locator) === '[object Array]') { return locator.map(function (label) { return function (_ref, handler) { var glanceSelector = _ref.glanceSelector; return glanceSelector(label, handler); }; }); } else if (typeof locator == 'string') { return [function (_ref2, handler) { var glanceSelector = _ref2.glanceSelector; return glanceSelector(locator, handler); }]; } else if (typeof locator == 'function') { return [locator]; } return []; } }, { key: "getLocators", value: function getLocators(target, extensions) { var locators = []; var labels = _extensions2.default.labels(extensions); var properties = _extensions2.default.properties(extensions); if (labels[target.label]) { if (labels[target.label].locate) { locators = Locator.getLocator(labels[target.label].locate); } else { locators = Locator.getLocator(labels[target.label]); } } target.properties.forEach(function (name) { if (properties[name] && properties[name].locate) { locators = locators.concat(Locator.getLocator(properties[name].locate)); } else { var catchAlls = extensions.filter(function (e) { if (e.locator) { return e.locator.check({ label: target.label, target: target }); } return false; }); if (catchAlls.length > 0) { locators = locators.concat(catchAlls.map(function (e) { return e.locator.locate; })); } } }); return locators.length > 0 ? locators : null; } }, { key: "getDefaultLocators", value: function getDefaultLocators(extensions, defaultProperties) { var properties = _extensions2.default.properties(extensions); if (defaultProperties.length > 0) { var locators = extensions.filter(function (e) { return e.locator; }).map(function (e) { return function (data, callback) { var target = data.target; return e.locator.locate(_extends({}, data, { target: _extends({}, target, { properties: defaultProperties }) }), callback); }; }); var propertiesWithlocators = defaultProperties.filter(function (name) { return properties[name] && properties[name].locate; }); if (propertiesWithlocators.length != 0) { locators = locators.concat(propertiesWithlocators.map(function (name) { return properties[name].locate; })); } return locators; } return []; } }, { key: "locatorForLabel", value: function locatorForLabel(key, extensions) { return extensions.filter(function (e) { return e.labels && e.labels[key]; }).map(function (e) { return e.labels[key]; }); } }, { key: "locateBeforeFromLabel", value: function locateBeforeFromLabel(label, extensions) { return Locator.locatorForLabel(label, extensions).filter(function (e) { return e.beforeLocate; }).map(function (e) { return e.beforeLocate; }); } }, { key: "locateAfterFromLabel", value: function locateAfterFromLabel(label, extensions) { return Locator.locatorForLabel(label, extensions).filter(function (e) { return e.afterLocate; }).map(function (e) { return e.afterLocate; }); } }, { key: "beforeLocate", value: function beforeLocate(extensions) { return extensions.filter(function (e) { return e.beforeLocate; }).map(function (e) { return e.beforeLocate; }); } }, { key: "afterLocate", value: function afterLocate(extensions) { return extensions.filter(function (e) { return e.afterLocate; }).map(function (e) { return e.afterLocate; }); } }]); return Locator; }(); exports.default = Locator;