UNPKG

@sharegainltd/ngrid-cypress

Version:

Cypress Test Helpers For @sharegainltd/ngrid

123 lines 16.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getCypressElementCoordinates = void 0; function getPositionedCoordinates(x0, y0, width, height, position) { if (typeof position === "object" && position !== null) { const { x, y } = position; return [x0 + x, y0 + y]; } switch (position) { case "topLeft": return [x0, y0]; case "top": return [x0 + width / 2, y0]; case "topRight": return [x0 + width - 1, y0]; case "left": return [x0, y0 + height / 2]; case "right": return [x0 + width - 1, y0 + height / 2]; case "bottomLeft": return [x0, y0 + height - 1]; case "bottom": return [x0 + width / 2, y0 + height - 1]; case "bottomRight": return [x0 + width - 1, y0 + height - 1]; // center by default default: return [x0 + width / 2, y0 + height / 2]; } } /** * Scrolls the given htmlElement into view on the page. * The position the element is scrolled to can be customized with scrollBehavior. */ function scrollIntoView(htmlElement, scrollBehavior = "center") { let block; if (scrollBehavior === "top") { block = "start"; } else if (scrollBehavior === "bottom") { block = "end"; } else { block = scrollBehavior; } htmlElement.scrollIntoView({ block }); } // for cross origin domains .frameElement returns null so query using parentWindow // but when running using --disable-web-security it will return the frame element function getFrameElement(currentWindow) { if (currentWindow.frameElement) { // accessible for same-origin iframes // or when running with --disable-web-security return currentWindow.frameElement; } // fallback to querying using the parent window, mainly to grab the AUT iframe // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return [...Array.from(currentWindow.parent.document.querySelectorAll("iframe"))].find((iframe) => iframe.contentWindow === currentWindow); } function getIframesPositionShift(element) { let currentWindow = element.ownerDocument.defaultView; const noPositionShift = { frameScale: 1, frameX: 0, frameY: 0, }; if (!currentWindow) { return noPositionShift; } // eslint-disable-next-line prefer-const const iframes = []; while (currentWindow !== window.top) { iframes.push(getFrameElement(currentWindow)); currentWindow = currentWindow.parent; } return iframes.reduceRight(({ frameX, frameY, frameScale }, frame) => { const { x, y, width } = frame.getBoundingClientRect(); return { frameX: frameX + x * frameScale, frameY: frameY + y * frameScale, frameScale: frameScale * (width / frame.offsetWidth), }; }, noPositionShift); } /** * Returns the coordinates and size of a given Element, relative to the Cypress app <iframe>. * Accounts for any scaling on the iframes. */ function getElementPositionXY(htmlElement) { const { x: elementX, y: elementY, width, height, } = htmlElement.getBoundingClientRect(); const { frameScale, frameX, frameY } = getIframesPositionShift(htmlElement); return { x: frameX + elementX * frameScale, y: frameY + elementY * frameScale, width: width * frameScale, height: height * frameScale, }; } /** * Cypress Automation debugee is the whole tab. * This function returns the element coordinates relative to the whole tab root that can be used in CDP request. * @param jqueryEl the element to introspect */ function getCypressElementCoordinates(jqueryEl, position, scrollBehavior) { var _a; const htmlElement = jqueryEl.get(0); const cypressAppFrame = window.parent.document.querySelector("iframe"); if (!cypressAppFrame) { throw new Error("Can not find cypress application iframe, it looks like critical issue. Please rise an issue on GitHub."); } const effectiveScrollBehavior = ((_a = scrollBehavior !== null && scrollBehavior !== void 0 ? scrollBehavior : Cypress.config("scrollBehavior")) !== null && _a !== void 0 ? _a : "center"); if (effectiveScrollBehavior && typeof effectiveScrollBehavior !== "object") { scrollIntoView(htmlElement, effectiveScrollBehavior); } const { x, y, width, height } = getElementPositionXY(htmlElement); const [posX, posY] = getPositionedCoordinates(x, y, width, height, position !== null && position !== void 0 ? position : "center"); return { x: posX, y: posY, }; } exports.getCypressElementCoordinates = getCypressElementCoordinates; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0Q3lwcmVzc0VsZW1lbnRDb29yZGluYXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmdyaWQtY3lwcmVzcy9zcmMvbGliL2N5cHJlc3MtcmVhbC1ldmVudHMvZ2V0Q3lwcmVzc0VsZW1lbnRDb29yZGluYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFlQSxTQUFTLHdCQUF3QixDQUMvQixFQUFVLEVBQ1YsRUFBVSxFQUNWLEtBQWEsRUFDYixNQUFjLEVBQ2QsUUFBa0I7SUFFbEIsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtRQUNyRCxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQztRQUMxQixPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDekI7SUFFRCxRQUFRLFFBQVEsRUFBRTtRQUNoQixLQUFLLFNBQVM7WUFDWixPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xCLEtBQUssS0FBSztZQUNSLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM5QixLQUFLLFVBQVU7WUFDYixPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUIsS0FBSyxNQUFNO1lBQ1QsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9CLEtBQUssT0FBTztZQUNWLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNDLEtBQUssWUFBWTtZQUNmLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE1B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S0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsd0JBQXdCLENBQzNDLENBQUMsRUFDRCxDQUFDLEVBQ0QsS0FBSyxFQUNMLE1BQU0sRUFDTixRQUFRLGFBQVIsUUFBUSxjQUFSLFFBQVEsR0FBSSxRQUFRLENBQ3JCLENBQUM7SUFFRixPQUFPO1FBQ0wsQ0FBQyxFQUFFLElBQUk7UUFDUCxDQUFDLEVBQUUsSUFBSTtLQUNSLENBQUM7QUFDSixDQUFDO0FBbENELG9FQWtDQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFBvc2l0aW9uID1cbiAgfCBcInRvcExlZnRcIlxuICB8IFwidG9wXCJcbiAgfCBcInRvcFJpZ2h0XCJcbiAgfCBcImxlZnRcIlxuICB8IFwiY2VudGVyXCJcbiAgfCBcInJpZ2h0XCJcbiAgfCBcImJvdHRvbUxlZnRcIlxuICB8IFwiYm90dG9tXCJcbiAgfCBcImJvdHRvbVJpZ2h0XCJcbiAgfCB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG5cbnR5cGUgU2Nyb2xsQmVoYXZpb3JQb3NpdGlvbiA9IFwiY2VudGVyXCIgfCBcInRvcFwiIHwgXCJib3R0b21cIiB8IFwibmVhcmVzdFwiO1xuZXhwb3J0IHR5cGUgU2Nyb2xsQmVoYXZpb3JPcHRpb25zID0gU2Nyb2xsQmVoYXZpb3JQb3NpdGlvbiB8IGZhbHNlO1xuXG5mdW5jdGlvbiBnZXRQb3NpdGlvbmVkQ29vcmRpbmF0ZXMoXG4gIHgwOiBudW1iZXIsXG4gIHkwOiBudW1iZXIsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBwb3NpdGlvbjogUG9zaXRpb25cbikge1xuICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSBcIm9iamVjdFwiICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSBwb3NpdGlvbjtcbiAgICByZXR1cm4gW3gwICsgeCwgeTAgKyB5XTtcbiAgfVxuXG4gIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICBjYXNlIFwidG9wTGVmdFwiOlxuICAgICAgcmV0dXJuIFt4MCwgeTBdO1xuICAgIGNhc2UgXCJ0b3BcIjpcbiAgICAgIHJldHVybiBbeDAgKyB3aWR0aCAvIDIsIHkwXTtcbiAgICBjYXNlIFwidG9wUmlnaHRcIjpcbiAgICAgIHJldHVybiBbeDAgKyB3aWR0aCAtIDEsIHkwXTtcbiAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgcmV0dXJuIFt4MCwgeTAgKyBoZWlnaHQgLyAyXTtcbiAgICBjYXNlIFwicmlnaHRcIjpcbiAgICAgIHJldHVybiBbeDAgKyB3aWR0aCAtIDEsIHkwICsgaGVpZ2h0IC8gMl07XG4gICAgY2FzZSBcImJvdHRvbUxlZnRcIjpcbiAgICAgIHJldHVybiBbeDAsIHkwICsgaGVpZ2h0IC0gMV07XG4gICAgY2FzZSBcImJvdHRvbVwiOlxuICAgICAgcmV0dXJuIFt4MCArIHdpZHRoIC8gMiwgeTAgKyBoZWlnaHQgLSAxXTtcbiAgICBjYXNlIFwiYm90dG9tUmlnaHRcIjpcbiAgICAgIHJldHVybiBbeDAgKyB3aWR0aCAtIDEsIHkwICsgaGVpZ2h0IC0gMV07XG4gICAgLy8gY2VudGVyIGJ5IGRlZmF1bHRcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFt4MCArIHdpZHRoIC8gMiwgeTAgKyBoZWlnaHQgLyAyXTtcbiAgfVxufVxuLyoqXG4gKiBTY3JvbGxzIHRoZSBnaXZlbiBodG1sRWxlbWVudCBpbnRvIHZpZXcgb24gdGhlIHBhZ2UuXG4gKiBUaGUgcG9zaXRpb24gdGhlIGVsZW1lbnQgaXMgc2Nyb2xsZWQgdG8gY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aCBzY3JvbGxCZWhhdmlvci5cbiAqL1xuZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcoXG4gIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgc2Nyb2xsQmVoYXZpb3I6IFNjcm9sbEJlaGF2aW9yUG9zaXRpb24gPSBcImNlbnRlclwiXG4pIHtcbiAgbGV0IGJsb2NrOiBTY3JvbGxMb2dpY2FsUG9zaXRpb247XG5cbiAgaWYgKHNjcm9sbEJlaGF2aW9yID09PSBcInRvcFwiKSB7XG4gICAgYmxvY2sgPSBcInN0YXJ0XCI7XG4gIH0gZWxzZSBpZiAoc2Nyb2xsQmVoYXZpb3IgPT09IFwiYm90dG9tXCIpIHtcbiAgICBibG9jayA9IFwiZW5kXCI7XG4gIH0gZWxzZSB7XG4gICAgYmxvY2sgPSBzY3JvbGxCZWhhdmlvcjtcbiAgfVxuXG4gIGh0bWxFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmxvY2sgfSk7XG59XG5cbi8vIGZvciBjcm9zcyBvcmlnaW4gZG9tYWlucyAuZnJhbWVFbGVtZW50IHJldHVybnMgbnVsbCBzbyBxdWVyeSB1c2luZyBwYXJlbnRXaW5kb3dcbi8vIGJ1dCB3aGVuIHJ1bm5pbmcgdXNpbmcgLS1kaXNhYmxlLXdlYi1zZWN1cml0eSBpdCB3aWxsIHJldHVybiB0aGUgZnJhbWUgZWxlbWVudFxuZnVuY3Rpb24gZ2V0RnJhbWVFbGVtZW50KGN1cnJlbnRXaW5kb3c6IFdpbmRvdyk6IEhUTUxFbGVtZW50IHtcbiAgaWYgKGN1cnJlbnRXaW5kb3cuZnJhbWVFbGVtZW50KSB7XG4gICAgLy8gYWNjZXNzaWJsZSBmb3Igc2FtZS1vcmlnaW4gaWZyYW1lc1xuICAgIC8vIG9yIHdoZW4gcnVubmluZyB3aXRoIC0tZGlzYWJsZS13ZWItc2VjdXJpdHlcbiAgICByZXR1cm4gY3VycmVudFdpbmRvdy5mcmFtZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gIH1cblxuICAvLyBmYWxsYmFjayB0byBxdWVyeWluZyB1c2luZyB0aGUgcGFyZW50IHdpbmRvdywgbWFpbmx5IHRvIGdyYWIgdGhlIEFVVCBpZnJhbWVcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgcmV0dXJuIFsuLi5BcnJheS5mcm9tKGN1cnJlbnRXaW5kb3cucGFyZW50LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJpZnJhbWVcIikpXS5maW5kKFxuICAgIChpZnJhbWUpID0+IGlmcmFtZS5jb250ZW50V2luZG93ID09PSBjdXJyZW50V2luZG93XG4gICkhO1xufVxuXG5mdW5jdGlvbiBnZXRJZnJhbWVzUG9zaXRpb25TaGlmdChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICBsZXQgY3VycmVudFdpbmRvdzogV2luZG93IHwgbnVsbCA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgY29uc3Qgbm9Qb3NpdGlvblNoaWZ0ID0ge1xuICAgIGZyYW1lU2NhbGU6IDEsXG4gICAgZnJhbWVYOiAwLFxuICAgIGZyYW1lWTogMCxcbiAgfTtcblxuICBpZiAoIWN1cnJlbnRXaW5kb3cpIHtcbiAgICByZXR1cm4gbm9Qb3NpdGlvblNoaWZ0O1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBjb25zdCBpZnJhbWVzID0gW107XG5cbiAgd2hpbGUgKGN1cnJlbnRXaW5kb3cgIT09IHdpbmRvdy50b3ApIHtcbiAgICBpZnJhbWVzLnB1c2goZ2V0RnJhbWVFbGVtZW50KGN1cnJlbnRXaW5kb3cpKTtcbiAgICBjdXJyZW50V2luZG93ID0gY3VycmVudFdpbmRvdy5wYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gaWZyYW1lcy5yZWR1Y2VSaWdodCgoeyBmcmFtZVgsIGZyYW1lWSwgZnJhbWVTY2FsZSB9LCBmcmFtZSkgPT4ge1xuICAgIGNvbnN0IHsgeCwgeSwgd2lkdGggfSA9IGZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZyYW1lWDogZnJhbWVYICsgeCAqIGZyYW1lU2NhbGUsXG4gICAgICBmcmFtZVk6IGZyYW1lWSArIHkgKiBmcmFtZVNjYWxlLFxuICAgICAgZnJhbWVTY2FsZTogZnJhbWVTY2FsZSAqICh3aWR0aCAvIGZyYW1lLm9mZnNldFdpZHRoKSxcbiAgICB9XG4gIH0sIG5vUG9zaXRpb25TaGlmdClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyBhbmQgc2l6ZSBvZiBhIGdpdmVuIEVsZW1lbnQsIHJlbGF0aXZlIHRvIHRoZSBDeXByZXNzIGFwcCA8aWZyYW1lPi5cbiAqIEFjY291bnRzIGZvciBhbnkgc2NhbGluZyBvbiB0aGUgaWZyYW1lcy5cbiAqL1xuZnVuY3Rpb24gZ2V0RWxlbWVudFBvc2l0aW9uWFkoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIGNvbnN0IHtcbiAgICB4OiBlbGVtZW50WCxcbiAgICB5OiBlbGVtZW50WSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gIH0gPSBodG1sRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICBjb25zdCB7IGZyYW1lU2NhbGUsIGZyYW1lWCwgZnJhbWVZIH0gPSBnZXRJZnJhbWVzUG9zaXRpb25TaGlmdChodG1sRWxlbWVudCk7XG5cbiAgcmV0dXJuIHtcbiAgICB4OiBmcmFtZVggKyBlbGVtZW50WCAqIGZyYW1lU2NhbGUsXG4gICAgeTogZnJhbWVZICsgZWxlbWVudFkgKiBmcmFtZVNjYWxlLFxuICAgIHdpZHRoOiB3aWR0aCAqIGZyYW1lU2NhbGUsXG4gICAgaGVpZ2h0OiBoZWlnaHQgKiBmcmFtZVNjYWxlLFxuICB9O1xufVxuXG4vKipcbiAqIEN5cHJlc3MgQXV0b21hdGlvbiBkZWJ1Z2VlIGlzIHRoZSB3aG9sZSB0YWIuXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVsZW1lbnQgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHdob2xlIHRhYiByb290IHRoYXQgY2FuIGJlIHVzZWQgaW4gQ0RQIHJlcXVlc3QuXG4gKiBAcGFyYW0ganF1ZXJ5RWwgdGhlIGVsZW1lbnQgdG8gaW50cm9zcGVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3lwcmVzc0VsZW1lbnRDb29yZGluYXRlcyhcbiAganF1ZXJ5RWw6IEpRdWVyeSxcbiAgcG9zaXRpb246IFBvc2l0aW9uIHwgdW5kZWZpbmVkLFxuICBzY3JvbGxCZWhhdmlvcj86IFNjcm9sbEJlaGF2aW9yT3B0aW9uc1xuKSB7XG4gIGNvbnN0IGh0bWxFbGVtZW50ID0ganF1ZXJ5RWwuZ2V0KDApO1xuICBjb25zdCBjeXByZXNzQXBwRnJhbWUgPSB3aW5kb3cucGFyZW50LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpZnJhbWVcIik7XG5cbiAgaWYgKCFjeXByZXNzQXBwRnJhbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkNhbiBub3QgZmluZCBjeXByZXNzIGFwcGxpY2F0aW9uIGlmcmFtZSwgaXQgbG9va3MgbGlrZSBjcml0aWNhbCBpc3N1ZS4gUGxlYXNlIHJpc2UgYW4gaXNzdWUgb24gR2l0SHViLlwiXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGVmZmVjdGl2ZVNjcm9sbEJlaGF2aW9yID0gKHNjcm9sbEJlaGF2aW9yID8/XG4gICAgQ3lwcmVzcy5jb25maWcoXCJzY3JvbGxCZWhhdmlvclwiKSA/P1xuICAgIFwiY2VudGVyXCIpIGFzIFNjcm9sbEJlaGF2aW9yT3B0aW9ucztcbiAgaWYgKGVmZmVjdGl2ZVNjcm9sbEJlaGF2aW9yICYmIHR5cGVvZiBlZmZlY3RpdmVTY3JvbGxCZWhhdmlvciAhPT0gXCJvYmplY3RcIikge1xuICAgIHNjcm9sbEludG9WaWV3KGh0bWxFbGVtZW50LCBlZmZlY3RpdmVTY3JvbGxCZWhhdmlvcik7XG4gIH1cblxuICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGdldEVsZW1lbnRQb3NpdGlvblhZKGh0bWxFbGVtZW50KTtcbiAgY29uc3QgW3Bvc1gsIHBvc1ldID0gZ2V0UG9zaXRpb25lZENvb3JkaW5hdGVzKFxuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgcG9zaXRpb24gPz8gXCJjZW50ZXJcIlxuICApO1xuXG4gIHJldHVybiB7XG4gICAgeDogcG9zWCxcbiAgICB5OiBwb3NZLFxuICB9O1xufSJdfQ==