UNPKG

@browserstack/testcafe

Version:

Automated browser testing for the modern web development stack.

540 lines 90.5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const lodash_1 = require("lodash"); const builder_symbol_1 = __importDefault(require("../builder-symbol")); const snapshot_properties_1 = require("./snapshot-properties"); const get_callsite_1 = require("../../errors/get-callsite"); const client_function_builder_1 = __importDefault(require("../client-function-builder")); const re_executable_promise_1 = __importDefault(require("../../utils/re-executable-promise")); const type_assertions_1 = require("../../errors/runtime/type-assertions"); const make_reg_exp_1 = __importDefault(require("../../utils/make-reg-exp")); const selector_text_filter_1 = __importDefault(require("./selector-text-filter")); const selector_attribute_filter_1 = __importDefault(require("./selector-attribute-filter")); const prepare_api_args_1 = __importDefault(require("./prepare-api-args")); const VISIBLE_PROP_NAME = 'visible'; const filterNodes = (new client_function_builder_1.default((nodes, filter, querySelectorRoot, originNode, ...filterArgs) => { if (typeof filter === 'number') { const matchingNode = filter < 0 ? nodes[nodes.length + filter] : nodes[filter]; return matchingNode ? [matchingNode] : []; } const result = []; if (typeof filter === 'string') { // NOTE: we can search for elements only in document or element. if (querySelectorRoot.nodeType !== 1 && querySelectorRoot.nodeType !== 9) return null; const matching = querySelectorRoot.querySelectorAll(filter); const matchingArr = []; for (let i = 0; i < matching.length; i++) matchingArr.push(matching[i]); filter = node => matchingArr.indexOf(node) > -1; } if (typeof filter === 'function') { for (let j = 0; j < nodes.length; j++) { if (filter(nodes[j], j, originNode, ...filterArgs)) result.push(nodes[j]); } } return result; })).getFunction(); const expandSelectorResults = (new client_function_builder_1.default((selector, populateDerivativeNodes) => { const nodes = selector(); if (!nodes.length) return null; const result = []; for (let i = 0; i < nodes.length; i++) { const derivativeNodes = populateDerivativeNodes(nodes[i]); if (derivativeNodes) { for (let j = 0; j < derivativeNodes.length; j++) { if (result.indexOf(derivativeNodes[j]) < 0) result.push(derivativeNodes[j]); } } } return result; })).getFunction(); async function getSnapshot(getSelector, callsite, SelectorBuilder, getVisibleValueMode) { let node = null; const selector = new SelectorBuilder(getSelector(), { getVisibleValueMode, needError: true }, { instantiation: 'Selector' }).getFunction(); try { node = await selector(); } catch (err) { err.callsite = callsite; throw err; } return node; } function assertAddCustomDOMPropertiesOptions(properties) { type_assertions_1.assertType(type_assertions_1.is.nonNullObject, 'addCustomDOMProperties', '"addCustomDOMProperties" option', properties); Object.keys(properties).forEach(prop => { type_assertions_1.assertType(type_assertions_1.is.function, 'addCustomDOMProperties', `Custom DOM properties method '${prop}'`, properties[prop]); }); } function assertAddCustomMethods(properties, opts) { type_assertions_1.assertType(type_assertions_1.is.nonNullObject, 'addCustomMethods', '"addCustomMethods" option', properties); if (opts !== void 0) type_assertions_1.assertType(type_assertions_1.is.nonNullObject, 'addCustomMethods', '"addCustomMethods" option', opts); Object.keys(properties).forEach(prop => { type_assertions_1.assertType(type_assertions_1.is.function, 'addCustomMethods', `Custom method '${prop}'`, properties[prop]); }); } function getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, additionalDependencies) { return Object.assign({}, options, { selectorFn, apiFn, filter, additionalDependencies }); } function addSnapshotProperties(obj, getSelector, SelectorBuilder, properties) { properties.forEach(prop => { Object.defineProperty(obj, prop, { get: () => { const callsite = get_callsite_1.getCallsiteForMethod('get'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder); return snapshot[prop]; }); } }); }); } function addVisibleProperty({ obj, getSelector, SelectorBuilder }) { Object.defineProperty(obj, VISIBLE_PROP_NAME, { get: () => { const callsite = get_callsite_1.getCallsiteForMethod('get'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder, true); return !!snapshot && snapshot[VISIBLE_PROP_NAME]; }); } }); } function addCustomMethods(obj, getSelector, SelectorBuilder, customMethods) { const customMethodProps = customMethods ? Object.keys(customMethods) : []; customMethodProps.forEach(prop => { const { returnDOMNodes = false, method } = customMethods[prop]; const dependencies = { customMethod: method, selector: getSelector() }; const callsiteNames = { instantiation: prop }; if (returnDOMNodes) { obj[prop] = (...args) => { const selectorFn = () => { /* eslint-disable no-undef */ const nodes = selector(); return customMethod.apply(customMethod, [nodes].concat(args)); /* eslint-enable no-undef */ }; const apiFn = prepare_api_args_1.default(prop, ...args); const filter = () => true; const additionalDependencies = { args, customMethod: method }; return createDerivativeSelectorWithFilter({ getSelector, SelectorBuilder, selectorFn, apiFn, filter, additionalDependencies }); }; } else { obj[prop] = (new client_function_builder_1.default((...args) => { /* eslint-disable no-undef */ const node = selector(); return customMethod.apply(customMethod, [node].concat(args)); /* eslint-enable no-undef */ }, { dependencies }, callsiteNames)).getFunction(); } }); } exports.addCustomMethods = addCustomMethods; function prepareSnapshotPropertyList(customDOMProperties) { let properties = [...snapshot_properties_1.SNAPSHOT_PROPERTIES]; // NOTE: The 'visible' snapshot property has a separate handler. lodash_1.pull(properties, VISIBLE_PROP_NAME); if (customDOMProperties) properties = properties.concat(Object.keys(customDOMProperties)); return properties; } function addSnapshotPropertyShorthands({ obj, getSelector, SelectorBuilder, customDOMProperties, customMethods }) { const properties = prepareSnapshotPropertyList(customDOMProperties); addSnapshotProperties(obj, getSelector, SelectorBuilder, properties); addCustomMethods(obj, getSelector, SelectorBuilder, customMethods); obj.getStyleProperty = prop => { const callsite = get_callsite_1.getCallsiteForMethod('getStyleProperty'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder); return snapshot.style ? snapshot.style[prop] : void 0; }); }; obj.getAttribute = attrName => { const callsite = get_callsite_1.getCallsiteForMethod('getAttribute'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder); return snapshot.attributes ? snapshot.attributes[attrName] : void 0; }); }; obj.hasAttribute = attrName => { const callsite = get_callsite_1.getCallsiteForMethod('hasAttribute'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder); return snapshot.attributes ? snapshot.attributes.hasOwnProperty(attrName) : false; }); }; obj.getBoundingClientRectProperty = prop => { const callsite = get_callsite_1.getCallsiteForMethod('getBoundingClientRectProperty'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder); return snapshot.boundingClientRect ? snapshot.boundingClientRect[prop] : void 0; }); }; obj.hasClass = name => { const callsite = get_callsite_1.getCallsiteForMethod('hasClass'); return re_executable_promise_1.default.fromFn(async () => { const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder); return snapshot.classNames ? snapshot.classNames.indexOf(name) > -1 : false; }); }; } function createCounter(getSelector, SelectorBuilder) { const builder = new SelectorBuilder(getSelector(), { counterMode: true }, { instantiation: 'Selector' }); const counter = builder.getFunction(); const callsite = get_callsite_1.getCallsiteForMethod('get'); return async () => { try { return await counter(); } catch (err) { err.callsite = callsite; throw err; } }; } function addCounterProperties({ obj, getSelector, SelectorBuilder }) { Object.defineProperty(obj, 'count', { get: () => { const counter = createCounter(getSelector, SelectorBuilder); return re_executable_promise_1.default.fromFn(() => counter()); } }); Object.defineProperty(obj, 'exists', { get: () => { const counter = createCounter(getSelector, SelectorBuilder); return re_executable_promise_1.default.fromFn(async () => await counter() > 0); } }); } function convertFilterToClientFunctionIfNecessary(callsiteName, filter, dependencies) { if (typeof filter === 'function') { const builder = filter[builder_symbol_1.default]; const fn = builder ? builder.fn : filter; const options = builder ? lodash_1.assign({}, builder.options, { dependencies }) : { dependencies }; return (new client_function_builder_1.default(fn, options, { instantiation: callsiteName })).getFunction(); } return filter; } function createDerivativeSelectorWithFilter({ getSelector, SelectorBuilder, selectorFn, apiFn, filter, additionalDependencies }) { const collectionModeSelectorBuilder = new SelectorBuilder(getSelector(), { collectionMode: true }); const customDOMProperties = collectionModeSelectorBuilder.options.customDOMProperties; const customMethods = collectionModeSelectorBuilder.options.customMethods; let dependencies = { selector: collectionModeSelectorBuilder.getFunction(), filter: filter, filterNodes: filterNodes }; const { boundTestRun, timeout, visibilityCheck, apiFnChain } = collectionModeSelectorBuilder.options; dependencies = lodash_1.assign(dependencies, additionalDependencies); const builder = new SelectorBuilder(selectorFn, { dependencies, customDOMProperties, customMethods, boundTestRun, timeout, visibilityCheck, apiFnChain, apiFn }, { instantiation: 'Selector' }); return builder.getFunction(); } const filterByText = convertFilterToClientFunctionIfNecessary('filter', selector_text_filter_1.default); const filterByAttr = convertFilterToClientFunctionIfNecessary('filter', selector_attribute_filter_1.default); function ensureRegExpContext(str) { // NOTE: if a regexp is created in a separate context (via the 'vm' module) we // should wrap it with new RegExp() to make the `instanceof RegExp` check successful. if (typeof str !== 'string' && !(str instanceof RegExp)) return new RegExp(str); return str; } function addFilterMethods(options) { const { obj, getSelector, SelectorBuilder } = options; obj.nth = index => { type_assertions_1.assertType(type_assertions_1.is.number, 'nth', '"index" argument', index); const apiFn = prepare_api_args_1.default('nth', index); const builder = new SelectorBuilder(getSelector(), { index, apiFn }, { instantiation: 'Selector' }); return builder.getFunction(); }; obj.withText = text => { type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withText', '"text" argument', text); const apiFn = prepare_api_args_1.default('withText', text); text = ensureRegExpContext(text); const selectorFn = () => { /* eslint-disable no-undef */ const nodes = selector(); if (!nodes.length) return null; return filterNodes(nodes, filter, document, void 0, textRe); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByText, { textRe: make_reg_exp_1.default(text) }); return createDerivativeSelectorWithFilter(args); }; obj.withExactText = text => { type_assertions_1.assertType(type_assertions_1.is.string, 'withExactText', '"text" argument', text); const selectorFn = () => { /* eslint-disable no-undef */ const nodes = selector(); if (!nodes.length) return null; return filterNodes(nodes, filter, document, void 0, exactText); /* eslint-enable no-undef */ }; const apiFn = prepare_api_args_1.default('withExactText', text); const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByText, { exactText: text }); return createDerivativeSelectorWithFilter(args); }; obj.withAttribute = (attrName, attrValue) => { type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withAttribute', '"attrName" argument', attrName); const apiFn = prepare_api_args_1.default('withAttribute', attrName, attrValue); attrName = ensureRegExpContext(attrName); if (attrValue !== void 0) { type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withAttribute', '"attrValue" argument', attrValue); attrValue = ensureRegExpContext(attrValue); } const selectorFn = () => { /* eslint-disable no-undef */ const nodes = selector(); if (!nodes.length) return null; return filterNodes(nodes, filter, document, void 0, attrName, attrValue); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByAttr, { attrName, attrValue }); return createDerivativeSelectorWithFilter(args); }; obj.filter = (filter, dependencies) => { type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function], 'filter', '"filter" argument', filter); const apiFn = prepare_api_args_1.default('filter', filter); filter = convertFilterToClientFunctionIfNecessary('filter', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ const nodes = selector(); if (!nodes.length) return null; return filterNodes(nodes, filter, document, void 0); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter); return createDerivativeSelectorWithFilter(args); }; obj.filterVisible = () => { const apiFn = prepare_api_args_1.default('filterVisible'); const builder = new SelectorBuilder(getSelector(), { filterVisible: true, apiFn }, { instantiation: 'Selector' }); return builder.getFunction(); }; obj.filterHidden = () => { const apiFn = prepare_api_args_1.default('filterHidden'); const builder = new SelectorBuilder(getSelector(), { filterHidden: true, apiFn }, { instantiation: 'Selector' }); return builder.getFunction(); }; } function addCustomDOMPropertiesMethod({ obj, getSelector, SelectorBuilder }) { obj.addCustomDOMProperties = customDOMProperties => { assertAddCustomDOMPropertiesOptions(customDOMProperties); const builder = new SelectorBuilder(getSelector(), { customDOMProperties }, { instantiation: 'Selector' }); return builder.getFunction(); }; } function addCustomMethodsMethod({ obj, getSelector, SelectorBuilder }) { obj.addCustomMethods = function (methods, opts) { assertAddCustomMethods(methods, opts); const customMethods = {}; Object.keys(methods).forEach(methodName => { customMethods[methodName] = { method: methods[methodName], returnDOMNodes: opts && !!opts.returnDOMNodes }; }); const builder = new SelectorBuilder(getSelector(), { customMethods }, { instantiation: 'Selector' }); return builder.getFunction(); }; } function addHierarchicalSelectors(options) { const { obj } = options; // Find obj.find = (filter, dependencies) => { type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function], 'find', '"filter" argument', filter); const apiFn = prepare_api_args_1.default('find', filter); filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { if (typeof filter === 'string') { return typeof node.querySelectorAll === 'function' ? node.querySelectorAll(filter) : null; } const results = []; const visitNode = currentNode => { const cnLength = currentNode.childNodes.length; for (let i = 0; i < cnLength; i++) { const child = currentNode.childNodes[i]; results.push(child); visitNode(child); } }; visitNode(node); return filterNodes(results, filter, null, node); }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; // Parent obj.parent = (filter, dependencies) => { if (filter !== void 0) type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'parent', '"filter" argument', filter); const apiFn = prepare_api_args_1.default('parent', filter); filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { const parents = []; for (let parent = node.parentNode; parent; parent = parent.parentNode) parents.push(parent); return filter !== void 0 ? filterNodes(parents, filter, document, node) : parents; }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; // Child obj.child = (filter, dependencies) => { if (filter !== void 0) type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'child', '"filter" argument', filter); const apiFn = prepare_api_args_1.default('child', filter); filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { const childElements = []; const cnLength = node.childNodes.length; for (let i = 0; i < cnLength; i++) { const child = node.childNodes[i]; if (child.nodeType === 1) childElements.push(child); } return filter !== void 0 ? filterNodes(childElements, filter, node, node) : childElements; }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; // Sibling obj.sibling = (filter, dependencies) => { if (filter !== void 0) type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'sibling', '"filter" argument', filter); const apiFn = prepare_api_args_1.default('sibling', filter); filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { const parent = node.parentNode; if (!parent) return null; const siblings = []; const cnLength = parent.childNodes.length; for (let i = 0; i < cnLength; i++) { const child = parent.childNodes[i]; if (child.nodeType === 1 && child !== node) siblings.push(child); } return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings; }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; // Next sibling obj.nextSibling = (filter, dependencies) => { if (filter !== void 0) type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'nextSibling', '"filter" argument', filter); const apiFn = prepare_api_args_1.default('nextSibling', filter); filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { const parent = node.parentNode; if (!parent) return null; const siblings = []; const cnLength = parent.childNodes.length; let afterNode = false; for (let i = 0; i < cnLength; i++) { const child = parent.childNodes[i]; if (child === node) afterNode = true; else if (afterNode && child.nodeType === 1) siblings.push(child); } return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings; }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; // Prev sibling obj.prevSibling = (filter, dependencies) => { if (filter !== void 0) type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'prevSibling', '"filter" argument', filter); const apiFn = prepare_api_args_1.default('prevSibling', filter); filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies); const selectorFn = () => { /* eslint-disable no-undef */ return expandSelectorResults(selector, node => { const parent = node.parentNode; if (!parent) return null; const siblings = []; const cnLength = parent.childNodes.length; for (let i = 0; i < cnLength; i++) { const child = parent.childNodes[i]; if (child === node) break; if (child.nodeType === 1) siblings.push(child); } return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings; }); /* eslint-enable no-undef */ }; const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults }); return createDerivativeSelectorWithFilter(args); }; } function addAPI(selector, getSelector, SelectorBuilder, customDOMProperties, customMethods) { const options = { obj: selector, getSelector, SelectorBuilder, customDOMProperties, customMethods }; addFilterMethods(options); addHierarchicalSelectors(options); addSnapshotPropertyShorthands(options); addCustomDOMPropertiesMethod(options); addCustomMethodsMethod(options); addCounterProperties(options); addVisibleProperty(options); } exports.addAPI = addAPI; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGllbnQtZnVuY3Rpb25zL3NlbGVjdG9ycy9hZGQtYXBpLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQWdEO0FBQ2hELHVFQUE0RDtBQUM1RCwrREFBNEQ7QUFDNUQsNERBQWlFO0FBQ2pFLHlGQUErRDtBQUMvRCw4RkFBb0U7QUFDcEUsMEVBQXNFO0FBQ3RFLDRFQUFrRDtBQUNsRCxrRkFBd0Q7QUFDeEQsNEZBQWtFO0FBQ2xFLDBFQUFrRDtBQUVsRCxNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztBQUVwQyxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksaUNBQXFCLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxHQUFHLFVBQVUsRUFBRSxFQUFFO0lBQzNHLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1FBQzVCLE1BQU0sWUFBWSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0UsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUM3QztJQUVELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUVsQixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtRQUM1QixnRUFBZ0U7UUFDaEUsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsS0FBSyxDQUFDO1lBQ3BFLE9BQU8sSUFBSSxDQUFDO1FBRWhCLE1BQU0sUUFBUSxHQUFNLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFD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