@sharegainltd/ngrid-cypress
Version:
Cypress Test Helpers For @sharegainltd/ngrid
123 lines • 16.9 kB
JavaScript
;
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==