glance-selector
Version:
Glance selector library
277 lines (230 loc) • 11.1 kB
JavaScript
;
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;