@wdio/image-comparison-core 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,47 @@
1
1
  # @wdio/image-comparison-core
2
2
 
3
+ ## 1.1.3
4
+
5
+ ### Patch Changes
6
+
7
+ - a3bc7a4: ## #1115 Respect `alwaysSaveActualImage: false` for `checkScreen` methods
8
+
9
+ When using visual matchers like `toMatchScreenSnapshot('tag', 0.9)` with `alwaysSaveActualImage: false`, the actual image was still being saved even when the comparison passed within the threshold.
10
+
11
+ The root cause was that the matcher's expected threshold was not being passed to the core comparison logic. The core used `saveAboveTolerance` (defaulting to 0) to decide whether to save images, while the matcher used the user-provided threshold to determine pass/fail - these were disconnected.
12
+
13
+ This fix ensures:
14
+
15
+ - When `alwaysSaveActualImage: false` and `saveAboveTolerance` is not explicitly set, actual images are never saved (respecting the literal meaning of the option)
16
+ - When `saveAboveTolerance` is explicitly set (like matchers do internally), actual images are saved only when the mismatch exceeds that threshold
17
+
18
+ # Committers: 1
19
+
20
+ - Wim Selles ([@wswebcreation](https://github.com/wswebcreation))
21
+
22
+ - a3bc7a4: ## Fix: `save*` methods now always save files regardless of `alwaysSaveActualImage` setting
23
+
24
+ Previously, when `alwaysSaveActualImage: false` was set in the configuration, `save*` methods (`saveScreen`, `saveElement`, `saveFullPageScreen`, `saveAppScreen`, `saveAppElement`) were not saving files to disk, causing test failures.
25
+
26
+ The `alwaysSaveActualImage` option is intended to control whether actual images are saved during `check*` methods (comparison operations), not `save*` methods. Since `save*` methods are explicitly designed to save screenshots, they should always save files regardless of this setting.
27
+
28
+ This fix ensures:
29
+
30
+ - `save*` methods always save files to disk, even when `alwaysSaveActualImage: false` is set in the config
31
+ - `alwaysSaveActualImage: false` continues to work correctly for `check*` methods (as intended for issue #1115)
32
+ - The behavior is now consistent: `save*` = always save, `check*` = respect `alwaysSaveActualImage` setting
33
+
34
+ **Implementation details:**
35
+
36
+ - The visual service overrides `alwaysSaveActualImage: true` when calling `save*` methods directly from the browser API
37
+ - `save*` methods respect whatever `alwaysSaveActualImage` value is passed to them (no special logic needed)
38
+ - `check*` methods pass through the config value (which may be `false`), so `save*` methods respect it when called internally
39
+ - This clean separation ensures `save*` methods work correctly when called directly while still respecting `alwaysSaveActualImage` for `check*` methods
40
+
41
+ # Committers: 1
42
+
43
+ - Wim Selles ([@wswebcreation](https://github.com/wswebcreation))
44
+
3
45
  ## 1.1.2
4
46
 
5
47
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"saveFullPageScreen.d.ts","sourceRoot":"","sources":["../../src/commands/saveFullPageScreen.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAGhF,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,sBAAsB,CAAA;AAI7E;;GAEG;AACH,wBAA8B,kBAAkB,CAC5C,EACI,eAAe,EACf,YAAY,EACZ,OAAO,EACP,GAAG,EACH,mBAAmB,EACnB,eAAe,GAClB,EAAE,iCAAiC,GACrC,OAAO,CAAC,gBAAgB,CAAC,CAuE3B"}
1
+ {"version":3,"file":"saveFullPageScreen.d.ts","sourceRoot":"","sources":["../../src/commands/saveFullPageScreen.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAGhF,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,sBAAsB,CAAA;AAI7E;;GAEG;AACH,wBAA8B,kBAAkB,CAC5C,EACI,eAAe,EACf,YAAY,EACZ,OAAO,EACP,GAAG,EACH,mBAAmB,EACnB,eAAe,GAClB,EAAE,iCAAiC,GACrC,OAAO,CAAC,gBAAgB,CAAC,CAsE3B"}
@@ -13,7 +13,6 @@ export default async function saveFullPageScreen({ browserInstance, instanceData
13
13
  throw new Error('The method saveFullPageScreen is not supported in native context for native mobile apps!');
14
14
  }
15
15
  // 2. Set some variables
16
- const { formatImageName, savePerInstance } = saveFullPageOptions.wic;
17
16
  const enableLegacyScreenshotMethod = getMethodOrWicOption(saveFullPageOptions.method, saveFullPageOptions.wic, 'enableLegacyScreenshotMethod');
18
17
  const fullPageScrollTimeout = getMethodOrWicOption(saveFullPageOptions.method, saveFullPageOptions.wic, 'fullPageScrollTimeout');
19
18
  const hideAfterFirstScroll = saveFullPageOptions.method.hideAfterFirstScroll || [];
@@ -54,7 +53,7 @@ export default async function saveFullPageScreen({ browserInstance, instanceData
54
53
  instanceData,
55
54
  enrichedInstanceData,
56
55
  beforeOptions,
57
- wicOptions: { formatImageName, savePerInstance, alwaysSaveActualImage: saveFullPageOptions.wic.alwaysSaveActualImage }
56
+ wicOptions: saveFullPageOptions.wic
58
57
  });
59
58
  return afterScreenshot(browserInstance, afterOptions);
60
59
  }
@@ -290,4 +290,20 @@ describe('saveFullPageScreen', () => {
290
290
  fileName: 'test-fullpage.png'
291
291
  });
292
292
  });
293
+ it('should pass through alwaysSaveActualImage value from options (service overrides for direct save* calls)', async () => {
294
+ const options = {
295
+ ...baseOptions,
296
+ saveFullPageOptions: {
297
+ ...baseOptions.saveFullPageOptions,
298
+ wic: {
299
+ ...baseOptions.saveFullPageOptions.wic,
300
+ alwaysSaveActualImage: false,
301
+ }
302
+ }
303
+ };
304
+ await saveFullPageScreen(options);
305
+ expect(buildAfterScreenshotOptionsSpy).toHaveBeenCalled();
306
+ const buildAfterScreenshotOptionsCall = buildAfterScreenshotOptionsSpy.mock.calls[buildAfterScreenshotOptionsSpy.mock.calls.length - 1];
307
+ expect(buildAfterScreenshotOptionsCall[0].wicOptions).toHaveProperty('alwaysSaveActualImage', false);
308
+ });
293
309
  });
@@ -9,7 +9,7 @@ import { createBeforeScreenshotOptions, buildAfterScreenshotOptions } from '../h
9
9
  */
10
10
  export default async function saveWebElement({ browserInstance, instanceData, folders, element, tag, saveElementOptions, }) {
11
11
  // 1. Set some variables
12
- const { addressBarShadowPadding, autoElementScroll, formatImageName, savePerInstance } = saveElementOptions.wic;
12
+ const { addressBarShadowPadding, autoElementScroll } = saveElementOptions.wic;
13
13
  const enableLegacyScreenshotMethod = getMethodOrWicOption(saveElementOptions.method, saveElementOptions.wic, 'enableLegacyScreenshotMethod');
14
14
  const resizeDimensions = saveElementOptions.method.resizeDimensions || DEFAULT_RESIZE_DIMENSIONS;
15
15
  // 2. Prepare the screenshot
@@ -47,7 +47,7 @@ export default async function saveWebElement({ browserInstance, instanceData, fo
47
47
  instanceData,
48
48
  enrichedInstanceData,
49
49
  beforeOptions,
50
- wicOptions: { formatImageName, savePerInstance, alwaysSaveActualImage: saveElementOptions.wic.alwaysSaveActualImage }
50
+ wicOptions: saveElementOptions.wic
51
51
  });
52
52
  return afterScreenshot(browserInstance, afterOptions);
53
53
  }
@@ -250,4 +250,20 @@ describe('saveWebElement', () => {
250
250
  expect(buildAfterScreenshotOptionsSpy.mock.calls[0][0]).toMatchSnapshot();
251
251
  expect(afterScreenshotSpy.mock.calls[0][1]).toMatchSnapshot();
252
252
  });
253
+ it('should pass through alwaysSaveActualImage value from options (service overrides for direct save* calls)', async () => {
254
+ const options = {
255
+ ...baseOptions,
256
+ saveElementOptions: {
257
+ ...baseOptions.saveElementOptions,
258
+ wic: {
259
+ ...baseOptions.saveElementOptions.wic,
260
+ alwaysSaveActualImage: false,
261
+ }
262
+ }
263
+ };
264
+ await saveWebElement(options);
265
+ expect(buildAfterScreenshotOptionsSpy).toHaveBeenCalled();
266
+ const buildAfterScreenshotOptionsCall = buildAfterScreenshotOptionsSpy.mock.calls[buildAfterScreenshotOptionsSpy.mock.calls.length - 1];
267
+ expect(buildAfterScreenshotOptionsCall[0].wicOptions).toHaveProperty('alwaysSaveActualImage', false);
268
+ });
253
269
  });
@@ -8,7 +8,7 @@ import { createBeforeScreenshotOptions, buildAfterScreenshotOptions } from '../h
8
8
  */
9
9
  export default async function saveWebScreen({ browserInstance, instanceData, folders, tag, saveScreenOptions, isNativeContext = false, }) {
10
10
  // 1. Set some variables
11
- const { addIOSBezelCorners, formatImageName, savePerInstance } = saveScreenOptions.wic;
11
+ const { addIOSBezelCorners } = saveScreenOptions.wic;
12
12
  const enableLegacyScreenshotMethod = getMethodOrWicOption(saveScreenOptions.method, saveScreenOptions.wic, 'enableLegacyScreenshotMethod');
13
13
  // 2. Prepare the screenshot
14
14
  const beforeOptions = createBeforeScreenshotOptions(instanceData, saveScreenOptions.method, saveScreenOptions.wic);
@@ -42,7 +42,7 @@ export default async function saveWebScreen({ browserInstance, instanceData, fol
42
42
  instanceData,
43
43
  enrichedInstanceData,
44
44
  beforeOptions,
45
- wicOptions: { formatImageName, savePerInstance, alwaysSaveActualImage: saveScreenOptions.wic.alwaysSaveActualImage }
45
+ wicOptions: saveScreenOptions.wic
46
46
  });
47
47
  return afterScreenshot(browserInstance, afterOptions);
48
48
  }
@@ -219,4 +219,19 @@ describe('saveWebScreen', () => {
219
219
  expect(takeWebScreenshotSpy.mock.calls[0]).toMatchSnapshot();
220
220
  expect(afterScreenshotSpy.mock.calls[0]).toMatchSnapshot();
221
221
  });
222
+ it('should pass through alwaysSaveActualImage value from options (service overrides for direct save* calls)', async () => {
223
+ const options = createTestOptions(baseOptions, {
224
+ saveScreenOptions: {
225
+ ...baseOptions.saveScreenOptions,
226
+ wic: {
227
+ ...baseOptions.saveScreenOptions.wic,
228
+ alwaysSaveActualImage: false,
229
+ }
230
+ }
231
+ });
232
+ await saveWebScreen(options);
233
+ expect(afterScreenshotSpy).toHaveBeenCalled();
234
+ const afterScreenshotCall = afterScreenshotSpy.mock.calls[afterScreenshotSpy.mock.calls.length - 1];
235
+ expect(afterScreenshotCall[1]).toHaveProperty('alwaysSaveActualImage', false);
236
+ });
222
237
  });
@@ -15,7 +15,6 @@ export declare const DEFAULT_COMPARE_OPTIONS: {
15
15
  ignoreNothing: boolean;
16
16
  rawMisMatchPercentage: boolean;
17
17
  returnAllCompareData: boolean;
18
- saveAboveTolerance: number;
19
18
  scaleImagesToSameSize: boolean;
20
19
  };
21
20
  export declare const DEFAULT_FORMAT_STRING = "{tag}-{browserName}-{width}x{height}-dpr-{dpr}";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/helpers/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAA;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAE3E,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;CAenC,CAAA;AACD,eAAO,MAAM,qBAAqB,mDAAmD,CAAA;AACrF,eAAO,MAAM,uBAAuB,+CAA+C,CAAA;AACnF,eAAO,MAAM,OAAO;;;;;;;;CAQV,CAAA;AACV,eAAO,MAAM,cAAc;;;CAG1B,CAAA;AACD,eAAO,MAAM,OAAO,YAAY,CAAA;AAChC,eAAO,MAAM,SAAS,cAAc,CAAA;AACpC,eAAO,MAAM,aAAa,YAAY,CAAA;AACtC,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,gBAAgB,CAKhE,CAAA;AACD,eAAO,MAAM,wBAAwB,OAAO,CAAA;AAC5C,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;CAepC,CAAA;AACD,eAAO,MAAM,iBAAiB,EAAE,gBAS/B,CAAA;AAUD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU3B,CAAA;AAsCD,eAAO,MAAM,WAAW,EAAE,UAuQzB,CAAA;AAED,eAAO,MAAM,wBAAwB,UA2BpC,CAAA;AAED,eAAO,MAAM,oBAAoB,EAAE,WAqBlC,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/helpers/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAA;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAE3E,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;CAcnC,CAAA;AACD,eAAO,MAAM,qBAAqB,mDAAmD,CAAA;AACrF,eAAO,MAAM,uBAAuB,+CAA+C,CAAA;AACnF,eAAO,MAAM,OAAO;;;;;;;;CAQV,CAAA;AACV,eAAO,MAAM,cAAc;;;CAG1B,CAAA;AACD,eAAO,MAAM,OAAO,YAAY,CAAA;AAChC,eAAO,MAAM,SAAS,cAAc,CAAA;AACpC,eAAO,MAAM,aAAa,YAAY,CAAA;AACtC,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,gBAAgB,CAKhE,CAAA;AACD,eAAO,MAAM,wBAAwB,OAAO,CAAA;AAC5C,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;CAepC,CAAA;AACD,eAAO,MAAM,iBAAiB,EAAE,gBAS/B,CAAA;AAUD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU3B,CAAA;AAsCD,eAAO,MAAM,WAAW,EAAE,UAuQzB,CAAA;AAED,eAAO,MAAM,wBAAwB,UA2BpC,CAAA;AAED,eAAO,MAAM,oBAAoB,EAAE,WAqBlC,CAAA"}
@@ -11,7 +11,6 @@ export const DEFAULT_COMPARE_OPTIONS = {
11
11
  ignoreNothing: false,
12
12
  rawMisMatchPercentage: false,
13
13
  returnAllCompareData: false,
14
- saveAboveTolerance: 0,
15
14
  scaleImagesToSameSize: false,
16
15
  };
17
16
  export const DEFAULT_FORMAT_STRING = '{tag}-{browserName}-{width}x{height}-dpr-{dpr}';
@@ -364,8 +364,10 @@ export interface CompareOptions {
364
364
  returnAllCompareData: boolean;
365
365
  /**
366
366
  * Mismatch percentage threshold above which the image with differences will be saved.
367
+ * When undefined, actual images won't be saved (respects alwaysSaveActualImage: false).
368
+ * Matchers set this value internally based on the expected threshold.
367
369
  */
368
- saveAboveTolerance: number;
370
+ saveAboveTolerance?: number;
369
371
  /**
370
372
  * Scale images to the same size before comparing them.
371
373
  */
@@ -1 +1 @@
1
- {"version":3,"file":"options.interfaces.d.ts","sourceRoot":"","sources":["../../src/helpers/options.interfaces.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"options.interfaces.d.ts","sourceRoot":"","sources":["../../src/helpers/options.interfaces.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/methods/images.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/methods/images.ts"],"names":[],"mappings":"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"}
@@ -620,14 +620,57 @@ describe('executeImageCompare', () => {
620
620
  });
621
621
  expect(fsPromises.writeFile).toHaveBeenCalledWith('/mock/actual/test.png', Buffer.from(base64Image, 'base64'));
622
622
  });
623
- it('should save base64 actual on diff when not always saving', async () => {
623
+ it('should NOT save base64 actual on diff when alwaysSaveActualImage is false and saveAboveTolerance is not set (#1115)', async () => {
624
+ // When alwaysSaveActualImage: false and saveAboveTolerance is not explicitly set,
625
+ // actual images should never be saved - respecting the literal meaning of the option
624
626
  const base64Image = Buffer.from('base64-image').toString('base64');
625
627
  const optionsWithDiff = {
626
628
  ...mockOptions,
627
629
  folderOptions: {
628
630
  ...mockOptions.folderOptions,
629
631
  alwaysSaveActualImage: false,
630
- }
632
+ },
633
+ compareOptions: {
634
+ ...mockOptions.compareOptions,
635
+ wic: {
636
+ ...mockOptions.compareOptions.wic,
637
+ saveAboveTolerance: undefined,
638
+ },
639
+ },
640
+ };
641
+ vi.mocked(compareImages.default).mockResolvedValue({
642
+ rawMisMatchPercentage: 0.5,
643
+ misMatchPercentage: 0.5,
644
+ getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
645
+ diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
646
+ analysisTime: 10,
647
+ diffPixels: []
648
+ });
649
+ await executeImageCompare({
650
+ isViewPortScreenshot: true,
651
+ isNativeContext: false,
652
+ options: optionsWithDiff,
653
+ testContext: mockTestContext,
654
+ actualBase64Image: base64Image,
655
+ });
656
+ expect(fsPromises.writeFile).not.toHaveBeenCalled();
657
+ });
658
+ it('should save base64 actual on diff when saveAboveTolerance is explicitly set to 0', async () => {
659
+ // When saveAboveTolerance is explicitly set (even to 0), save actual images when diff exceeds it
660
+ const base64Image = Buffer.from('base64-image').toString('base64');
661
+ const optionsWithDiff = {
662
+ ...mockOptions,
663
+ folderOptions: {
664
+ ...mockOptions.folderOptions,
665
+ alwaysSaveActualImage: false,
666
+ },
667
+ compareOptions: {
668
+ ...mockOptions.compareOptions,
669
+ wic: {
670
+ ...mockOptions.compareOptions.wic,
671
+ saveAboveTolerance: 0,
672
+ },
673
+ },
631
674
  };
632
675
  vi.mocked(compareImages.default).mockResolvedValue({
633
676
  rawMisMatchPercentage: 0.5,
@@ -315,10 +315,15 @@ export async function executeImageCompare({ isViewPortScreenshot, isNativeContex
315
315
  // 6. Generate and save the diff when there is a diff
316
316
  const { diffBoundingBoxes, storeDiffs } = await generateAndSaveDiff(data, imageCompareOptions, ignoredBoxes, diffFilePath, rawMisMatchPercentage);
317
317
  // 6a. Save actual image on failure if alwaysSaveActualImage is false
318
- const saveAboveTolerance = imageCompareOptions.saveAboveTolerance ?? 0;
319
- const hasFailure = rawMisMatchPercentage > saveAboveTolerance;
320
- if (useBase64Image && hasFailure && actualBase64Image) {
321
- // Save the actual image only when comparison fails
318
+ // Only save when saveAboveTolerance is explicitly set (e.g., by matchers).
319
+ // When using checkScreen directly without saveAboveTolerance, respect
320
+ // alwaysSaveActualImage: false literally and don't save actual images.
321
+ // @see https://github.com/webdriverio/visual-testing/issues/1115
322
+ const saveAboveTolerance = imageCompareOptions.saveAboveTolerance;
323
+ const shouldSaveOnFailure = saveAboveTolerance !== undefined;
324
+ const hasFailure = rawMisMatchPercentage > (saveAboveTolerance ?? 0);
325
+ if (useBase64Image && shouldSaveOnFailure && hasFailure && actualBase64Image) {
326
+ // Save the actual image only when comparison fails and threshold was explicitly set
322
327
  await saveBase64Image(actualBase64Image, actualFilePath);
323
328
  }
324
329
  // 7. Create JSON report if requested
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wdio/image-comparison-core",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "author": "Wim Selles - wswebcreation",
5
5
  "description": "Image comparison core module for @wdio/visual-service - WebdriverIO visual testing framework",
6
6
  "keywords": [