New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

webdriver-image-comparison

Package Overview
Dependencies
Maintainers
2
Versions
74
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

webdriver-image-comparison - npm Package Compare versions

Comparing version 3.0.1 to 4.0.0

assets/ios/iphone15-bottom.png

74

CHANGELOG.md
# webdriver-image-comparison
## 4.0.0
### Major Changes
- ef386b6: # 💥 Breaking changes:
- `resizeDimensions` on the element can now only be an object, it has been deprecated for a while
# 💅 New Features
- Next to supporting Web snapshot testing this module now also supports 💥 **Native App** 💥 snapshot testing. The methods `saveElement|checkElement | saveScreen | checkScreen` and the matchers `toMatchElementSnapshot | toMatchScreenSnapshot` are available for **Native Apps**
> [!NOTE]
> This module will automatically detect the context (web | webview | native_app) and will handle all complex logic for you
The methods `saveFullPageScreen | checkFullPageScreen | saveTabbablePage|checkTabbablePage` will throw an error when they are used in the native context for native mobile apps and will look like this
```logs
$ wdio tests/configs/wdio.local.android.emus.app.conf.ts
Execution of 1 workers started at 2024-01-30T06:18:24.865Z
[0-0] RUNNING in Android - file:///tests/specs/mobile.app.spec.ts
[0-0] Error in "@wdio/visual-service mobile app.should compare a screen successful for 'Pixel_7_Pro_Android_14_API_34' in PORTRAIT-mode"
Error: The method saveFullPageScreen is not supported in native context for native mobile apps!
at /wdio/visual-testing/packages/webdriver-image-comparison/src/commands/saveFullPageScreen.ts:26:15
at step (/wdio/visual-testing/packages/webdriver-image-comparison/dist/commands/saveFullPageScreen.js:33:23)
at Object.next (/wdio/visual-testing/packages/webdriver-image-comparison/dist/commands/saveFullPageScreen.js:14:53)
at /wdio/visual-testing/packages/webdriver-image-comparison/dist/commands/saveFullPageScreen.js:8:71
at new Promise (<anonymous>)
at __awaiter (/wdio/visual-testing/packages/webdriver-image-comparison/dist/commands/saveFullPageScreen.js:4:12)
at saveFullPageScreen (/wdio/visual-testing/packages/webdriver-image-comparison/dist/commands/saveFullPageScreen.js:47:12)
at Browser.<anonymous> (file:///wdio/visual-testing/packages/service/dist/service.js:101:24)
[0-0] FAILED in Android - file:///tests/specs/mobile.app.spec.ts
"spec" Reporter:
------------------------------------------------------------------
[/wdio/visual-testing/apps/app.apk Android #0-0] Running: /wdio/visual-testing/apps/app.apk on Android
[/wdio/visual-testing/apps/app.apk Android #0-0] Session ID: c1101184-e3d5-42b5-a31f-8ebaa211f1a1
[/wdio/visual-testing/apps/app.apk Android #0-0]
[/wdio/visual-testing/apps/app.apk Android #0-0] » /tests/specs/mobile.app.spec.ts
[/wdio/visual-testing/apps/app.apk Android #0-0] @wdio/visual-service mobile app
[/wdio/visual-testing/apps/app.apk Android #0-0] ✖ should compare a screen successful for 'Pixel_7_Pro_Android_14_API_34' in PORTRAIT-mode
[/wdio/visual-testing/apps/app.apk Android #0-0]
[/wdio/visual-testing/apps/app.apk Android #0-0] 1 failing (1.5s)
[/wdio/visual-testing/apps/app.apk Android #0-0]
[/wdio/visual-testing/apps/app.apk Android #0-0] 1) @wdio/visual-service mobile app should compare a screen successful for 'Pixel_7_Pro_Android_14_API_34' in PORTRAIT-mode
[/wdio/visual-testing/apps/app.apk Android #0-0] The method saveFullPageScreen is not supported in native context for native mobile apps!
[/wdio/visual-testing/apps/app.apk Android #0-0] Error: The method saveFullPageScreen is not supported in native context for native mobile apps!
[/wdio/visual-testing/apps/app.apk Android #0-0] at /wdio/visual-testing/packages/webdriver-image-comparison/src/commands/saveFullPageScreen.ts:26:15
[/wdio/visual-testing/apps/app.apk Android #0-0] at step (/wdio/visual-testing/packages/webdriver-image-comparison/dist/commands/saveFullPageScreen.js:33:23)
[/wdio/visual-testing/apps/app.apk Android #0-0] at Object.next (/wdio/visual-testing/packages/webdriver-image-comparison/dist/commands/saveFullPageScreen.js:14:53)
[/wdio/visual-testing/apps/app.apk Android #0-0] at /wdio/visual-testing/packages/webdriver-image-comparison/dist/commands/saveFullPageScreen.js:8:71
[/wdio/visual-testing/apps/app.apk Android #0-0] at new Promise (<anonymous>)
[/wdio/visual-testing/apps/app.apk Android #0-0] at __awaiter (/wdio/visual-testing/packages/webdriver-image-comparison/dist/commands/saveFullPageScreen.js:4:12)
[/wdio/visual-testing/apps/app.apk Android #0-0] at saveFullPageScreen (/wdio/visual-testing/packages/webdriver-image-comparison/dist/commands/saveFullPageScreen.js:47:12)
[/wdio/visual-testing/apps/app.apk Android #0-0] at Browser.<anonymous> (file:///wdio/visual-testing/packages/service/dist/service.js:101:24)
Spec Files: 0 passed, 1 failed, 1 total (100% completed) in 00:00:11
error Command failed with exit code 1.
```
- `autoSaveBaseline` is true by default, so if no baseline images are present it will automatically create a new baseline
- Mobile screenshots of the complete screen now automatically exclude all native OS elements like the notification bar, home bar, address bar, and so on, the settings `blockOutSideBar | blockOutStatusBar |blockOutToolBar` are now all defaulted to `true`
-
# 🐛 Fixed bugs:
- element screenshots could also get resized dimensions, which would cut out a bigger portion around the element. This was failing when the dimensions got out of the boundaries of the official screenshot. This has now been fixed with:
- not going outside of the screenshot
- log extra warnings
## 3.0.1

@@ -4,0 +78,0 @@

2

dist/commands/check.interfaces.d.ts

@@ -0,1 +1,2 @@

import type { ChainablePromiseElement } from 'webdriverio';
import type { RectanglesOutput } from '../methods/rectangles.interfaces';

@@ -7,2 +8,3 @@ export interface CheckMethodOptions {

blockOutToolBar?: boolean;
ignore?: (RectanglesOutput | WebdriverIO.Element | ChainablePromiseElement<WebdriverIO.Element>)[];
ignoreAlpha?: boolean;

@@ -9,0 +11,0 @@ ignoreAntialiasing?: boolean;

4

dist/commands/checkElement.d.ts

@@ -5,4 +5,4 @@ import type { ImageCompareResult } from '../methods/images.interfaces';

import type { Folders } from '../base.interfaces';
import type { CheckElementOptions } from './element.interfaces';
export default function checkElement(methods: Methods, instanceData: InstanceData, folders: Folders, element: HTMLElement, tag: string, checkElementOptions: CheckElementOptions): Promise<ImageCompareResult | number>;
import type { CheckElementOptions, WicElement } from './element.interfaces';
export default function checkElement(methods: Methods, instanceData: InstanceData, folders: Folders, element: WicElement | HTMLElement, tag: string, checkElementOptions: CheckElementOptions, isNativeContext: boolean): Promise<ImageCompareResult | number>;
//# sourceMappingURL=checkElement.d.ts.map
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {

@@ -53,49 +42,10 @@ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }

Object.defineProperty(exports, "__esModule", { value: true });
var images_js_1 = require("../methods/images.js");
var utils_js_1 = require("../helpers/utils.js");
var saveElement_js_1 = __importDefault(require("./saveElement.js"));
var options_js_1 = require("../helpers/options.js");
function checkElement(methods, instanceData, folders, element, tag, checkElementOptions) {
var checkAppElement_js_1 = __importDefault(require("./checkAppElement.js"));
var checkWebElement_js_1 = __importDefault(require("./checkWebElement.js"));
function checkElement(methods, instanceData, folders, element, tag, checkElementOptions, isNativeContext) {
return __awaiter(this, void 0, void 0, function () {
var saveElementOptions, _a, devicePixelRatio, fileName, isLandscape, compareOptions, executeCompareOptions;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
saveElementOptions = {
wic: checkElementOptions.wic,
method: __assign(__assign(__assign(__assign(__assign({}, ('disableCSSAnimation' in checkElementOptions.method
? { disableCSSAnimation: checkElementOptions.method.disableCSSAnimation }
: {})), ('hideScrollBars' in checkElementOptions.method ? { hideScrollBars: checkElementOptions.method.hideScrollBars } : {})), ('resizeDimensions' in checkElementOptions.method
? { resizeDimensions: checkElementOptions.method.resizeDimensions }
: {})), { hideElements: checkElementOptions.method.hideElements || [] }), { removeElements: checkElementOptions.method.removeElements || [] }),
};
return [4, (0, saveElement_js_1.default)(methods, instanceData, folders, element, tag, saveElementOptions)];
case 1:
_a = _b.sent(), devicePixelRatio = _a.devicePixelRatio, fileName = _a.fileName, isLandscape = _a.isLandscape;
compareOptions = (0, options_js_1.methodCompareOptions)(checkElementOptions.method);
executeCompareOptions = {
devicePixelRatio: devicePixelRatio,
compareOptions: {
wic: checkElementOptions.wic.compareOptions,
method: compareOptions,
},
fileName: fileName,
folderOptions: {
autoSaveBaseline: checkElementOptions.wic.autoSaveBaseline,
actualFolder: folders.actualFolder,
baselineFolder: folders.baselineFolder,
diffFolder: folders.diffFolder,
browserName: instanceData.browserName,
deviceName: instanceData.deviceName,
isMobile: (0, utils_js_1.checkIsMobile)(instanceData.platformName),
savePerInstance: checkElementOptions.wic.savePerInstance,
},
isAndroidNativeWebScreenshot: instanceData.nativeWebScreenshot,
isHybridApp: checkElementOptions.wic.isHybridApp,
isLandscape: isLandscape,
logLevel: checkElementOptions.wic.logLevel,
platformName: instanceData.platformName,
};
return [2, (0, images_js_1.executeImageCompare)(methods.executor, executeCompareOptions)];
}
return __generator(this, function (_a) {
return [2, isNativeContext
? (0, checkAppElement_js_1.default)(methods, instanceData, folders, element, tag, checkElementOptions, isNativeContext)
: (0, checkWebElement_js_1.default)(methods, instanceData, folders, element, tag, checkElementOptions, isNativeContext)];
});

@@ -102,0 +52,0 @@ });

@@ -6,3 +6,3 @@ import type { ImageCompareResult } from '../methods/images.interfaces';

import type { CheckFullPageOptions } from './fullPage.interfaces';
export default function checkFullPageScreen(methods: Methods, instanceData: InstanceData, folders: Folders, tag: string, checkFullPageOptions: CheckFullPageOptions): Promise<ImageCompareResult | number>;
export default function checkFullPageScreen(methods: Methods, instanceData: InstanceData, folders: Folders, tag: string, checkFullPageOptions: CheckFullPageOptions, isNativeContext: boolean): Promise<ImageCompareResult | number>;
//# sourceMappingURL=checkFullPageScreen.d.ts.map

@@ -57,3 +57,3 @@ "use strict";

var options_js_1 = require("../helpers/options.js");
function checkFullPageScreen(methods, instanceData, folders, tag, checkFullPageOptions) {
function checkFullPageScreen(methods, instanceData, folders, tag, checkFullPageOptions, isNativeContext) {
return __awaiter(this, void 0, void 0, function () {

@@ -64,2 +64,5 @@ var saveFullPageOptions, _a, devicePixelRatio, fileName, isLandscape, compareOptions, executeCompareOptions;

case 0:
if (isNativeContext) {
throw new Error('The method checkFullPageScreen is not supported in native context for native mobile apps!');
}
saveFullPageOptions = {

@@ -73,3 +76,3 @@ wic: checkFullPageOptions.wic,

};
return [4, (0, saveFullPageScreen_js_1.default)(methods, instanceData, folders, tag, saveFullPageOptions)];
return [4, (0, saveFullPageScreen_js_1.default)(methods, instanceData, folders, tag, saveFullPageOptions, isNativeContext)];
case 1:

@@ -76,0 +79,0 @@ _a = _b.sent(), devicePixelRatio = _a.devicePixelRatio, fileName = _a.fileName, isLandscape = _a.isLandscape;

@@ -6,3 +6,3 @@ import type { ImageCompareResult } from '../methods/images.interfaces';

import type { CheckScreenOptions } from './screen.interfaces';
export default function checkScreen(methods: Methods, instanceData: InstanceData, folders: Folders, tag: string, checkScreenOptions: CheckScreenOptions): Promise<ImageCompareResult | number>;
export default function checkScreen(methods: Methods, instanceData: InstanceData, folders: Folders, tag: string, checkScreenOptions: CheckScreenOptions, isNativeContext: boolean): Promise<ImageCompareResult | number>;
//# sourceMappingURL=checkScreen.d.ts.map
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {

@@ -53,47 +42,10 @@ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }

Object.defineProperty(exports, "__esModule", { value: true });
var saveScreen_js_1 = __importDefault(require("./saveScreen.js"));
var images_js_1 = require("../methods/images.js");
var utils_js_1 = require("../helpers/utils.js");
var options_js_1 = require("../helpers/options.js");
function checkScreen(methods, instanceData, folders, tag, checkScreenOptions) {
var checkAppScreen_js_1 = __importDefault(require("./checkAppScreen.js"));
var checkWebScreen_js_1 = __importDefault(require("./checkWebScreen.js"));
function checkScreen(methods, instanceData, folders, tag, checkScreenOptions, isNativeContext) {
return __awaiter(this, void 0, void 0, function () {
var saveScreenOptions, _a, devicePixelRatio, fileName, isLandscape, methodCompareOptions, executeCompareOptions;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
saveScreenOptions = {
wic: checkScreenOptions.wic,
method: __assign(__assign(__assign(__assign({}, ('disableCSSAnimation' in checkScreenOptions.method
? { disableCSSAnimation: checkScreenOptions.method.disableCSSAnimation }
: {})), ('hideScrollBars' in checkScreenOptions.method ? { hideScrollBars: checkScreenOptions.method.hideScrollBars } : {})), { hideElements: checkScreenOptions.method.hideElements || [] }), { removeElements: checkScreenOptions.method.removeElements || [] }),
};
return [4, (0, saveScreen_js_1.default)(methods, instanceData, folders, tag, saveScreenOptions)];
case 1:
_a = _b.sent(), devicePixelRatio = _a.devicePixelRatio, fileName = _a.fileName, isLandscape = _a.isLandscape;
methodCompareOptions = (0, options_js_1.screenMethodCompareOptions)(checkScreenOptions.method);
executeCompareOptions = {
devicePixelRatio: devicePixelRatio,
compareOptions: {
wic: checkScreenOptions.wic.compareOptions,
method: methodCompareOptions,
},
fileName: fileName,
folderOptions: {
autoSaveBaseline: checkScreenOptions.wic.autoSaveBaseline,
actualFolder: folders.actualFolder,
baselineFolder: folders.baselineFolder,
diffFolder: folders.diffFolder,
browserName: instanceData.browserName,
deviceName: instanceData.deviceName,
isMobile: (0, utils_js_1.checkIsMobile)(instanceData.platformName),
savePerInstance: checkScreenOptions.wic.savePerInstance,
},
isAndroidNativeWebScreenshot: instanceData.nativeWebScreenshot,
isHybridApp: checkScreenOptions.wic.isHybridApp,
isLandscape: isLandscape,
logLevel: checkScreenOptions.wic.logLevel,
platformName: instanceData.platformName,
};
return [2, (0, images_js_1.executeImageCompare)(methods.executor, executeCompareOptions, true)];
}
return __generator(this, function (_a) {
return [2, isNativeContext
? (0, checkAppScreen_js_1.default)(methods, instanceData, folders, tag, checkScreenOptions, isNativeContext)
: (0, checkWebScreen_js_1.default)(methods, instanceData, folders, tag, checkScreenOptions, isNativeContext)];
});

@@ -100,0 +52,0 @@ });

@@ -6,3 +6,3 @@ import type { Methods } from '../methods/methods.interfaces';

import type { ImageCompareResult } from '..';
export default function checkTabbablePage(methods: Methods, instanceData: InstanceData, folders: Folders, tag: string, checkTabbableOptions: CheckTabbableOptions): Promise<ImageCompareResult | number>;
export default function checkTabbablePage(methods: Methods, instanceData: InstanceData, folders: Folders, tag: string, checkTabbableOptions: CheckTabbableOptions, isNativeContext: boolean): Promise<ImageCompareResult | number>;
//# sourceMappingURL=checkTabbablePage.d.ts.map

@@ -45,3 +45,3 @@ "use strict";

var checkFullPageScreen_js_1 = __importDefault(require("./checkFullPageScreen.js"));
function checkTabbablePage(methods, instanceData, folders, tag, checkTabbableOptions) {
function checkTabbablePage(methods, instanceData, folders, tag, checkTabbableOptions, isNativeContext) {
return __awaiter(this, void 0, void 0, function () {

@@ -51,6 +51,10 @@ var fullPageCompareData;

switch (_a.label) {
case 0: return [4, methods.executor(drawTabbableOnCanvas_js_1.default, checkTabbableOptions.wic.tabbableOptions)];
case 0:
if (isNativeContext) {
throw new Error('The method checkTabbablePage is not supported in native context for native mobile apps!');
}
return [4, methods.executor(drawTabbableOnCanvas_js_1.default, checkTabbableOptions.wic.tabbableOptions)];
case 1:
_a.sent();
return [4, (0, checkFullPageScreen_js_1.default)(methods, instanceData, folders, tag, checkTabbableOptions)];
return [4, (0, checkFullPageScreen_js_1.default)(methods, instanceData, folders, tag, checkTabbableOptions, isNativeContext)];
case 2:

@@ -57,0 +61,0 @@ fullPageCompareData = _a.sent();

@@ -0,1 +1,2 @@

import type { ChainablePromiseElement } from 'webdriverio';
import type { Folders } from '../base.interfaces';

@@ -13,3 +14,3 @@ import type { DefaultOptions } from '../helpers/options.interfaces';

hideScrollBars?: boolean;
resizeDimensions?: ResizeDimensions | number;
resizeDimensions?: ResizeDimensions;
toolBarShadowPadding?: number;

@@ -25,2 +26,3 @@ hideElements?: HTMLElement[];

}
export type WicElement = WebdriverIO.Element | ChainablePromiseElement<WebdriverIO.Element>;
//# sourceMappingURL=element.interfaces.d.ts.map

@@ -14,3 +14,3 @@ import type { Folders } from '../base.interfaces';

fullPageScrollTimeout?: number;
resizeDimensions?: ResizeDimensions | number;
resizeDimensions?: ResizeDimensions;
toolBarShadowPadding?: number;

@@ -17,0 +17,0 @@ hideElements?: HTMLElement[];

@@ -5,4 +5,4 @@ import type { ScreenshotOutput } from '../helpers/afterScreenshot.interfaces';

import type { Folders } from '../base.interfaces';
import type { SaveElementOptions } from './element.interfaces';
export default function saveElement(methods: Methods, instanceData: InstanceData, folders: Folders, element: HTMLElement, tag: string, saveElementOptions: SaveElementOptions): Promise<ScreenshotOutput>;
import type { SaveElementOptions, WicElement } from './element.interfaces';
export default function saveElement(methods: Methods, instanceData: InstanceData, folders: Folders, element: WicElement, tag: string, saveElementOptions: SaveElementOptions, isNativeContext: boolean): Promise<ScreenshotOutput>;
//# sourceMappingURL=saveElement.d.ts.map

@@ -42,124 +42,10 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
var screenshots_js_1 = require("../methods/screenshots.js");
var images_js_1 = require("../methods/images.js");
var beforeScreenshot_js_1 = __importDefault(require("../helpers/beforeScreenshot.js"));
var afterScreenshot_js_1 = __importDefault(require("../helpers/afterScreenshot.js"));
var rectangles_js_1 = require("../methods/rectangles.js");
var constants_js_1 = require("../helpers/constants.js");
var scrollElementIntoView_js_1 = __importDefault(require("../clientSideScripts/scrollElementIntoView.js"));
var utils_js_1 = require("../helpers/utils.js");
var scrollToPosition_js_1 = __importDefault(require("../clientSideScripts/scrollToPosition.js"));
function saveElement(methods, instanceData, folders, element, tag, saveElementOptions) {
var saveAppElement_js_1 = __importDefault(require("./saveAppElement.js"));
var saveWebElement_js_1 = __importDefault(require("./saveWebElement.js"));
function saveElement(methods, instanceData, folders, element, tag, saveElementOptions, isNativeContext) {
return __awaiter(this, void 0, void 0, function () {
var _a, addressBarShadowPadding, autoElementScroll, formatImageName, logLevel, savePerInstance, toolBarShadowPadding, executor, disableCSSAnimation, hideScrollBars, resizeDimensions, hideElements, removeElements, beforeOptions, enrichedInstanceData, browserName, browserVersion, deviceName, _b, devicePixelRatio, innerHeight, isLandscape, outerHeight, outerWidth, screenHeight, screenWidth, isAndroid, isAndroidNativeWebScreenshot, isIos, isMobile, isTestInBrowser, logName, name, platformName, platformVersion, currentPosition, base64Image, elementRectangleOptions, rectangles, croppedBase64Image, afterOptions;
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
_a = saveElementOptions.wic, addressBarShadowPadding = _a.addressBarShadowPadding, autoElementScroll = _a.autoElementScroll, formatImageName = _a.formatImageName, logLevel = _a.logLevel, savePerInstance = _a.savePerInstance, toolBarShadowPadding = _a.toolBarShadowPadding;
executor = methods.executor;
disableCSSAnimation = 'disableCSSAnimation' in saveElementOptions.method
? Boolean(saveElementOptions.method.disableCSSAnimation)
: saveElementOptions.wic.disableCSSAnimation;
hideScrollBars = 'hideScrollBars' in saveElementOptions.method
? Boolean(saveElementOptions.method.hideScrollBars)
: saveElementOptions.wic.hideScrollBars;
resizeDimensions = saveElementOptions.method.resizeDimensions || constants_js_1.DEFAULT_RESIZE_DIMENSIONS;
hideElements = saveElementOptions.method.hideElements || [];
removeElements = saveElementOptions.method.removeElements || [];
beforeOptions = {
instanceData: instanceData,
addressBarShadowPadding: addressBarShadowPadding,
disableCSSAnimation: disableCSSAnimation,
hideElements: hideElements,
logLevel: logLevel,
noScrollBars: hideScrollBars,
removeElements: removeElements,
toolBarShadowPadding: toolBarShadowPadding,
};
return [4, (0, beforeScreenshot_js_1.default)(executor, beforeOptions, true)];
case 1:
enrichedInstanceData = _c.sent();
browserName = enrichedInstanceData.browserName, browserVersion = enrichedInstanceData.browserVersion, deviceName = enrichedInstanceData.deviceName, _b = enrichedInstanceData.dimensions.window, devicePixelRatio = _b.devicePixelRatio, innerHeight = _b.innerHeight, isLandscape = _b.isLandscape, outerHeight = _b.outerHeight, outerWidth = _b.outerWidth, screenHeight = _b.screenHeight, screenWidth = _b.screenWidth, isAndroid = enrichedInstanceData.isAndroid, isAndroidNativeWebScreenshot = enrichedInstanceData.isAndroidNativeWebScreenshot, isIos = enrichedInstanceData.isIos, isMobile = enrichedInstanceData.isMobile, isTestInBrowser = enrichedInstanceData.isTestInBrowser, logName = enrichedInstanceData.logName, name = enrichedInstanceData.name, platformName = enrichedInstanceData.platformName, platformVersion = enrichedInstanceData.platformVersion;
if (!autoElementScroll) return [3, 4];
return [4, executor(scrollElementIntoView_js_1.default, element, addressBarShadowPadding)];
case 2:
currentPosition = _c.sent();
return [4, (0, utils_js_1.waitFor)(500)];
case 3:
_c.sent();
_c.label = 4;
case 4: return [4, (0, screenshots_js_1.takeBase64Screenshot)(methods.screenShot)];
case 5:
base64Image = _c.sent();
elementRectangleOptions = {
devicePixelRatio: devicePixelRatio || NaN,
innerHeight: innerHeight || NaN,
isAndroidNativeWebScreenshot: isAndroidNativeWebScreenshot,
isAndroid: isAndroid,
isIos: isIos,
isLandscape: isLandscape,
};
return [4, (0, rectangles_js_1.determineElementRectangles)({
executor: executor,
base64Image: base64Image,
options: elementRectangleOptions,
element: element,
})];
case 6:
rectangles = _c.sent();
if (!(autoElementScroll && currentPosition)) return [3, 8];
return [4, executor(scrollToPosition_js_1.default, currentPosition)];
case 7:
_c.sent();
_c.label = 8;
case 8: return [4, (0, images_js_1.makeCroppedBase64Image)({
addIOSBezelCorners: false,
base64Image: base64Image,
deviceName: deviceName,
devicePixelRatio: devicePixelRatio || NaN,
isIos: isIos,
isLandscape: isLandscape,
logLevel: logLevel,
rectangles: rectangles,
resizeDimensions: resizeDimensions,
})];
case 9:
croppedBase64Image = _c.sent();
afterOptions = {
actualFolder: folders.actualFolder,
base64Image: croppedBase64Image,
disableCSSAnimation: disableCSSAnimation,
filePath: {
browserName: browserName,
deviceName: deviceName,
isMobile: isMobile,
savePerInstance: savePerInstance,
},
fileName: {
browserName: browserName,
browserVersion: browserVersion,
deviceName: deviceName,
devicePixelRatio: devicePixelRatio || NaN,
formatImageName: formatImageName,
isMobile: isMobile,
isTestInBrowser: isTestInBrowser,
logName: logName,
name: name,
outerHeight: outerHeight || NaN,
outerWidth: outerWidth || NaN,
platformName: platformName,
platformVersion: platformVersion,
screenHeight: screenHeight || NaN,
screenWidth: screenWidth || NaN,
tag: tag,
},
hideElements: hideElements,
hideScrollBars: hideScrollBars,
isLandscape: isLandscape,
logLevel: logLevel,
platformName: instanceData.platformName,
removeElements: removeElements,
};
return [2, (0, afterScreenshot_js_1.default)(executor, afterOptions)];
}
return __generator(this, function (_a) {
return [2, isNativeContext
? (0, saveAppElement_js_1.default)(methods, instanceData, folders, element, tag, saveElementOptions, isNativeContext)
: (0, saveWebElement_js_1.default)(methods, instanceData, folders, element, tag, saveElementOptions, isNativeContext)];
});

@@ -166,0 +52,0 @@ });

@@ -6,3 +6,3 @@ import type { ScreenshotOutput } from '../helpers/afterScreenshot.interfaces';

import type { SaveFullPageOptions } from './fullPage.interfaces';
export default function saveFullPageScreen(methods: Methods, instanceData: InstanceData, folders: Folders, tag: string, saveFullPageOptions: SaveFullPageOptions): Promise<ScreenshotOutput>;
export default function saveFullPageScreen(methods: Methods, instanceData: InstanceData, folders: Folders, tag: string, saveFullPageOptions: SaveFullPageOptions, isNativeContext: boolean): Promise<ScreenshotOutput>;
//# sourceMappingURL=saveFullPageScreen.d.ts.map

@@ -46,3 +46,3 @@ "use strict";

var images_js_1 = require("../methods/images.js");
function saveFullPageScreen(methods, instanceData, folders, tag, saveFullPageOptions) {
function saveFullPageScreen(methods, instanceData, folders, tag, saveFullPageOptions, isNativeContext) {
return __awaiter(this, void 0, void 0, function () {

@@ -53,2 +53,5 @@ var _a, addressBarShadowPadding, formatImageName, isHybridApp, logLevel, savePerInstance, toolBarShadowPadding, disableCSSAnimation, hideScrollBars, fullPageScrollTimeout, hideElements, removeElements, hideAfterFirstScroll, beforeOptions, enrichedInstanceData, devicePixelRatio, isLandscape, fullPageScreenshotOptions, screenshotsData, fullPageBase64Image, afterOptions;

case 0:
if (isNativeContext) {
throw new Error('The method saveFullPageScreen is not supported in native context for native mobile apps!');
}
_a = saveFullPageOptions.wic, addressBarShadowPadding = _a.addressBarShadowPadding, formatImageName = _a.formatImageName, isHybridApp = _a.isHybridApp, logLevel = _a.logLevel, savePerInstance = _a.savePerInstance, toolBarShadowPadding = _a.toolBarShadowPadding;

@@ -92,3 +95,3 @@ disableCSSAnimation = 'disableCSSAnimation' in saveFullPageOptions.method

isHybridApp: isHybridApp,
isIos: enrichedInstanceData.isIos,
isIOS: enrichedInstanceData.isIOS,
isLandscape: isLandscape,

@@ -140,2 +143,3 @@ logLevel: logLevel,

isLandscape: isLandscape,
isNativeContext: false,
logLevel: logLevel,

@@ -142,0 +146,0 @@ platformName: instanceData.platformName,

@@ -6,3 +6,3 @@ import type { Methods } from '../methods/methods.interfaces';

import type { ScreenshotOutput } from '../helpers/afterScreenshot.interfaces';
export default function saveScreen(methods: Methods, instanceData: InstanceData, folders: Folders, tag: string, saveScreenOptions: SaveScreenOptions): Promise<ScreenshotOutput>;
export default function saveScreen(methods: Methods, instanceData: InstanceData, folders: Folders, tag: string, saveScreenOptions: SaveScreenOptions, isNativeContext: boolean): Promise<ScreenshotOutput>;
//# sourceMappingURL=saveScreen.d.ts.map

@@ -42,98 +42,10 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
var screenshots_js_1 = require("../methods/screenshots.js");
var images_js_1 = require("../methods/images.js");
var beforeScreenshot_js_1 = __importDefault(require("../helpers/beforeScreenshot.js"));
var afterScreenshot_js_1 = __importDefault(require("../helpers/afterScreenshot.js"));
var rectangles_js_1 = require("../methods/rectangles.js");
function saveScreen(methods, instanceData, folders, tag, saveScreenOptions) {
var saveAppScreen_js_1 = __importDefault(require("./saveAppScreen.js"));
var saveWebScreen_js_1 = __importDefault(require("./saveWebScreen.js"));
function saveScreen(methods, instanceData, folders, tag, saveScreenOptions, isNativeContext) {
return __awaiter(this, void 0, void 0, function () {
var _a, addressBarShadowPadding, addIOSBezelCorners, formatImageName, logLevel, savePerInstance, toolBarShadowPadding, disableCSSAnimation, hideScrollBars, hideElements, removeElements, beforeOptions, enrichedInstanceData, browserName, browserVersion, deviceName, _b, devicePixelRatio, innerHeight, innerWidth, isLandscape, outerHeight, outerWidth, screenHeight, screenWidth, isAndroidChromeDriverScreenshot, isAndroidNativeWebScreenshot, isIos, isMobile, isTestInBrowser, logName, name, platformName, platformVersion, base64Image, screenRectangleOptions, rectangles, croppedBase64Image, afterOptions;
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
_a = saveScreenOptions.wic, addressBarShadowPadding = _a.addressBarShadowPadding, addIOSBezelCorners = _a.addIOSBezelCorners, formatImageName = _a.formatImageName, logLevel = _a.logLevel, savePerInstance = _a.savePerInstance, toolBarShadowPadding = _a.toolBarShadowPadding;
disableCSSAnimation = 'disableCSSAnimation' in saveScreenOptions.method
? Boolean(saveScreenOptions.method.disableCSSAnimation)
: saveScreenOptions.wic.disableCSSAnimation;
hideScrollBars = 'hideScrollBars' in saveScreenOptions.method
? Boolean(saveScreenOptions.method.hideScrollBars)
: saveScreenOptions.wic.hideScrollBars;
hideElements = saveScreenOptions.method.hideElements || [];
removeElements = saveScreenOptions.method.removeElements || [];
beforeOptions = {
instanceData: instanceData,
addressBarShadowPadding: addressBarShadowPadding,
disableCSSAnimation: disableCSSAnimation,
hideElements: hideElements,
logLevel: logLevel,
noScrollBars: hideScrollBars,
removeElements: removeElements,
toolBarShadowPadding: toolBarShadowPadding,
};
return [4, (0, beforeScreenshot_js_1.default)(methods.executor, beforeOptions)];
case 1:
enrichedInstanceData = _c.sent();
browserName = enrichedInstanceData.browserName, browserVersion = enrichedInstanceData.browserVersion, deviceName = enrichedInstanceData.deviceName, _b = enrichedInstanceData.dimensions.window, devicePixelRatio = _b.devicePixelRatio, innerHeight = _b.innerHeight, innerWidth = _b.innerWidth, isLandscape = _b.isLandscape, outerHeight = _b.outerHeight, outerWidth = _b.outerWidth, screenHeight = _b.screenHeight, screenWidth = _b.screenWidth, isAndroidChromeDriverScreenshot = enrichedInstanceData.isAndroidChromeDriverScreenshot, isAndroidNativeWebScreenshot = enrichedInstanceData.isAndroidNativeWebScreenshot, isIos = enrichedInstanceData.isIos, isMobile = enrichedInstanceData.isMobile, isTestInBrowser = enrichedInstanceData.isTestInBrowser, logName = enrichedInstanceData.logName, name = enrichedInstanceData.name, platformName = enrichedInstanceData.platformName, platformVersion = enrichedInstanceData.platformVersion;
return [4, (0, screenshots_js_1.takeBase64Screenshot)(methods.screenShot)];
case 2:
base64Image = _c.sent();
screenRectangleOptions = {
devicePixelRatio: devicePixelRatio || NaN,
innerHeight: innerHeight || NaN,
innerWidth: innerWidth || NaN,
isAndroidChromeDriverScreenshot: isAndroidChromeDriverScreenshot,
isAndroidNativeWebScreenshot: isAndroidNativeWebScreenshot,
isIos: isIos,
isLandscape: isLandscape,
};
rectangles = (0, rectangles_js_1.determineScreenRectangles)(base64Image, screenRectangleOptions);
return [4, (0, images_js_1.makeCroppedBase64Image)({
addIOSBezelCorners: addIOSBezelCorners,
base64Image: base64Image,
deviceName: deviceName,
devicePixelRatio: devicePixelRatio || NaN,
isIos: isIos,
isLandscape: isLandscape,
logLevel: logLevel,
rectangles: rectangles,
})];
case 3:
croppedBase64Image = _c.sent();
afterOptions = {
actualFolder: folders.actualFolder,
base64Image: croppedBase64Image,
disableCSSAnimation: disableCSSAnimation,
filePath: {
browserName: browserName,
deviceName: deviceName,
isMobile: isMobile,
savePerInstance: savePerInstance,
},
fileName: {
browserName: browserName,
browserVersion: browserVersion,
deviceName: deviceName,
devicePixelRatio: devicePixelRatio || NaN,
formatImageName: formatImageName,
isMobile: isMobile,
isTestInBrowser: isTestInBrowser,
logName: logName,
name: name,
outerHeight: outerHeight || NaN,
outerWidth: outerWidth || NaN,
platformName: platformName,
platformVersion: platformVersion,
screenHeight: screenHeight || NaN,
screenWidth: screenWidth || NaN,
tag: tag,
},
hideElements: hideElements,
hideScrollBars: hideScrollBars,
isLandscape: isLandscape,
logLevel: logLevel,
platformName: instanceData.platformName,
removeElements: removeElements,
};
return [2, (0, afterScreenshot_js_1.default)(methods.executor, afterOptions)];
}
return __generator(this, function (_a) {
return [2, isNativeContext
? (0, saveAppScreen_js_1.default)(methods, instanceData, folders, tag, saveScreenOptions, isNativeContext)
: (0, saveWebScreen_js_1.default)(methods, instanceData, folders, tag, saveScreenOptions, isNativeContext)];
});

@@ -140,0 +52,0 @@ });

@@ -6,3 +6,3 @@ import type { ScreenshotOutput } from '../helpers/afterScreenshot.interfaces';

import type { SaveTabbableOptions } from './tabbable.interfaces';
export default function saveTabbablePage(methods: Methods, instanceData: InstanceData, folders: Folders, tag: string, saveTabbableOptions: SaveTabbableOptions): Promise<ScreenshotOutput>;
export default function saveTabbablePage(methods: Methods, instanceData: InstanceData, folders: Folders, tag: string, saveTabbableOptions: SaveTabbableOptions, isNativeContext: boolean): Promise<ScreenshotOutput>;
//# sourceMappingURL=saveTabbablePage.d.ts.map

@@ -45,3 +45,3 @@ "use strict";

var removeElementFromDom_js_1 = __importDefault(require("../clientSideScripts/removeElementFromDom.js"));
function saveTabbablePage(methods, instanceData, folders, tag, saveTabbableOptions) {
function saveTabbablePage(methods, instanceData, folders, tag, saveTabbableOptions, isNativeContext) {
return __awaiter(this, void 0, void 0, function () {

@@ -51,6 +51,10 @@ var fullPageData;

switch (_a.label) {
case 0: return [4, methods.executor(drawTabbableOnCanvas_js_1.default, saveTabbableOptions.wic.tabbableOptions)];
case 0:
if (isNativeContext) {
throw new Error('The method saveTabbablePage is not supported in native context for native mobile apps!');
}
return [4, methods.executor(drawTabbableOnCanvas_js_1.default, saveTabbableOptions.wic.tabbableOptions)];
case 1:
_a.sent();
return [4, (0, saveFullPageScreen_js_1.default)(methods, instanceData, folders, tag, saveTabbableOptions)];
return [4, (0, saveFullPageScreen_js_1.default)(methods, instanceData, folders, tag, saveTabbableOptions, isNativeContext)];
case 2:

@@ -57,0 +61,0 @@ fullPageData = _a.sent();

@@ -11,11 +11,12 @@ import type { LogLevel } from './options.interfaces';

base64Image: string;
disableCSSAnimation: boolean;
hideScrollBars: boolean;
disableCSSAnimation?: boolean;
hideScrollBars?: boolean;
filePath: ScreenshotFilePathOptions;
fileName: ScreenshotFileNameOptions;
hideElements: (HTMLElement | HTMLElement[])[];
hideElements?: (HTMLElement | HTMLElement[])[];
isLandscape: boolean;
isNativeContext: boolean;
logLevel: LogLevel;
platformName: string;
removeElements: (HTMLElement | HTMLElement[])[];
removeElements?: (HTMLElement | HTMLElement[])[];
}

@@ -38,4 +39,4 @@ export interface ScreenshotFilePathOptions {

name: string;
outerHeight: number;
outerWidth: number;
outerHeight?: number;
outerWidth?: number;
platformName: string;

@@ -42,0 +43,0 @@ platformVersion: string;

@@ -52,7 +52,7 @@ "use strict";

return __awaiter(this, void 0, void 0, function () {
var actualFolder, base64Image, disableCSSAnimation, fileNameOptions, filePath, hideElements, noScrollBars, isLandscape, logLevel, platformName, removeElements, path, fileName, e_1;
var actualFolder, base64Image, disableCSSAnimation, fileNameOptions, filePath, hideElements, noScrollBars, isLandscape, isNativeContext, logLevel, platformName, removeElements, path, fileName, e_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
actualFolder = options.actualFolder, base64Image = options.base64Image, disableCSSAnimation = options.disableCSSAnimation, fileNameOptions = options.fileName, filePath = options.filePath, hideElements = options.hideElements, noScrollBars = options.hideScrollBars, isLandscape = options.isLandscape, logLevel = options.logLevel, platformName = options.platformName, removeElements = options.removeElements;
actualFolder = options.actualFolder, base64Image = options.base64Image, disableCSSAnimation = options.disableCSSAnimation, fileNameOptions = options.fileName, filePath = options.filePath, hideElements = options.hideElements, noScrollBars = options.hideScrollBars, isLandscape = options.isLandscape, isNativeContext = options.isNativeContext, logLevel = options.logLevel, platformName = options.platformName, removeElements = options.removeElements;
path = (0, utils_js_1.getAndCreatePath)(actualFolder, filePath);

@@ -63,3 +63,3 @@ fileName = (0, utils_js_1.formatFileName)(fileNameOptions);

_a.sent();
if (!noScrollBars) return [3, 3];
if (!(!isNativeContext && noScrollBars)) return [3, 3];
return [4, executor(hideScrollbars_js_1.default, !noScrollBars)];

@@ -70,3 +70,4 @@ case 2:

case 3:
if (!(hideElements.length > 0 || removeElements.length > 0)) return [3, 7];
if (!(!isNativeContext &&
((hideElements && hideElements.length > 0) || (removeElements && removeElements.length > 0)))) return [3, 7];
_a.label = 4;

@@ -86,3 +87,3 @@ case 4:

case 7:
if (!(disableCSSAnimation || (0, utils_js_1.checkIsMobile)(platformName))) return [3, 9];
if (!(!isNativeContext && (disableCSSAnimation || (0, utils_js_1.checkIsMobile)(platformName)))) return [3, 9];
return [4, executor(removeElementFromDom_js_1.default, constants_js_1.CUSTOM_CSS_ID)];

@@ -89,0 +90,0 @@ case 8:

@@ -89,2 +89,3 @@ "use strict";

isLandscape: false,
isNativeContext: false,
logLevel: options_interfaces_1.LogLevel.debug,

@@ -91,0 +92,0 @@ hideElements: ['<div></div>'],

@@ -54,5 +54,18 @@ "use strict";

instanceData: {
appName: 'appName',
browserName: 'browserName',
browserVersion: 'browserVersion',
deviceName: 'deviceName',
devicePixelRatio: 1,
deviceScreenSize: {
height: 1,
width: 1,
},
devicePlatformRect: {
statusBar: { x: 0, y: 0, width: 0, height: 0 },
homeBar: { x: 0, y: 0, width: 0, height: 0 },
},
isAndroid: false,
isIOS: false,
isMobile: false,
logName: 'logName',

@@ -88,6 +101,19 @@ name: 'name',

instanceData: {
appName: 'appName',
browserName: 'browserName',
browserVersion: 'browserVersion',
deviceName: 'deviceName',
devicePixelRatio: 1,
deviceScreenSize: {
height: 1,
width: 1,
},
devicePlatformRect: {
statusBar: { x: 0, y: 0, width: 0, height: 0 },
homeBar: { x: 0, y: 0, width: 0, height: 0 },
},
logName: 'logName',
isAndroid: false,
isIOS: false,
isMobile: false,
name: 'name',

@@ -94,0 +120,0 @@ nativeWebScreenshot: false,

@@ -22,2 +22,3 @@ import type { IosOffsets } from './constants.interfaces';

export declare const DESKTOP = "desktop";
export declare const NOT_KNOWN = "not_known";
export declare const CUSTOM_CSS_ID = "pic-css";

@@ -78,2 +79,12 @@ export declare const DEFAULT_RESIZE_DIMENSIONS: Required<ResizeDimensions>;

};
13: {
STATUS_BAR: number;
ADDRESS_BAR: number;
TOOL_BAR: number;
};
14: {
STATUS_BAR: number;
ADDRESS_BAR: number;
TOOL_BAR: number;
};
};

@@ -80,0 +91,0 @@ export declare const IOS_OFFSETS: IosOffsets;

@@ -14,3 +14,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.supportedIosBezelDevices = exports.IOS_OFFSETS = exports.ANDROID_OFFSETS = exports.DEFAULT_TABBABLE_OPTIONS = exports.FULL_PAGE_SCROLL_TIMEOUT = exports.DEFAULT_RESIZE_DIMENSIONS = exports.CUSTOM_CSS_ID = exports.DESKTOP = exports.DEFAULT_SHADOW = exports.FOLDERS = exports.PLATFORMS = exports.DEFAULT_FORMAT_STRING = void 0;
exports.supportedIosBezelDevices = exports.IOS_OFFSETS = exports.ANDROID_OFFSETS = exports.DEFAULT_TABBABLE_OPTIONS = exports.FULL_PAGE_SCROLL_TIMEOUT = exports.DEFAULT_RESIZE_DIMENSIONS = exports.CUSTOM_CSS_ID = exports.NOT_KNOWN = exports.DESKTOP = exports.DEFAULT_SHADOW = exports.FOLDERS = exports.PLATFORMS = exports.DEFAULT_FORMAT_STRING = void 0;
exports.DEFAULT_FORMAT_STRING = '{tag}-{browserName}-{width}x{height}-dpr-{dpr}';

@@ -35,2 +35,3 @@ exports.PLATFORMS = {

exports.DESKTOP = 'desktop';
exports.NOT_KNOWN = 'not_known';
exports.CUSTOM_CSS_ID = 'pic-css';

@@ -73,2 +74,4 @@ exports.DEFAULT_RESIZE_DIMENSIONS = {

12: __assign({}, ANDROID_DEFAULT_OFFSETS),
13: __assign({}, ANDROID_DEFAULT_OFFSETS),
14: __assign({}, ANDROID_DEFAULT_OFFSETS),
};

@@ -311,2 +314,3 @@ exports.IOS_OFFSETS = {

'iphone14promax',
'iphone15',
'ipadmini',

@@ -313,0 +317,0 @@ 'ipadair',

@@ -18,17 +18,18 @@ "use strict";

function defaultOptions(options) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y;
return {
addressBarShadowPadding: options.addressBarShadowPadding || constants_js_1.DEFAULT_SHADOW.ADDRESS_BAR,
addressBarShadowPadding: (_a = options.addressBarShadowPadding) !== null && _a !== void 0 ? _a : constants_js_1.DEFAULT_SHADOW.ADDRESS_BAR,
autoElementScroll: Object.prototype.hasOwnProperty.call(options, 'autoElementScroll')
? Boolean(options.autoElementScroll)
: true,
addIOSBezelCorners: options.addIOSBezelCorners || false,
autoSaveBaseline: options.autoSaveBaseline || false,
clearFolder: options.clearRuntimeFolder || false,
formatImageName: options.formatImageName || constants_js_1.DEFAULT_FORMAT_STRING,
isHybridApp: options.isHybridApp || false,
logLevel: options.logLevel || options_interfaces_1.LogLevel.info,
savePerInstance: options.savePerInstance || false,
toolBarShadowPadding: options.toolBarShadowPadding || constants_js_1.DEFAULT_SHADOW.TOOL_BAR,
disableCSSAnimation: options.disableCSSAnimation || false,
fullPageScrollTimeout: options.fullPageScrollTimeout || constants_js_1.FULL_PAGE_SCROLL_TIMEOUT,
addIOSBezelCorners: (_b = options.addIOSBezelCorners) !== null && _b !== void 0 ? _b : false,
autoSaveBaseline: (_c = options.autoSaveBaseline) !== null && _c !== void 0 ? _c : true,
clearFolder: (_d = options.clearRuntimeFolder) !== null && _d !== void 0 ? _d : false,
formatImageName: (_e = options.formatImageName) !== null && _e !== void 0 ? _e : constants_js_1.DEFAULT_FORMAT_STRING,
isHybridApp: (_f = options.isHybridApp) !== null && _f !== void 0 ? _f : false,
logLevel: (_g = options.logLevel) !== null && _g !== void 0 ? _g : options_interfaces_1.LogLevel.info,
savePerInstance: (_h = options.savePerInstance) !== null && _h !== void 0 ? _h : false,
toolBarShadowPadding: (_j = options.toolBarShadowPadding) !== null && _j !== void 0 ? _j : constants_js_1.DEFAULT_SHADOW.TOOL_BAR,
disableCSSAnimation: (_k = options.disableCSSAnimation) !== null && _k !== void 0 ? _k : false,
fullPageScrollTimeout: (_l = options.fullPageScrollTimeout) !== null && _l !== void 0 ? _l : constants_js_1.FULL_PAGE_SCROLL_TIMEOUT,
hideScrollBars: Object.prototype.hasOwnProperty.call(options, 'hideScrollBars')

@@ -38,14 +39,14 @@ ? Boolean(options.hideScrollBars)

compareOptions: {
blockOutSideBar: !!options.blockOutSideBar,
blockOutStatusBar: !!options.blockOutStatusBar,
blockOutToolBar: !!options.blockOutToolBar,
ignoreAlpha: options.ignoreAlpha || false,
ignoreAntialiasing: options.ignoreAntialiasing || false,
ignoreColors: options.ignoreColors || false,
ignoreLess: options.ignoreLess || false,
ignoreNothing: options.ignoreNothing || false,
rawMisMatchPercentage: options.rawMisMatchPercentage || false,
returnAllCompareData: options.returnAllCompareData || false,
saveAboveTolerance: options.saveAboveTolerance || 0,
scaleImagesToSameSize: options.scaleImagesToSameSize || false,
blockOutSideBar: (_m = options.blockOutSideBar) !== null && _m !== void 0 ? _m : true,
blockOutStatusBar: (_o = options.blockOutStatusBar) !== null && _o !== void 0 ? _o : true,
blockOutToolBar: (_p = options.blockOutToolBar) !== null && _p !== void 0 ? _p : true,
ignoreAlpha: (_q = options.ignoreAlpha) !== null && _q !== void 0 ? _q : false,
ignoreAntialiasing: (_r = options.ignoreAntialiasing) !== null && _r !== void 0 ? _r : false,
ignoreColors: (_s = options.ignoreColors) !== null && _s !== void 0 ? _s : false,
ignoreLess: (_t = options.ignoreLess) !== null && _t !== void 0 ? _t : false,
ignoreNothing: (_u = options.ignoreNothing) !== null && _u !== void 0 ? _u : false,
rawMisMatchPercentage: (_v = options.rawMisMatchPercentage) !== null && _v !== void 0 ? _v : false,
returnAllCompareData: (_w = options.returnAllCompareData) !== null && _w !== void 0 ? _w : false,
saveAboveTolerance: (_x = options.saveAboveTolerance) !== null && _x !== void 0 ? _x : 0,
scaleImagesToSameSize: (_y = options.scaleImagesToSameSize) !== null && _y !== void 0 ? _y : false,
},

@@ -52,0 +53,0 @@ tabbableOptions: {

@@ -16,2 +16,6 @@ import type { FormatFileNameOptions, GetAddressBarShadowPaddingOptions, GetAndCreatePathOptions, GetToolBarShadowPaddingOptions, ScreenshotSize } from './utils.interfaces';

export declare function getScreenshotSize(screenshot: string, devicePixelRation?: number): ScreenshotSize;
export declare function getDevicePixelRatio(screenshot: string, deviceScreenSize: {
height: number;
width: number;
}): number;
export declare function getIosBezelImageNames(normalizedDeviceName: string): {

@@ -21,2 +25,3 @@ topImageName: string;

};
export declare function isObject(item: unknown): boolean;
//# sourceMappingURL=utils.d.ts.map

@@ -17,4 +17,4 @@ export interface GetAndCreatePathOptions {

name: string;
outerHeight: number;
outerWidth: number;
outerHeight?: number;
outerWidth?: number;
platformName: string;

@@ -21,0 +21,0 @@ platformVersion: string;

@@ -39,3 +39,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.getIosBezelImageNames = exports.getScreenshotSize = exports.waitFor = exports.calculateDprData = exports.getToolBarShadowPadding = exports.getAddressBarShadowPadding = exports.checkAndroidChromeDriverScreenshot = exports.checkAndroidNativeWebScreenshot = exports.checkTestInMobileBrowser = exports.checkTestInBrowser = exports.checkIsIos = exports.checkIsAndroid = exports.checkIsMobile = exports.formatFileName = exports.getAndCreatePath = void 0;
exports.isObject = exports.getIosBezelImageNames = exports.getDevicePixelRatio = exports.getScreenshotSize = exports.waitFor = exports.calculateDprData = exports.getToolBarShadowPadding = exports.getAddressBarShadowPadding = exports.checkAndroidChromeDriverScreenshot = exports.checkAndroidNativeWebScreenshot = exports.checkTestInMobileBrowser = exports.checkTestInBrowser = exports.checkIsIos = exports.checkIsAndroid = exports.checkIsMobile = exports.formatFileName = exports.getAndCreatePath = void 0;
var node_path_1 = require("node:path");

@@ -45,3 +45,3 @@ var constants_js_1 = require("./constants.js");

function getAndCreatePath(folder, options) {
var browserName = options.browserName, deviceName = options.deviceName, isMobile = options.isMobile, savePerInstance = options.savePerInstance;
var _a = options.browserName, browserName = _a === void 0 ? constants_js_1.NOT_KNOWN : _a, _b = options.deviceName, deviceName = _b === void 0 ? constants_js_1.NOT_KNOWN : _b, isMobile = options.isMobile, savePerInstance = options.savePerInstance;
var instanceName = (isMobile ? deviceName : "".concat(constants_js_1.DESKTOP, "_").concat(browserName)).replace(/ /g, '_');

@@ -55,15 +55,16 @@ var subFolder = savePerInstance ? instanceName : '';

function formatFileName(options) {
var _a = options.browserName, browserName = _a === void 0 ? constants_js_1.NOT_KNOWN : _a, _b = options.browserVersion, browserVersion = _b === void 0 ? constants_js_1.NOT_KNOWN : _b, _c = options.deviceName, deviceName = _c === void 0 ? constants_js_1.NOT_KNOWN : _c, devicePixelRatio = options.devicePixelRatio, isMobile = options.isMobile, screenHeight = options.screenHeight, screenWidth = options.screenWidth, _d = options.outerHeight, outerHeight = _d === void 0 ? screenHeight : _d, _e = options.outerWidth, outerWidth = _e === void 0 ? screenWidth : _e, isTestInBrowser = options.isTestInBrowser, name = options.name, platformName = options.platformName, platformVersion = options.platformVersion, tag = options.tag;
var defaults = {
browserName: options.browserName,
browserVersion: options.browserVersion,
deviceName: options.deviceName,
dpr: options.devicePixelRatio,
height: options.isMobile ? options.screenHeight : options.outerHeight,
browserName: browserName,
browserVersion: browserVersion,
deviceName: deviceName,
dpr: devicePixelRatio,
height: isMobile ? screenHeight : outerHeight,
logName: options.logName,
mobile: options.isMobile && options.isTestInBrowser ? options.browserName : options.isMobile ? 'app' : '',
name: options.name,
platformName: options.platformName,
platformVersion: options.platformVersion,
tag: options.tag,
width: options.isMobile ? options.screenWidth : options.outerWidth,
mobile: isMobile && isTestInBrowser ? browserName : isMobile ? 'app' : constants_js_1.NOT_KNOWN,
name: name,
platformName: platformName,
platformVersion: platformVersion,
tag: tag,
width: isMobile ? screenWidth : outerWidth,
};

@@ -110,4 +111,4 @@ var fileName = options.formatImageName;

var isAndroid = checkIsAndroid(platformName);
var isIos = checkIsIos(platformName);
return isTestInMobileBrowser && ((isAndroidNativeWebScreenshot && isAndroid) || isIos) && addShadowPadding
var isIOS = checkIsIos(platformName);
return isTestInMobileBrowser && ((isAndroidNativeWebScreenshot && isAndroid) || isIOS) && addShadowPadding
? addressBarShadowPadding

@@ -128,3 +129,3 @@ : 0;

function calculateDprData(data, devicePixelRatio) {
Object.keys(data).map(function (key) { return (data[key] = typeof data[key] === 'number' ? data[key] * devicePixelRatio : data[key]); });
Object.keys(data).map(function (key) { return (data[key] = typeof data[key] === 'number' ? Math.round(data[key] * devicePixelRatio) : data[key]); });
return data;

@@ -144,7 +145,13 @@ }

return {
height: Buffer.from(screenshot, 'base64').readUInt32BE(20) / devicePixelRation,
width: Buffer.from(screenshot, 'base64').readUInt32BE(16) / devicePixelRation,
height: Math.round(Buffer.from(screenshot, 'base64').readUInt32BE(20) / devicePixelRation),
width: Math.round(Buffer.from(screenshot, 'base64').readUInt32BE(16) / devicePixelRation),
};
}
exports.getScreenshotSize = getScreenshotSize;
function getDevicePixelRatio(screenshot, deviceScreenSize) {
var screenshotSize = getScreenshotSize(screenshot);
var devicePixelRatio = screenshotSize.width / deviceScreenSize.width;
return Math.round(devicePixelRatio);
}
exports.getDevicePixelRatio = getDevicePixelRatio;
function getIosBezelImageNames(normalizedDeviceName) {

@@ -229,2 +236,6 @@ var topImageName, bottomImageName;

break;
case 'iphone15':
topImageName = 'iphone15-top';
bottomImageName = 'iphone15-bottom';
break;
case 'ipadmini':

@@ -253,2 +264,6 @@ topImageName = 'ipadmini6th-top';

exports.getIosBezelImageNames = getIosBezelImageNames;
function isObject(item) {
return (typeof item === 'object' && item !== null) || typeof item === 'function';
}
exports.isObject = isObject;
//# sourceMappingURL=utils.js.map

@@ -12,2 +12,3 @@ import BaseClass from './base.js';

import { ImageCompareResult } from './methods/images.interfaces';
import { IOS_OFFSETS } from './helpers/constants.js';
export type { ScreenshotOutput } from './helpers/afterScreenshot.interfaces';

@@ -19,3 +20,3 @@ export type { CheckScreenMethodOptions, SaveScreenMethodOptions, } from './commands/screen.interfaces';

export type { InstanceData } from './methods/instanceData.interfaces';
export { BaseClass, ClassOptions, ImageCompareResult, saveScreen, saveElement, saveFullPageScreen, saveTabbablePage, checkScreen, checkElement, checkFullPageScreen, checkTabbablePage, };
export { BaseClass, ClassOptions, ImageCompareResult, IOS_OFFSETS, saveScreen, saveElement, saveFullPageScreen, saveTabbablePage, checkScreen, checkElement, checkFullPageScreen, checkTabbablePage, };
//# sourceMappingURL=index.d.ts.map

@@ -6,3 +6,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.checkTabbablePage = exports.checkFullPageScreen = exports.checkElement = exports.checkScreen = exports.saveTabbablePage = exports.saveFullPageScreen = exports.saveElement = exports.saveScreen = exports.BaseClass = void 0;
exports.checkTabbablePage = exports.checkFullPageScreen = exports.checkElement = exports.checkScreen = exports.saveTabbablePage = exports.saveFullPageScreen = exports.saveElement = exports.saveScreen = exports.IOS_OFFSETS = exports.BaseClass = void 0;
var base_js_1 = __importDefault(require("./base.js"));

@@ -26,2 +26,4 @@ exports.BaseClass = base_js_1.default;

exports.checkTabbablePage = checkTabbablePage_js_1.default;
var constants_js_1 = require("./helpers/constants.js");
Object.defineProperty(exports, "IOS_OFFSETS", { enumerable: true, get: function () { return constants_js_1.IOS_OFFSETS; } });
//# sourceMappingURL=index.js.map

@@ -1,8 +0,9 @@

import type { CroppedBase64Image, IgnoreBoxes, ImageCompareOptions, ImageCompareResult } from './images.interfaces';
import type { CroppedBase64Image, IgnoreBoxes, ImageCompareOptions, ImageCompareResult, ResizeDimensions } from './images.interfaces';
import type { FullPageScreenshotsData } from './screenshots.interfaces';
import type { Executor } from './methods.interfaces';
import type { Executor, GetElementRect, TakeScreenShot } from './methods.interfaces';
import { LogLevel } from '../helpers/options.interfaces';
import type { WicElement } from '../commands/element.interfaces.js';
export declare function checkBaselineImageExists(actualFilePath: string, baselineFilePath: string, autoSaveBaseline: boolean, logLevel: LogLevel): Promise<void>;
export declare function makeCroppedBase64Image({ addIOSBezelCorners, base64Image, deviceName, devicePixelRatio, isIos, isLandscape, logLevel, rectangles, resizeDimensions, }: CroppedBase64Image): Promise<string>;
export declare function executeImageCompare(executor: Executor, options: ImageCompareOptions, isViewPortScreenshot?: boolean): Promise<ImageCompareResult | number>;
export declare function makeCroppedBase64Image({ addIOSBezelCorners, base64Image, deviceName, devicePixelRatio, isIOS, isLandscape, logLevel, rectangles, resizeDimensions, }: CroppedBase64Image): Promise<string>;
export declare function executeImageCompare(executor: Executor, options: ImageCompareOptions, isViewPortScreenshot?: boolean, isNativeContext?: boolean): Promise<ImageCompareResult | number>;
export declare function makeFullPageBase64Image(screenshotsData: FullPageScreenshotsData, { devicePixelRatio, isLandscape }: {

@@ -14,2 +15,12 @@ devicePixelRatio: number;

export declare function addBlockOuts(screenshot: string, ignoredBoxes: IgnoreBoxes[]): Promise<string>;
export declare function takeBase64ElementScreenshot({ element, devicePixelRatio, isIOS, methods: { getElementRect, screenShot, }, resizeDimensions, }: {
element: WicElement;
devicePixelRatio: number;
isIOS: boolean;
methods: {
getElementRect: GetElementRect;
screenShot: TakeScreenShot;
};
resizeDimensions: ResizeDimensions;
}): Promise<string>;
//# sourceMappingURL=images.d.ts.map

@@ -0,1 +1,2 @@

import type { CanvasRenderingContext2D } from 'canvas';
import type { RectanglesOutput } from './rectangles.interfaces';

@@ -11,2 +12,3 @@ import type { LogLevel } from '../helpers/options.interfaces';

export interface ImageCompareOptions {
ignoreRegions?: RectanglesOutput[];
devicePixelRatio: number;

@@ -20,2 +22,3 @@ compareOptions: {

isHybridApp: boolean;
isAndroid?: boolean;
isLandscape: boolean;

@@ -86,7 +89,7 @@ logLevel: LogLevel;

devicePixelRatio: number;
isIos: boolean;
isIOS: boolean;
isLandscape: boolean;
logLevel: LogLevel;
rectangles: RectanglesOutput;
resizeDimensions?: number | ResizeDimensions;
resizeDimensions?: ResizeDimensions;
}

@@ -99,2 +102,43 @@ export interface RotateBase64ImageOptions {

}
export interface CropAndConvertToDataURL {
addIOSBezelCorners: boolean;
base64Image: string;
deviceName: string;
devicePixelRatio: number;
height: number;
isIOS: boolean;
isLandscape: boolean;
sourceX: number;
sourceY: number;
width: number;
}
export interface AdjustedAxis {
length: number;
logLevel: LogLevel;
maxDimension: number;
paddingEnd: number;
paddingStart: number;
start: number;
warningType: 'WIDTH' | 'HEIGHT';
}
export interface DimensionsWarning {
dimension: number;
logLevel: LogLevel;
maxDimension: number;
position: number;
type: string;
}
export interface RotatedImage {
isLandscape: boolean;
base64Image: string;
}
export interface HandleIOSBezelCorners {
addIOSBezelCorners: boolean;
ctx: CanvasRenderingContext2D;
deviceName: string;
devicePixelRatio: number;
height: number;
isLandscape: boolean;
width: number;
}
//# sourceMappingURL=images.interfaces.d.ts.map

@@ -49,2 +49,11 @@ "use strict";

};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __importDefault = (this && this.__importDefault) || function (mod) {

@@ -54,3 +63,3 @@ return (mod && mod.__esModule) ? mod : { "default": mod };

Object.defineProperty(exports, "__esModule", { value: true });
exports.addBlockOuts = exports.saveBase64Image = exports.makeFullPageBase64Image = exports.executeImageCompare = exports.makeCroppedBase64Image = exports.checkBaselineImageExists = void 0;
exports.takeBase64ElementScreenshot = exports.addBlockOuts = exports.saveBase64Image = exports.makeFullPageBase64Image = exports.executeImageCompare = exports.makeCroppedBase64Image = exports.checkBaselineImageExists = void 0;
var fs_extra_1 = require("fs-extra");

@@ -82,3 +91,3 @@ var node_path_1 = require("node:path");

else {
reject("\n#####################################################################################\n Baseline image not found, save the actual image manually to the baseline.\n The image can be found here:\n ".concat(actualFilePath, "\n If you want the module to auto save a non existing image to the baseline you\n can provide 'autoSaveBaseline: true' to the options.\n#####################################################################################\n"));
reject("\n#####################################################################################\n Baseline image not found, save the actual image manually to the baseline.\n The image can be found here:\n ".concat(actualFilePath, "\n#####################################################################################\n"));
}

@@ -93,10 +102,10 @@ }

exports.checkBaselineImageExists = checkBaselineImageExists;
function makeCroppedBase64Image(_a) {
var addIOSBezelCorners = _a.addIOSBezelCorners, base64Image = _a.base64Image, deviceName = _a.deviceName, devicePixelRatio = _a.devicePixelRatio, isIos = _a.isIos, isLandscape = _a.isLandscape, logLevel = _a.logLevel, rectangles = _a.rectangles, _b = _a.resizeDimensions, resizeDimensions = _b === void 0 ? constants_js_1.DEFAULT_RESIZE_DIMENSIONS : _b;
function getRotatedImageIfNeeded(_a) {
var isLandscape = _a.isLandscape, base64Image = _a.base64Image;
return __awaiter(this, void 0, void 0, function () {
var _c, screenshotHeight, screenshotWidth, isRotated, newBase64Image, _d, resizeValues, _e, top, right, bottom, left, height, width, x, y, canvasWidth, canvasHeight, canvas, image, ctx, sourceXStart, sourceYStart, normalizedDeviceName, isSupported, isIosBezelError, _f, topImageName, bottomImageName, topImage, bottomImage, topBase64Image, _g, bottomBase64Image, _h, _j, _k, _l, _m;
return __generator(this, function (_o) {
switch (_o.label) {
var _b, screenshotHeight, screenshotWidth, isRotated, _c;
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_c = (0, utils_js_1.getScreenshotSize)(base64Image, devicePixelRatio), screenshotHeight = _c.height, screenshotWidth = _c.width;
_b = (0, utils_js_1.getScreenshotSize)(base64Image), screenshotHeight = _b.height, screenshotWidth = _b.width;
isRotated = isLandscape && screenshotHeight > screenshotWidth;

@@ -106,47 +115,51 @@ if (!isRotated) return [3, 2];

case 1:
_d = _o.sent();
_c = _d.sent();
return [3, 3];
case 2:
_d = base64Image;
_o.label = 3;
case 3:
newBase64Image = _d;
if (typeof resizeDimensions === 'number') {
resizeValues = {
top: resizeDimensions,
right: resizeDimensions,
bottom: resizeDimensions,
left: resizeDimensions,
};
if (logLevel === options_interfaces_1.LogLevel.debug || logLevel === options_interfaces_1.LogLevel.warn) {
console.log('\x1b[33m%s\x1b[0m', "\n#####################################################################################\n WARNING:\n THE 'resizeDimensions' NEEDS TO BE AN OBJECT LIKE\n {\n top: 10,\n right: 20,\n bottom: 15,\n left: 25,\n }\n NOW IT WILL BE DEFAULTED TO\n {\n top: ".concat(resizeDimensions, ",\n right: ").concat(resizeDimensions, ",\n bottom: ").concat(resizeDimensions, ",\n left: ").concat(resizeDimensions, ",\n }\n THIS IS DEPRECATED AND WILL BE REMOVED IN A NEW MAJOR RELEASE\n#####################################################################################\n"));
}
}
else {
resizeValues = resizeDimensions;
}
_e = __assign(__assign({}, constants_js_1.DEFAULT_RESIZE_DIMENSIONS), resizeValues), top = _e.top, right = _e.right, bottom = _e.bottom, left = _e.left;
height = rectangles.height, width = rectangles.width, x = rectangles.x, y = rectangles.y;
canvasWidth = width + left + right;
canvasHeight = height + top + bottom;
canvas = (0, canvas_1.createCanvas)(canvasWidth, canvasHeight);
return [4, (0, canvas_1.loadImage)("data:image/png;base64,".concat(newBase64Image))];
case 4:
image = _o.sent();
ctx = canvas.getContext('2d');
sourceXStart = x - left;
sourceYStart = y - top;
if (sourceXStart < 0) {
if (logLevel === options_interfaces_1.LogLevel.debug || logLevel === options_interfaces_1.LogLevel.warn) {
console.log('\x1b[33m%s\x1b[0m', "\n#####################################################################################\n THE RESIZE DIMENSION LEFT '".concat(left, "' MADE THE CROPPING GO OUT OF\n THE IMAGE BOUNDARIES RESULTING IN AN IMAGE STARTPOSITION '").concat(sourceXStart, "'.\n THIS HAS BEEN DEFAULTED TO '0'\n#####################################################################################\n"));
}
sourceXStart = 0;
}
if (sourceYStart < 0) {
if (logLevel === options_interfaces_1.LogLevel.debug || logLevel === options_interfaces_1.LogLevel.warn) {
console.log('\x1b[33m%s\x1b[0m', "\n#####################################################################################\n THE RESIZE DIMENSION LEFT '".concat(top, "' MADE THE CROPPING GO OUT OF\n THE IMAGE BOUNDARIES RESULTING IN AN IMAGE STARTPOSITION '").concat(sourceYStart, "'.\n THIS HAS BEEN DEFAULTED TO '0'\n#####################################################################################\n"));
}
sourceYStart = 0;
}
ctx.drawImage(image, sourceXStart, sourceYStart, canvasWidth, canvasHeight, 0, 0, canvasWidth, canvasHeight);
_c = base64Image;
_d.label = 3;
case 3: return [2, _c];
}
});
});
}
function logDimensionWarning(_a) {
var dimension = _a.dimension, logLevel = _a.logLevel, maxDimension = _a.maxDimension, position = _a.position, type = _a.type;
if (logLevel === options_interfaces_1.LogLevel.debug || logLevel === options_interfaces_1.LogLevel.warn) {
console.log('\x1b[33m%s\x1b[0m', "\n#####################################################################################\n THE RESIZE DIMENSION ".concat(type, "=").concat(dimension, " MADE THE CROPPING GO OUT OF THE SCREEN SIZE\n RESULTING IN A ").concat(type, " CROP POSITION=").concat(position, ".\n THIS HAS BEEN DEFAULTED TO '").concat(['TOP', 'LEFT'].includes(type) ? 0 : maxDimension, "'\n#####################################################################################\n"));
}
}
function getAdjustedAxis(_a) {
var length = _a.length, logLevel = _a.logLevel, maxDimension = _a.maxDimension, paddingEnd = _a.paddingEnd, paddingStart = _a.paddingStart, start = _a.start, warningType = _a.warningType;
var adjustedStart = start - paddingStart;
var adjustedEnd = start + length + paddingEnd;
if (adjustedStart < 0) {
logDimensionWarning({
dimension: paddingStart,
logLevel: logLevel,
maxDimension: maxDimension,
position: adjustedStart,
type: warningType === 'WIDTH' ? 'LEFT' : 'TOP',
});
adjustedStart = 0;
}
if (adjustedEnd > maxDimension) {
logDimensionWarning({
dimension: paddingEnd,
logLevel: logLevel,
maxDimension: maxDimension,
position: adjustedEnd,
type: warningType === 'WIDTH' ? 'RIGHT' : 'BOTTOM',
});
adjustedEnd = maxDimension;
}
return [adjustedStart, adjustedEnd];
}
function handleIOSBezelCorners(_a) {
var addIOSBezelCorners = _a.addIOSBezelCorners, ctx = _a.ctx, deviceName = _a.deviceName, devicePixelRatio = _a.devicePixelRatio, height = _a.height, isLandscape = _a.isLandscape, width = _a.width;
return __awaiter(this, void 0, void 0, function () {
var normalizedDeviceName, isSupported, isIosBezelError, _b, topImageName, bottomImageName, topImage, bottomImage, topBase64Image, _c, bottomBase64Image, _d, _e, _f, _g, _h;
return __generator(this, function (_j) {
switch (_j.label) {
case 0:
normalizedDeviceName = deviceName

@@ -158,10 +171,10 @@ .toLowerCase()

constants_js_1.supportedIosBezelDevices.includes(normalizedDeviceName) &&
(canvasHeight / devicePixelRatio >= 1133 || canvasWidth / devicePixelRatio >= 1133));
(width / devicePixelRatio >= 1133 || height / devicePixelRatio >= 1133));
isIosBezelError = false;
if (!(addIOSBezelCorners && isIos && isSupported)) return [3, 14];
_f = (0, utils_js_1.getIosBezelImageNames)(normalizedDeviceName), topImageName = _f.topImageName, bottomImageName = _f.bottomImageName;
if (!(topImageName && bottomImageName)) return [3, 13];
if (!(addIOSBezelCorners && isSupported)) return [3, 10];
_b = (0, utils_js_1.getIosBezelImageNames)(normalizedDeviceName), topImageName = _b.topImageName, bottomImageName = _b.bottomImageName;
if (!(topImageName && bottomImageName)) return [3, 9];
topImage = (0, fs_extra_1.readFileSync)((0, node_path_1.join)(__dirname, '..', '..', 'assets', 'ios', "".concat(topImageName, ".png"))).toString('base64');
bottomImage = (0, fs_extra_1.readFileSync)((0, node_path_1.join)(__dirname, '..', '..', 'assets', 'ios', "".concat(bottomImageName, ".png"))).toString('base64');
if (!isLandscape) return [3, 6];
if (!isLandscape) return [3, 2];
return [4, rotateBase64Image({

@@ -173,11 +186,11 @@ base64Image: topImage,

})];
case 5:
_g = _o.sent();
return [3, 7];
case 6:
_g = topImage;
_o.label = 7;
case 7:
topBase64Image = _g;
if (!isLandscape) return [3, 9];
case 1:
_c = _j.sent();
return [3, 3];
case 2:
_c = topImage;
_j.label = 3;
case 3:
topBase64Image = _c;
if (!isLandscape) return [3, 5];
return [4, rotateBase64Image({

@@ -189,31 +202,31 @@ base64Image: bottomImage,

})];
case 4:
_d = _j.sent();
return [3, 6];
case 5:
_d = bottomImage;
_j.label = 6;
case 6:
bottomBase64Image = _d;
_f = (_e = ctx).drawImage;
return [4, (0, canvas_1.loadImage)("data:image/png;base64,".concat(topBase64Image))];
case 7:
_f.apply(_e, [_j.sent(), 0, 0]);
_h = (_g = ctx).drawImage;
return [4, (0, canvas_1.loadImage)("data:image/png;base64,".concat(bottomBase64Image))];
case 8:
_h = _o.sent();
_h.apply(_g, [_j.sent(), isLandscape ? width - (0, utils_js_1.getScreenshotSize)(bottomImage).height : 0,
isLandscape ? 0 : height - (0, utils_js_1.getScreenshotSize)(bottomImage).height]);
return [3, 10];
case 9:
_h = bottomImage;
_o.label = 10;
isIosBezelError = true;
_j.label = 10;
case 10:
bottomBase64Image = _h;
_k = (_j = ctx).drawImage;
return [4, (0, canvas_1.loadImage)("data:image/png;base64,".concat(topBase64Image))];
case 11:
_k.apply(_j, [_o.sent(), 0, 0]);
_m = (_l = ctx).drawImage;
return [4, (0, canvas_1.loadImage)("data:image/png;base64,".concat(bottomBase64Image))];
case 12:
_m.apply(_l, [_o.sent(), isLandscape ? canvasWidth - (0, utils_js_1.getScreenshotSize)(bottomImage).height : 0,
isLandscape ? 0 : canvasHeight - (0, utils_js_1.getScreenshotSize)(bottomImage).height]);
return [3, 14];
case 13:
isIosBezelError = true;
_o.label = 14;
case 14:
if (addIOSBezelCorners && isIos && !isSupported) {
if (addIOSBezelCorners && !isSupported) {
isIosBezelError = true;
}
if (isIosBezelError) {
console.log('\x1b[33m%s\x1b[0m', "\n#####################################################################################\n WARNING:\n We could not find the bezel corners for the device '".concat(deviceName, "'.\n The normalized device name is '").concat(normalizedDeviceName, "'\n and couldn't be found in the supported devices:\n ").concat(constants_js_1.supportedIosBezelDevices.join(', '), "\n#####################################################################################\n"));
console.log('\x1b[33m%s\x1b[0m', "\n#####################################################################################\nWARNING:\nWe could not find the bezel corners for the device '".concat(deviceName, "'.\nThe normalized device name is '").concat(normalizedDeviceName, "'\nand couldn't be found in the supported devices:\n").concat(constants_js_1.supportedIosBezelDevices.join(', '), "\n#####################################################################################\n"));
}
return [2, canvas.toDataURL().replace(/^data:image\/png;base64,/, '')];
return [2];
}

@@ -223,12 +236,82 @@ });

}
function cropAndConvertToDataURL(_a) {
var addIOSBezelCorners = _a.addIOSBezelCorners, base64Image = _a.base64Image, deviceName = _a.deviceName, devicePixelRatio = _a.devicePixelRatio, height = _a.height, isIOS = _a.isIOS, isLandscape = _a.isLandscape, sourceX = _a.sourceX, sourceY = _a.sourceY, width = _a.width;
return __awaiter(this, void 0, void 0, function () {
var canvas, ctx, image;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
canvas = (0, canvas_1.createCanvas)(width, height);
ctx = canvas.getContext('2d');
return [4, (0, canvas_1.loadImage)("data:image/png;base64,".concat(base64Image))];
case 1:
image = _b.sent();
ctx.drawImage(image, sourceX, sourceY, width, height, 0, 0, width, height);
if (!isIOS) return [3, 3];
return [4, handleIOSBezelCorners({ addIOSBezelCorners: addIOSBezelCorners, ctx: ctx, deviceName: deviceName, devicePixelRatio: devicePixelRatio, height: height, isLandscape: isLandscape, width: width })];
case 2:
_b.sent();
_b.label = 3;
case 3: return [2, canvas.toDataURL().replace(/^data:image\/png;base64,/, '')];
}
});
});
}
function makeCroppedBase64Image(_a) {
var addIOSBezelCorners = _a.addIOSBezelCorners, base64Image = _a.base64Image, deviceName = _a.deviceName, devicePixelRatio = _a.devicePixelRatio, isIOS = _a.isIOS, isLandscape = _a.isLandscape, logLevel = _a.logLevel, rectangles = _a.rectangles, _b = _a.resizeDimensions, resizeDimensions = _b === void 0 ? constants_js_1.DEFAULT_RESIZE_DIMENSIONS : _b;
return __awaiter(this, void 0, void 0, function () {
var newBase64Image, _c, screenshotHeight, screenshotWidth, _d, top, right, bottom, left, height, width, x, y, _e, sourceXStart, sourceXEnd, _f, sourceYStart, sourceYEnd;
return __generator(this, function (_g) {
switch (_g.label) {
case 0: return [4, getRotatedImageIfNeeded({ isLandscape: isLandscape, base64Image: base64Image })];
case 1:
newBase64Image = _g.sent();
_c = (0, utils_js_1.getScreenshotSize)(base64Image), screenshotHeight = _c.height, screenshotWidth = _c.width;
_d = __assign(__assign({}, constants_js_1.DEFAULT_RESIZE_DIMENSIONS), resizeDimensions), top = _d.top, right = _d.right, bottom = _d.bottom, left = _d.left;
height = rectangles.height, width = rectangles.width, x = rectangles.x, y = rectangles.y;
_e = getAdjustedAxis({
length: width,
logLevel: logLevel,
maxDimension: screenshotWidth,
paddingEnd: right,
paddingStart: left,
start: x,
warningType: 'WIDTH'
}), sourceXStart = _e[0], sourceXEnd = _e[1];
_f = getAdjustedAxis({
length: height,
logLevel: logLevel,
maxDimension: screenshotHeight,
paddingEnd: bottom,
paddingStart: top,
start: y,
warningType: 'HEIGHT',
}), sourceYStart = _f[0], sourceYEnd = _f[1];
return [2, cropAndConvertToDataURL({
addIOSBezelCorners: addIOSBezelCorners,
base64Image: newBase64Image,
deviceName: deviceName,
devicePixelRatio: devicePixelRatio,
height: sourceYEnd - sourceYStart,
isIOS: isIOS,
isLandscape: isLandscape,
sourceX: sourceXStart,
sourceY: sourceYStart,
width: sourceXEnd - sourceXStart,
})];
}
});
});
}
exports.makeCroppedBase64Image = makeCroppedBase64Image;
function executeImageCompare(executor, options, isViewPortScreenshot) {
function executeImageCompare(executor, options, isViewPortScreenshot, isNativeContext) {
if (isViewPortScreenshot === void 0) { isViewPortScreenshot = false; }
if (isNativeContext === void 0) { isNativeContext = false; }
return __awaiter(this, void 0, void 0, function () {
var devicePixelRatio, fileName, isAndroidNativeWebScreenshot, isHybridApp, isLandscape, logLevel, platformName, _a, actualFolder, autoSaveBaseline, baselineFolder, browserName, deviceName, diffFolder, isMobile, savePerInstance, diffFilePath, imageCompareOptions, createFolderOptions, actualFolderPath, baselineFolderPath, actualFilePath, baselineFilePath, resembleIgnoreDefaults, ignore, blockOut, statusAddressToolBarOptions, ignoredBoxes, _b, _c, compareOptions, data, rawMisMatchPercentage, reportMisMatchPercentage, isDifference, isDifferenceMessage, debugMessage, diffFolderPath, _d;
return __generator(this, function (_e) {
switch (_e.label) {
var _a, ignoreRegions, devicePixelRatio, fileName, isAndroidNativeWebScreenshot, isAndroid, isHybridApp, isLandscape, logLevel, platformName, _b, actualFolder, autoSaveBaseline, baselineFolder, browserName, deviceName, diffFolder, isMobile, savePerInstance, diffFilePath, imageCompareOptions, createFolderOptions, actualFolderPath, baselineFolderPath, actualFilePath, baselineFilePath, resembleIgnoreDefaults, ignore, blockOut, webStatusAddressToolBarOptions, statusAddressToolBarOptions, _c, _d, _e, ignoredBoxes, compareOptions, data, rawMisMatchPercentage, reportMisMatchPercentage, isDifference, isDifferenceMessage, debugMessage, diffFolderPath, _f;
return __generator(this, function (_g) {
switch (_g.label) {
case 0:
devicePixelRatio = options.devicePixelRatio, fileName = options.fileName, isAndroidNativeWebScreenshot = options.isAndroidNativeWebScreenshot, isHybridApp = options.isHybridApp, isLandscape = options.isLandscape, logLevel = options.logLevel, platformName = options.platformName;
_a = options.folderOptions, actualFolder = _a.actualFolder, autoSaveBaseline = _a.autoSaveBaseline, baselineFolder = _a.baselineFolder, browserName = _a.browserName, deviceName = _a.deviceName, diffFolder = _a.diffFolder, isMobile = _a.isMobile, savePerInstance = _a.savePerInstance;
_a = options.ignoreRegions, ignoreRegions = _a === void 0 ? [] : _a, devicePixelRatio = options.devicePixelRatio, fileName = options.fileName, isAndroidNativeWebScreenshot = options.isAndroidNativeWebScreenshot, isAndroid = options.isAndroid, isHybridApp = options.isHybridApp, isLandscape = options.isLandscape, logLevel = options.logLevel, platformName = options.platformName;
_b = options.folderOptions, actualFolder = _b.actualFolder, autoSaveBaseline = _b.autoSaveBaseline, baselineFolder = _b.baselineFolder, browserName = _b.browserName, deviceName = _b.deviceName, diffFolder = _b.diffFolder, isMobile = _b.isMobile, savePerInstance = _b.savePerInstance;
imageCompareOptions = __assign(__assign({}, options.compareOptions.wic), options.compareOptions.method);

@@ -242,3 +325,3 @@ createFolderOptions = { browserName: browserName, deviceName: deviceName, isMobile: isMobile, savePerInstance: savePerInstance };

case 1:
_e.sent();
_g.sent();
resembleIgnoreDefaults = ['alpha', 'antialiasing', 'colors', 'less', 'nothing'];

@@ -248,3 +331,5 @@ ignore = resembleIgnoreDefaults.filter(function (option) {

});
blockOut = 'blockOut' in imageCompareOptions ? imageCompareOptions.blockOut : [];
blockOut = 'blockOut' in imageCompareOptions ? imageCompareOptions.blockOut || [] : [];
webStatusAddressToolBarOptions = [];
if (!!isNativeContext) return [3, 3];
statusAddressToolBarOptions = {

@@ -261,8 +346,10 @@ blockOutSideBar: imageCompareOptions.blockOutSideBar,

};
_c = (_b = (blockOut || []))
.concat;
_d = (_c = webStatusAddressToolBarOptions.push).apply;
_e = [webStatusAddressToolBarOptions];
return [4, (0, rectangles_js_1.determineStatusAddressToolBarRectangles)(executor, statusAddressToolBarOptions)];
case 2:
ignoredBoxes = _c.apply(_b, [_e.sent()])
.map(function (rectangles) {
_d.apply(_c, _e.concat([(_g.sent()) || []]));
_g.label = 3;
case 3:
ignoredBoxes = __spreadArray(__spreadArray(__spreadArray([], blockOut, true), ignoreRegions, true), webStatusAddressToolBarOptions, true).map(function (rectangles) {
return (0, utils_js_1.calculateDprData)({

@@ -273,8 +360,8 @@ bottom: rectangles.y + rectangles.height,

top: rectangles.y,
}, devicePixelRatio);
}, isAndroid ? 1 : devicePixelRatio);
});
compareOptions = __assign(__assign({ ignore: ignore }, (ignoredBoxes.length > 0 ? { output: { ignoredBoxes: ignoredBoxes } } : {})), { scaleToSameSize: imageCompareOptions.scaleImagesToSameSize });
return [4, (0, compareImages_js_1.default)((0, fs_extra_1.readFileSync)(baselineFilePath), (0, fs_extra_1.readFileSync)(actualFilePath), compareOptions)];
case 3:
data = _e.sent();
case 4:
data = _g.sent();
rawMisMatchPercentage = data.rawMisMatchPercentage;

@@ -284,3 +371,3 @@ reportMisMatchPercentage = imageCompareOptions.rawMisMatchPercentage

: Number(data.rawMisMatchPercentage.toFixed(3));
if (!(rawMisMatchPercentage > imageCompareOptions.saveAboveTolerance || logLevel === options_interfaces_1.LogLevel.debug)) return [3, 6];
if (!(rawMisMatchPercentage > imageCompareOptions.saveAboveTolerance || logLevel === options_interfaces_1.LogLevel.debug)) return [3, 7];
isDifference = rawMisMatchPercentage > imageCompareOptions.saveAboveTolerance;

@@ -291,12 +378,12 @@ isDifferenceMessage = 'WARNING:\n There was a difference. Saved the difference to';

diffFilePath = (0, node_path_1.join)(diffFolderPath, fileName);
_d = saveBase64Image;
_f = saveBase64Image;
return [4, addBlockOuts(Buffer.from(data.getBuffer()).toString('base64'), ignoredBoxes)];
case 4: return [4, _d.apply(void 0, [_e.sent(), diffFilePath])];
case 5:
_e.sent();
case 5: return [4, _f.apply(void 0, [_g.sent(), diffFilePath])];
case 6:
_g.sent();
if (logLevel === options_interfaces_1.LogLevel.debug || logLevel === options_interfaces_1.LogLevel.warn) {
console.log('\x1b[33m%s\x1b[0m', "\n#####################################################################################\n ".concat(isDifference ? isDifferenceMessage : debugMessage, "\n ").concat(diffFilePath, "\n#####################################################################################\n"));
}
_e.label = 6;
case 6: return [2, imageCompareOptions.returnAllCompareData
_g.label = 7;
case 7: return [2, imageCompareOptions.returnAllCompareData
? {

@@ -419,2 +506,83 @@ fileName: fileName,

}
function takeResizedBase64Screenshot(_a) {
var element = _a.element, devicePixelRatio = _a.devicePixelRatio, isIOS = _a.isIOS, _b = _a.methods, getElementRect = _b.getElementRect, screenShot = _b.screenShot, resizeDimensions = _a.resizeDimensions;
return __awaiter(this, void 0, void 0, function () {
var awaitedElement, elementRegion, base64Image, resizedBase64Image;
return __generator(this, function (_c) {
switch (_c.label) {
case 0: return [4, element];
case 1:
awaitedElement = _c.sent();
if (!(0, rectangles_js_1.isWdioElement)(awaitedElement)) {
console.log('awaitedElement = ', JSON.stringify(awaitedElement));
}
return [4, getElementRect(awaitedElement.elementId)];
case 2:
elementRegion = _c.sent();
return [4, screenShot()];
case 3:
base64Image = _c.sent();
return [4, makeCroppedBase64Image({
addIOSBezelCorners: false,
base64Image: base64Image,
deviceName: '',
devicePixelRatio: devicePixelRatio,
isIOS: isIOS,
isLandscape: false,
logLevel: 'debug',
rectangles: (0, utils_js_1.calculateDprData)({
height: elementRegion.height,
width: elementRegion.width,
x: elementRegion.x,
y: elementRegion.y,
}, isIOS ? devicePixelRatio : 1),
resizeDimensions: (0, utils_js_1.calculateDprData)(resizeDimensions, 1 / devicePixelRatio),
})];
case 4:
resizedBase64Image = _c.sent();
return [2, resizedBase64Image];
}
});
});
}
function takeBase64ElementScreenshot(_a) {
var element = _a.element, devicePixelRatio = _a.devicePixelRatio, isIOS = _a.isIOS, _b = _a.methods, getElementRect = _b.getElementRect, screenShot = _b.screenShot, resizeDimensions = _a.resizeDimensions;
return __awaiter(this, void 0, void 0, function () {
var shouldTakeResizedScreenshot, awaitedElement, error_1;
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
shouldTakeResizedScreenshot = resizeDimensions !== constants_js_1.DEFAULT_RESIZE_DIMENSIONS;
if (!!shouldTakeResizedScreenshot) return [3, 5];
_c.label = 1;
case 1:
_c.trys.push([1, 4, , 5]);
return [4, element];
case 2:
awaitedElement = _c.sent();
if (!(0, rectangles_js_1.isWdioElement)(awaitedElement)) {
console.error(' takeBase64ElementScreenshot element is not a valid element because of ', JSON.stringify(awaitedElement));
}
return [4, awaitedElement.takeElementScreenshot(awaitedElement.elementId)];
case 3: return [2, _c.sent()];
case 4:
error_1 = _c.sent();
console.error('Error taking an element screenshot with the default `element.takeElementScreenshot(elementId)` method:', error_1, ' We will retry with a resized screenshot');
return [3, 5];
case 5: return [4, takeResizedBase64Screenshot({
element: element,
devicePixelRatio: devicePixelRatio,
isIOS: isIOS,
methods: {
getElementRect: getElementRect,
screenShot: screenShot,
},
resizeDimensions: resizeDimensions,
})];
case 6: return [2, _c.sent()];
}
});
});
}
exports.takeBase64ElementScreenshot = takeBase64ElementScreenshot;
//# sourceMappingURL=images.js.map
import type { ScreenDimensions } from '../clientSideScripts/screenDimensions.interfaces';
import type { RectanglesOutput } from './rectangles.interfaces';
export interface InstanceData {
appName: string;
browserName: string;
browserVersion: string;
deviceName: string;
devicePixelRatio: number;
devicePlatformRect: {
statusBar: RectanglesOutput;
homeBar: RectanglesOutput;
};
deviceScreenSize: {
height: number;
width: number;
};
isAndroid: boolean;
isIOS: boolean;
isMobile: boolean;
logName: string;

@@ -28,3 +42,3 @@ name: string;

isAndroidNativeWebScreenshot: boolean;
isIos: boolean;
isIOS: boolean;
isMobile: boolean;

@@ -31,0 +45,0 @@ isTestInBrowser: boolean;

@@ -57,3 +57,3 @@ "use strict";

return __awaiter(this, void 0, void 0, function () {
var browserData, addressBarShadowPadding, toolBarShadowPadding, browserName, nativeWebScreenshot, platformName, isAndroid, isIos, isMobile, isTestInBrowser, isTestInMobileBrowser, isAndroidNativeWebScreenshot, isAndroidChromeDriverScreenshot, addressBarPadding, toolBarPadding;
var browserData, addressBarShadowPadding, toolBarShadowPadding, browserName, nativeWebScreenshot, platformName, isAndroid, isIOS, isMobile, isTestInBrowser, isTestInMobileBrowser, isAndroidNativeWebScreenshot, isAndroidChromeDriverScreenshot, addressBarPadding, toolBarPadding;
return __generator(this, function (_a) {

@@ -66,3 +66,3 @@ switch (_a.label) {

isAndroid = (0, utils_js_1.checkIsAndroid)(platformName);
isIos = (0, utils_js_1.checkIsIos)(platformName);
isIOS = (0, utils_js_1.checkIsIos)(platformName);
isMobile = (0, utils_js_1.checkIsMobile)(platformName);

@@ -81,3 +81,3 @@ isTestInBrowser = (0, utils_js_1.checkTestInBrowser)(browserName);

toolBarPadding = (0, utils_js_1.getToolBarShadowPadding)({ platformName: platformName, browserName: browserName, toolBarShadowPadding: toolBarShadowPadding, addShadowPadding: addShadowPadding });
return [2, __assign(__assign(__assign({}, browserData), instanceOptions), { addressBarShadowPadding: addressBarPadding, isAndroid: isAndroid, isAndroidChromeDriverScreenshot: isAndroidChromeDriverScreenshot, isAndroidNativeWebScreenshot: isAndroidNativeWebScreenshot, isIos: isIos, isMobile: isMobile, isTestInBrowser: isTestInBrowser, isTestInMobileBrowser: isTestInMobileBrowser, toolBarShadowPadding: toolBarPadding })];
return [2, __assign(__assign(__assign({}, browserData), instanceOptions), { addressBarShadowPadding: addressBarPadding, isAndroid: isAndroid, isAndroidChromeDriverScreenshot: isAndroidChromeDriverScreenshot, isAndroidNativeWebScreenshot: isAndroidNativeWebScreenshot, isIOS: isIOS, isMobile: isMobile, isTestInBrowser: isTestInBrowser, isTestInMobileBrowser: isTestInMobileBrowser, toolBarShadowPadding: toolBarPadding })];
}

@@ -84,0 +84,0 @@ });

@@ -0,7 +1,10 @@

import type { RectanglesOutput } from './rectangles.interfaces';
export type Executor = <T>(script: string | Function, ...varArgs: any[]) => Promise<T>;
export type GetElementRect = (elementId: string) => Promise<RectanglesOutput>;
export type TakeScreenShot = () => Promise<string>;
export interface Methods {
executor: any;
screenShot: any;
executor: Executor;
getElementRect?: GetElementRect;
screenShot: TakeScreenShot;
}
export type TakeScreenShot = () => Promise<string>;
export type Executor = <T>(script: string | Function, ...var_args: any[]) => Promise<T>;
//# sourceMappingURL=methods.interfaces.d.ts.map

@@ -0,6 +1,16 @@

import type { ChainablePromiseElement } from 'webdriverio';
import type { ElementRectangles, RectanglesOutput, ScreenRectanglesOptions, StatusAddressToolBarRectangles, StatusAddressToolBarRectanglesOptions } from './rectangles.interfaces';
import type { Executor } from './methods.interfaces';
import type { Executor, GetElementRect } from './methods.interfaces';
import type { CheckScreenMethodOptions } from '../commands/screen.interfaces.js';
import type { InstanceData } from './instanceData.interfaces.js';
export declare function determineElementRectangles({ executor, base64Image, options, element, }: ElementRectangles): Promise<RectanglesOutput>;
export declare function determineScreenRectangles(base64Image: string, options: ScreenRectanglesOptions): RectanglesOutput;
export declare function determineStatusAddressToolBarRectangles(executor: Executor, options: StatusAddressToolBarRectanglesOptions): Promise<StatusAddressToolBarRectangles>;
export declare function isWdioElement(x: unknown): boolean;
export declare function determineIgnoreRegions(ignores: (RectanglesOutput | WebdriverIO.Element | ChainablePromiseElement<WebdriverIO.Element>)[], getElementRect: GetElementRect): Promise<RectanglesOutput[]>;
export declare function determineDeviceBlockOuts({ isAndroid, screenCompareOptions, instanceData }: {
isAndroid: boolean;
screenCompareOptions: CheckScreenMethodOptions;
instanceData: InstanceData;
}): Promise<RectanglesOutput[]>;
//# sourceMappingURL=rectangles.d.ts.map

@@ -6,3 +6,3 @@ import type { Executor } from './methods.interfaces';

innerHeight: number;
isIos: boolean;
isIOS: boolean;
}

@@ -9,0 +9,0 @@ export interface ElementRectanglesOptions extends RectanglesOptions {

@@ -38,2 +38,11 @@ "use strict";

};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __importDefault = (this && this.__importDefault) || function (mod) {

@@ -43,3 +52,3 @@ return (mod && mod.__esModule) ? mod : { "default": mod };

Object.defineProperty(exports, "__esModule", { value: true });
exports.determineStatusAddressToolBarRectangles = exports.determineScreenRectangles = exports.determineElementRectangles = void 0;
exports.determineDeviceBlockOuts = exports.determineIgnoreRegions = exports.isWdioElement = exports.determineStatusAddressToolBarRectangles = exports.determineScreenRectangles = exports.determineElementRectangles = void 0;
var utils_js_1 = require("../helpers/utils.js");

@@ -53,9 +62,9 @@ var elementPosition_js_1 = require("./elementPosition.js");

return __awaiter(this, void 0, void 0, function () {
var devicePixelRatio, innerHeight, isAndroid, isAndroidNativeWebScreenshot, isIos, isLandscape, height, elementPosition, selectorMessage, message;
var devicePixelRatio, innerHeight, isAndroid, isAndroidNativeWebScreenshot, isIOS, isLandscape, height, elementPosition, selectorMessage, message;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
devicePixelRatio = options.devicePixelRatio, innerHeight = options.innerHeight, isAndroid = options.isAndroid, isAndroidNativeWebScreenshot = options.isAndroidNativeWebScreenshot, isIos = options.isIos, isLandscape = options.isLandscape;
devicePixelRatio = options.devicePixelRatio, innerHeight = options.innerHeight, isAndroid = options.isAndroid, isAndroidNativeWebScreenshot = options.isAndroidNativeWebScreenshot, isIOS = options.isIOS, isLandscape = options.isLandscape;
height = (0, utils_js_1.getScreenshotSize)(base64Image, devicePixelRatio).height;
if (!isIos) return [3, 2];
if (!isIOS) return [3, 2];
return [4, (0, elementPosition_js_1.getElementPositionIos)(executor, element, { isLandscape: isLandscape })];

@@ -96,6 +105,6 @@ case 1:

function determineScreenRectangles(base64Image, options) {
var devicePixelRatio = options.devicePixelRatio, innerHeight = options.innerHeight, innerWidth = options.innerWidth, isIos = options.isIos, isAndroidChromeDriverScreenshot = options.isAndroidChromeDriverScreenshot, isAndroidNativeWebScreenshot = options.isAndroidNativeWebScreenshot, isLandscape = options.isLandscape;
var devicePixelRatio = options.devicePixelRatio, innerHeight = options.innerHeight, innerWidth = options.innerWidth, isIOS = options.isIOS, isAndroidChromeDriverScreenshot = options.isAndroidChromeDriverScreenshot, isAndroidNativeWebScreenshot = options.isAndroidNativeWebScreenshot, isLandscape = options.isLandscape;
var _a = (0, utils_js_1.getScreenshotSize)(base64Image, devicePixelRatio), height = _a.height, width = _a.width;
var screenshotWidth = isIos || isAndroidChromeDriverScreenshot ? width : innerWidth;
var screenshotHeight = isIos || isAndroidNativeWebScreenshot ? height : innerHeight;
var screenshotWidth = isIOS || isAndroidChromeDriverScreenshot ? width : innerWidth;
var screenshotHeight = isIOS || isAndroidNativeWebScreenshot ? height : innerHeight;
var isRotated = isLandscape && height > width;

@@ -145,2 +154,124 @@ return (0, utils_js_1.calculateDprData)({

exports.determineStatusAddressToolBarRectangles = determineStatusAddressToolBarRectangles;
function isWdioElement(x) {
if (!(0, utils_js_1.isObject)(x)) {
return false;
}
var region = x;
var keys = ['selector', 'elementId'];
return keys.every(function (key) { return typeof region[key] === 'string'; });
}
exports.isWdioElement = isWdioElement;
function validateIgnoreRegion(x) {
if (!(0, utils_js_1.isObject)(x)) {
return false;
}
var region = x;
var keys = ['height', 'width', 'x', 'y'];
return keys.every(function (key) { return typeof region[key] === 'number'; });
}
function formatErrorMessage(item, message) {
var formattedItem = (0, utils_js_1.isObject)(item) ? JSON.stringify(item) : item;
return "".concat(formattedItem, " ").concat(message);
}
function splitIgnores(items) {
var elements = [];
var regions = [];
var errorMessages = [];
for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
var item = items_1[_i];
if (Array.isArray(item)) {
for (var _a = 0, item_1 = item; _a < item_1.length; _a++) {
var nestedItem = item_1[_a];
if (!isWdioElement(nestedItem)) {
errorMessages.push(formatErrorMessage(nestedItem, 'is not a valid WebdriverIO element'));
}
else {
elements.push(nestedItem);
}
}
}
else if (isWdioElement(item)) {
elements.push(item);
}
else if (validateIgnoreRegion(item)) {
regions.push(item);
}
else {
errorMessages.push(formatErrorMessage(item, 'is not a valid WebdriverIO element or region'));
}
}
if (errorMessages.length > 0) {
throw new Error('Invalid elements or regions: ' + errorMessages.join(', '));
}
return { elements: elements, regions: regions };
}
function getRegionsFromElements(elements, getElementRect) {
return __awaiter(this, void 0, void 0, function () {
var regions, _i, elements_1, element, region;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
regions = [];
_i = 0, elements_1 = elements;
_a.label = 1;
case 1:
if (!(_i < elements_1.length)) return [3, 4];
element = elements_1[_i];
return [4, getElementRect(element.elementId)];
case 2:
region = _a.sent();
regions.push(region);
_a.label = 3;
case 3:
_i++;
return [3, 1];
case 4: return [2, regions];
}
});
});
}
function determineIgnoreRegions(ignores, getElementRect) {
return __awaiter(this, void 0, void 0, function () {
var awaitedIgnores, _a, elements, regions, regionsFromElements;
return __generator(this, function (_b) {
switch (_b.label) {
case 0: return [4, Promise.all(ignores)];
case 1:
awaitedIgnores = _b.sent();
_a = splitIgnores(awaitedIgnores), elements = _a.elements, regions = _a.regions;
return [4, getRegionsFromElements(elements, getElementRect)];
case 2:
regionsFromElements = _b.sent();
return [2, __spreadArray(__spreadArray([], regions, true), regionsFromElements, true).map(function (region) { return ({
x: Math.round(region.x),
y: Math.round(region.y),
width: Math.round(region.width),
height: Math.round(region.height),
}); })];
}
});
});
}
exports.determineIgnoreRegions = determineIgnoreRegions;
function determineDeviceBlockOuts(_a) {
var isAndroid = _a.isAndroid, screenCompareOptions = _a.screenCompareOptions, instanceData = _a.instanceData;
return __awaiter(this, void 0, void 0, function () {
var rectangles, blockOutStatusBar, blockOutToolBar, _b, homeBar, statusBar;
return __generator(this, function (_c) {
rectangles = [];
blockOutStatusBar = screenCompareOptions.blockOutStatusBar, blockOutToolBar = screenCompareOptions.blockOutToolBar;
_b = instanceData.devicePlatformRect, homeBar = _b.homeBar, statusBar = _b.statusBar;
if (blockOutStatusBar) {
rectangles.push(statusBar);
}
if (isAndroid) {
}
else if (blockOutToolBar) {
rectangles.push(homeBar);
}
return [2, rectangles];
});
});
}
exports.determineDeviceBlockOuts = determineDeviceBlockOuts;
//# sourceMappingURL=rectangles.js.map

@@ -54,3 +54,3 @@ "use strict";

innerHeight: 678,
isIos: true,
isIOS: true,
isLandscape: false,

@@ -109,3 +109,3 @@ };

innerHeight: 678,
isIos: false,
isIOS: false,
isLandscape: false,

@@ -164,3 +164,3 @@ };

innerHeight: 678,
isIos: false,
isIOS: false,
isLandscape: false,

@@ -199,3 +199,3 @@ };

innerHeight: 500,
isIos: false,
isIOS: false,
isLandscape: false,

@@ -234,3 +234,3 @@ };

innerHeight: 500,
isIos: false,
isIOS: false,
isLandscape: false,

@@ -275,3 +275,3 @@ };

innerHeight: 500,
isIos: false,
isIOS: false,
isLandscape: false,

@@ -316,3 +316,3 @@ };

innerHeight: 500,
isIos: false,
isIOS: false,
isLandscape: false,

@@ -359,3 +359,3 @@ };

isAndroidChromeDriverScreenshot: false,
isIos: true,
isIOS: true,
devicePixelRatio: 2,

@@ -382,3 +382,3 @@ isLandscape: false,

isAndroidChromeDriverScreenshot: true,
isIos: false,
isIOS: false,
devicePixelRatio: 2,

@@ -405,3 +405,3 @@ isLandscape: false,

isAndroidChromeDriverScreenshot: false,
isIos: false,
isIOS: false,
devicePixelRatio: 2,

@@ -408,0 +408,0 @@ isLandscape: false,

@@ -26,3 +26,3 @@ import type { LogLevel } from '../helpers/options.interfaces';

isHybridApp: boolean;
isIos: boolean;
isIOS: boolean;
isLandscape: boolean;

@@ -29,0 +29,0 @@ logLevel: LogLevel;

@@ -65,7 +65,7 @@ "use strict";

return __awaiter(this, void 0, void 0, function () {
var addressBarShadowPadding, devicePixelRatio, fullPageScrollTimeout, hideAfterFirstScroll, innerHeight, isAndroid, isAndroidNativeWebScreenshot, isAndroidChromeDriverScreenshot, isHybridApp, isIos, isLandscape, logLevel, screenHeight, screenWidth, toolBarShadowPadding, desktopOptions, nativeMobileOptions, _a, safeArea, screenHeight_1, screenWidth_1, sideBarWidth, statusAddressBarHeight, androidNativeMobileOptions, chromeDriverOptions, _b, safeArea, screenHeight_2, screenWidth_2, sideBarWidth, statusAddressBarHeight, iosHomeBarY, iosNativeMobileOptions;
var addressBarShadowPadding, devicePixelRatio, fullPageScrollTimeout, hideAfterFirstScroll, innerHeight, isAndroid, isAndroidNativeWebScreenshot, isAndroidChromeDriverScreenshot, isHybridApp, isIOS, isLandscape, logLevel, screenHeight, screenWidth, toolBarShadowPadding, desktopOptions, nativeMobileOptions, _a, safeArea, screenHeight_1, screenWidth_1, sideBarWidth, statusAddressBarHeight, androidNativeMobileOptions, chromeDriverOptions, _b, safeArea, screenHeight_2, screenWidth_2, sideBarWidth, statusAddressBarHeight, iosHomeBarY, iosNativeMobileOptions;
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
addressBarShadowPadding = options.addressBarShadowPadding, devicePixelRatio = options.devicePixelRatio, fullPageScrollTimeout = options.fullPageScrollTimeout, hideAfterFirstScroll = options.hideAfterFirstScroll, innerHeight = options.innerHeight, isAndroid = options.isAndroid, isAndroidNativeWebScreenshot = options.isAndroidNativeWebScreenshot, isAndroidChromeDriverScreenshot = options.isAndroidChromeDriverScreenshot, isHybridApp = options.isHybridApp, isIos = options.isIos, isLandscape = options.isLandscape, logLevel = options.logLevel, screenHeight = options.screenHeight, screenWidth = options.screenWidth, toolBarShadowPadding = options.toolBarShadowPadding;
addressBarShadowPadding = options.addressBarShadowPadding, devicePixelRatio = options.devicePixelRatio, fullPageScrollTimeout = options.fullPageScrollTimeout, hideAfterFirstScroll = options.hideAfterFirstScroll, innerHeight = options.innerHeight, isAndroid = options.isAndroid, isAndroidNativeWebScreenshot = options.isAndroidNativeWebScreenshot, isAndroidChromeDriverScreenshot = options.isAndroidChromeDriverScreenshot, isHybridApp = options.isHybridApp, isIOS = options.isIOS, isLandscape = options.isLandscape, logLevel = options.logLevel, screenHeight = options.screenHeight, screenWidth = options.screenWidth, toolBarShadowPadding = options.toolBarShadowPadding;
desktopOptions = {

@@ -90,3 +90,3 @@ devicePixelRatio: devicePixelRatio,

case 3:
if (!isIos) return [3, 5];
if (!isIOS) return [3, 5];
return [4, executor(getIosStatusAddressToolBarOffsets_js_1.default, constants_js_1.IOS_OFFSETS, isLandscape)];

@@ -93,0 +93,0 @@ case 4:

@@ -60,3 +60,3 @@ "use strict";

isHybridApp: false,
isIos: false,
isIOS: false,
isLandscape: false,

@@ -106,3 +106,3 @@ logLevel: options_interfaces_1.LogLevel.debug,

isHybridApp: false,
isIos: false,
isIOS: false,
isLandscape: false,

@@ -158,3 +158,3 @@ logLevel: options_interfaces_1.LogLevel.debug,

isHybridApp: false,
isIos: false,
isIOS: false,
isLandscape: false,

@@ -200,3 +200,3 @@ logLevel: options_interfaces_1.LogLevel.debug,

isHybridApp: false,
isIos: false,
isIOS: false,
isLandscape: false,

@@ -244,3 +244,3 @@ logLevel: options_interfaces_1.LogLevel.debug,

isHybridApp: false,
isIos: true,
isIOS: true,
isLandscape: false,

@@ -295,3 +295,3 @@ logLevel: options_interfaces_1.LogLevel.debug,

isHybridApp: false,
isIos: true,
isIOS: true,
isLandscape: false,

@@ -346,3 +346,3 @@ logLevel: options_interfaces_1.LogLevel.debug,

isHybridApp: false,
isIos: true,
isIOS: true,
isLandscape: false,

@@ -399,3 +399,3 @@ logLevel: options_interfaces_1.LogLevel.debug,

isHybridApp: false,
isIos: false,
isIOS: false,
isLandscape: false,

@@ -443,3 +443,3 @@ logLevel: options_interfaces_1.LogLevel.debug,

isHybridApp: false,
isIos: false,
isIOS: false,
isLandscape: false,

@@ -446,0 +446,0 @@ logLevel: options_interfaces_1.LogLevel.debug,

{
"name": "webdriver-image-comparison",
"version": "3.0.1",
"version": "4.0.0",
"author": "Wim Selles - wswebcreation",

@@ -26,3 +26,4 @@ "description": "An image compare module that can be used for different NodeJS Test automation frameworks that support the webdriver protocol",

"@types/resemblejs": "^4.1.3",
"copyfiles": "^2.4.1"
"copyfiles": "^2.4.1",
"webdriverio": "^8.29.1"
},

@@ -29,0 +30,0 @@ "scripts": {

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc