@wdio/image-comparison-core 1.0.2 → 1.1.1

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.
Files changed (41) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/commands/checkAppElement.d.ts.map +1 -1
  3. package/dist/commands/checkAppElement.js +2 -1
  4. package/dist/commands/checkAppElement.test.js +1 -0
  5. package/dist/commands/checkAppScreen.d.ts.map +1 -1
  6. package/dist/commands/checkAppScreen.js +2 -1
  7. package/dist/commands/checkFullPageScreen.d.ts.map +1 -1
  8. package/dist/commands/checkFullPageScreen.js +2 -1
  9. package/dist/commands/checkWebElement.d.ts.map +1 -1
  10. package/dist/commands/checkWebElement.js +2 -1
  11. package/dist/commands/checkWebScreen.d.ts.map +1 -1
  12. package/dist/commands/checkWebScreen.js +2 -1
  13. package/dist/commands/saveFullPageScreen.js +1 -1
  14. package/dist/commands/saveWebElement.js +1 -1
  15. package/dist/commands/saveWebScreen.js +1 -1
  16. package/dist/helpers/afterScreenshot.d.ts.map +1 -1
  17. package/dist/helpers/afterScreenshot.interfaces.d.ts +2 -0
  18. package/dist/helpers/afterScreenshot.interfaces.d.ts.map +1 -1
  19. package/dist/helpers/afterScreenshot.js +7 -2
  20. package/dist/helpers/afterScreenshot.test.js +11 -0
  21. package/dist/helpers/options.d.ts +1 -0
  22. package/dist/helpers/options.d.ts.map +1 -1
  23. package/dist/helpers/options.interfaces.d.ts +11 -0
  24. package/dist/helpers/options.interfaces.d.ts.map +1 -1
  25. package/dist/helpers/options.js +3 -1
  26. package/dist/helpers/options.test.js +2 -1
  27. package/dist/helpers/utils.d.ts.map +1 -1
  28. package/dist/helpers/utils.interfaces.d.ts +3 -0
  29. package/dist/helpers/utils.interfaces.d.ts.map +1 -1
  30. package/dist/helpers/utils.js +2 -0
  31. package/dist/methods/images.d.ts +2 -2
  32. package/dist/methods/images.d.ts.map +1 -1
  33. package/dist/methods/images.executeImageCompare.test.js +219 -1
  34. package/dist/methods/images.interfaces.d.ts +6 -0
  35. package/dist/methods/images.interfaces.d.ts.map +1 -1
  36. package/dist/methods/images.js +55 -10
  37. package/dist/methods/images.test.js +25 -0
  38. package/dist/mocks/mocks.d.ts +3 -0
  39. package/dist/mocks/mocks.d.ts.map +1 -1
  40. package/dist/mocks/mocks.js +1 -0
  41. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # @wdio/image-comparison-core
2
2
 
3
+ ## 1.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 340fbe6: # 🐛 Bugfixes
8
+
9
+ ## #1098 Improve error message when baseline is missing and both flags are false
10
+
11
+ When `autoSaveBaseline = false` and `alwaysSaveActualImage = false` and a baseline image doesn't exist, the error message now provides clear guidance suggesting users set `alwaysSaveActualImage` to `true` if they need the actual image to create a baseline manually.
12
+
13
+ # Committers: 1
14
+
15
+ - Wim Selles ([@wswebcreation](https://github.com/wswebcreation))
16
+
17
+ - e4e5b5c: # 🐛 Bugfixes
18
+
19
+ ## #1085 autoSaveBaseline collides with the new alwaysSaveActualImage flag
20
+
21
+ When `autoSaveBaseline` is `true` and `alwaysSaveActualImage` is `false`, actual images were still saved. This patch should fix that
22
+
23
+ # Committers: 1
24
+
25
+ - Wim Selles ([@wswebcreation](https://github.com/wswebcreation))
26
+
27
+ ## 1.1.0
28
+
29
+ ### Minor Changes
30
+
31
+ - bde4851: This PR will implement FR #1077 which is asking not to create the actual image on success. This should create a better performance because no files are writing to the system and should make sure that there's not a lot of noise in the actual folder.
32
+
33
+ # Committers: 1
34
+
35
+ - Wim Selles ([@wswebcreation](https://github.com/wswebcreation))
36
+
3
37
  ## 1.0.2
4
38
 
5
39
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"checkAppElement.d.ts","sourceRoot":"","sources":["../../src/commands/checkAppElement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAGzE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAA;AAI9E;;GAEG;AACH,wBAA8B,eAAe,CACzC,EACI,mBAAmB,EACnB,eAAe,EACf,OAAO,EACP,OAAO,EACP,YAAY,EACZ,eAAsB,EACtB,GAAG,EACH,WAAW,GACd,EAAE,iCAAiC,GACrC,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,CAuCtC"}
1
+ {"version":3,"file":"checkAppElement.d.ts","sourceRoot":"","sources":["../../src/commands/checkAppElement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAGzE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAA;AAI9E;;GAEG;AACH,wBAA8B,eAAe,CACzC,EACI,mBAAmB,EACnB,eAAe,EACf,OAAO,EACP,OAAO,EACP,YAAY,EACZ,eAAsB,EACtB,GAAG,EACH,WAAW,GACd,EAAE,iCAAiC,GACrC,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,CAwCtC"}
@@ -9,7 +9,7 @@ export default async function checkAppElement({ checkElementOptions, browserInst
9
9
  // 1. Extract common variables
10
10
  const commonCheckVariables = extractCommonCheckVariables({ folders, instanceData, wicOptions: checkElementOptions.wic });
11
11
  // 2. Save the element and return the data
12
- const { devicePixelRatio, fileName } = await saveAppElement({
12
+ const { devicePixelRatio, fileName, base64Image } = await saveAppElement({
13
13
  browserInstance,
14
14
  element: element,
15
15
  folders,
@@ -40,5 +40,6 @@ export default async function checkAppElement({ checkElementOptions, browserInst
40
40
  testContext,
41
41
  isViewPortScreenshot: false,
42
42
  isNativeContext,
43
+ actualBase64Image: base64Image,
43
44
  });
44
45
  }
@@ -80,6 +80,7 @@ describe('checkAppElement', () => {
80
80
  autoElementScroll: true,
81
81
  addIOSBezelCorners: false,
82
82
  autoSaveBaseline: false,
83
+ alwaysSaveActualImage: true,
83
84
  clearFolder: false,
84
85
  userBasedFullPageScreenshot: false,
85
86
  enableLegacyScreenshotMethod: false,
@@ -1 +1 @@
1
- {"version":3,"file":"checkAppScreen.d.ts","sourceRoot":"","sources":["../../src/commands/checkAppScreen.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAIzE,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uBAAuB,CAAA;AAI7E;;GAEG;AACH,wBAA8B,cAAc,CACxC,EACI,eAAe,EACf,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,eAAsB,EACtB,GAAG,EACH,WAAW,GACd,EAAE,gCAAgC,GACpC,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,CAqEtC"}
1
+ {"version":3,"file":"checkAppScreen.d.ts","sourceRoot":"","sources":["../../src/commands/checkAppScreen.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAIzE,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uBAAuB,CAAA;AAI7E;;GAEG;AACH,wBAA8B,cAAc,CACxC,EACI,eAAe,EACf,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,eAAsB,EACtB,GAAG,EACH,WAAW,GACd,EAAE,gCAAgC,GACpC,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,CAsEtC"}
@@ -27,7 +27,7 @@ export default async function checkAppScreen({ browserInstance, checkScreenOptio
27
27
  ]
28
28
  };
29
29
  // 2. Take the actual screenshot and retrieve the needed data
30
- const { devicePixelRatio, fileName } = await saveAppScreen({
30
+ const { devicePixelRatio, fileName, base64Image } = await saveAppScreen({
31
31
  browserInstance,
32
32
  folders,
33
33
  instanceData,
@@ -69,5 +69,6 @@ export default async function checkAppScreen({ browserInstance, checkScreenOptio
69
69
  isNativeContext,
70
70
  options: executeCompareOptions,
71
71
  testContext,
72
+ actualBase64Image: base64Image,
72
73
  });
73
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"checkFullPageScreen.d.ts","sourceRoot":"","sources":["../../src/commands/checkFullPageScreen.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAIzE,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAA;AAE/E;;GAEG;AACH,wBAA8B,mBAAmB,CAC7C,EACI,eAAe,EACf,oBAAoB,EACpB,OAAO,EACP,YAAY,EACZ,eAAuB,EACvB,GAAG,EACH,WAAW,GACd,EAAE,kCAAkC,GACtC,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,CA+DtC"}
1
+ {"version":3,"file":"checkFullPageScreen.d.ts","sourceRoot":"","sources":["../../src/commands/checkFullPageScreen.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAIzE,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAA;AAE/E;;GAEG;AACH,wBAA8B,mBAAmB,CAC7C,EACI,eAAe,EACf,oBAAoB,EACpB,OAAO,EACP,YAAY,EACZ,eAAuB,EACvB,GAAG,EACH,WAAW,GACd,EAAE,kCAAkC,GACtC,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,CAgEtC"}
@@ -29,7 +29,7 @@ export default async function checkFullPageScreen({ browserInstance, checkFullPa
29
29
  waitForFontsLoaded,
30
30
  },
31
31
  };
32
- const { devicePixelRatio, fileName } = await saveFullPageScreen({
32
+ const { devicePixelRatio, fileName, base64Image } = await saveFullPageScreen({
33
33
  browserInstance,
34
34
  folders,
35
35
  instanceData,
@@ -52,5 +52,6 @@ export default async function checkFullPageScreen({ browserInstance, checkFullPa
52
52
  isNativeContext,
53
53
  options: executeCompareOptions,
54
54
  testContext,
55
+ actualBase64Image: base64Image,
55
56
  });
56
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"checkWebElement.d.ts","sourceRoot":"","sources":["../../src/commands/checkWebElement.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAIzE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAA;AAE9E;;GAEG;AACH,wBAA8B,eAAe,CACzC,EACI,eAAe,EACf,YAAY,EACZ,OAAO,EACP,OAAO,EACP,GAAG,EACH,mBAAmB,EACnB,WAAW,EACX,eAAuB,GAC1B,EAAE,iCAAiC,GACrC,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,CAyDtC"}
1
+ {"version":3,"file":"checkWebElement.d.ts","sourceRoot":"","sources":["../../src/commands/checkWebElement.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAIzE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAA;AAE9E;;GAEG;AACH,wBAA8B,eAAe,CACzC,EACI,eAAe,EACf,YAAY,EACZ,OAAO,EACP,OAAO,EACP,GAAG,EACH,mBAAmB,EACnB,WAAW,EACX,eAAuB,GAC1B,EAAE,iCAAiC,GACrC,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,CA0DtC"}
@@ -24,7 +24,7 @@ export default async function checkWebElement({ browserInstance, instanceData, f
24
24
  waitForFontsLoaded,
25
25
  },
26
26
  };
27
- const { devicePixelRatio, fileName } = await saveWebElement({
27
+ const { devicePixelRatio, fileName, base64Image } = await saveWebElement({
28
28
  browserInstance,
29
29
  instanceData,
30
30
  folders,
@@ -48,5 +48,6 @@ export default async function checkWebElement({ browserInstance, instanceData, f
48
48
  isNativeContext,
49
49
  options: executeCompareOptions,
50
50
  testContext,
51
+ actualBase64Image: base64Image,
51
52
  });
52
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"checkWebScreen.d.ts","sourceRoot":"","sources":["../../src/commands/checkWebScreen.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAIzE,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uBAAuB,CAAA;AAE7E;;GAEG;AACH,wBAA8B,cAAc,CACxC,EACI,eAAe,EACf,YAAY,EACZ,OAAO,EACP,GAAG,EACH,kBAAkB,EAClB,eAAuB,EACvB,WAAW,GACd,EAAE,gCAAgC,GACpC,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,CAsDtC"}
1
+ {"version":3,"file":"checkWebScreen.d.ts","sourceRoot":"","sources":["../../src/commands/checkWebScreen.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAIzE,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uBAAuB,CAAA;AAE7E;;GAEG;AACH,wBAA8B,cAAc,CACxC,EACI,eAAe,EACf,YAAY,EACZ,OAAO,EACP,GAAG,EACH,kBAAkB,EAClB,eAAuB,EACvB,WAAW,GACd,EAAE,gCAAgC,GACpC,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,CAuDtC"}
@@ -23,7 +23,7 @@ export default async function checkWebScreen({ browserInstance, instanceData, fo
23
23
  waitForFontsLoaded,
24
24
  },
25
25
  };
26
- const { devicePixelRatio, fileName } = await saveWebScreen({
26
+ const { devicePixelRatio, fileName, base64Image } = await saveWebScreen({
27
27
  browserInstance,
28
28
  instanceData,
29
29
  folders,
@@ -46,5 +46,6 @@ export default async function checkWebScreen({ browserInstance, instanceData, fo
46
46
  isNativeContext,
47
47
  options: executeCompareOptions,
48
48
  testContext,
49
+ actualBase64Image: base64Image,
49
50
  });
50
51
  }
@@ -54,7 +54,7 @@ export default async function saveFullPageScreen({ browserInstance, instanceData
54
54
  instanceData,
55
55
  enrichedInstanceData,
56
56
  beforeOptions,
57
- wicOptions: { formatImageName, savePerInstance }
57
+ wicOptions: { formatImageName, savePerInstance, alwaysSaveActualImage: saveFullPageOptions.wic.alwaysSaveActualImage }
58
58
  });
59
59
  return afterScreenshot(browserInstance, afterOptions);
60
60
  }
@@ -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 }
50
+ wicOptions: { formatImageName, savePerInstance, alwaysSaveActualImage: saveElementOptions.wic.alwaysSaveActualImage }
51
51
  });
52
52
  return afterScreenshot(browserInstance, afterOptions);
53
53
  }
@@ -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 }
45
+ wicOptions: { formatImageName, savePerInstance, alwaysSaveActualImage: saveScreenOptions.wic.alwaysSaveActualImage }
46
46
  });
47
47
  return afterScreenshot(browserInstance, afterOptions);
48
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"afterScreenshot.d.ts","sourceRoot":"","sources":["../../src/helpers/afterScreenshot.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAM/F;;;GAGG;AACH,wBAA8B,eAAe,CAAC,eAAe,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+D9I"}
1
+ {"version":3,"file":"afterScreenshot.d.ts","sourceRoot":"","sources":["../../src/helpers/afterScreenshot.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAM/F;;;GAGG;AACH,wBAA8B,eAAe,CAAC,eAAe,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmE9I"}
@@ -3,6 +3,7 @@ export interface ScreenshotOutput {
3
3
  fileName: string;
4
4
  isLandscape: boolean;
5
5
  path: string;
6
+ base64Image?: string;
6
7
  }
7
8
  export interface AfterScreenshotOptions {
8
9
  actualFolder: string;
@@ -18,6 +19,7 @@ export interface AfterScreenshotOptions {
18
19
  isNativeContext: boolean;
19
20
  platformName: string;
20
21
  removeElements?: (HTMLElement | HTMLElement[])[];
22
+ alwaysSaveActualImage?: boolean;
21
23
  }
22
24
  export interface ScreenshotFilePathOptions {
23
25
  browserName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"afterScreenshot.interfaces.d.ts","sourceRoot":"","sources":["../../src/helpers/afterScreenshot.interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAE7B,gBAAgB,EAAE,MAAM,CAAC;IAEzB,QAAQ,EAAE,MAAM,CAAC;IAEjB,WAAW,EAAE,OAAO,CAAC;IAErB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IAEnC,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW,EAAE,MAAM,CAAC;IAEpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,QAAQ,EAAE,yBAAyB,CAAC;IAEpC,QAAQ,EAAE,yBAAyB,CAAC;IAEpC,YAAY,CAAC,EAAE,CAAC,WAAW,GAAG,WAAW,EAAE,CAAC,EAAE,CAAC;IAE/C,WAAW,EAAE,OAAO,CAAC;IAErB,eAAe,EAAE,OAAO,CAAC;IAEzB,YAAY,EAAE,MAAM,CAAC;IAErB,cAAc,CAAC,EAAE,CAAC,WAAW,GAAG,WAAW,EAAE,CAAC,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,yBAAyB;IAEtC,WAAW,EAAE,MAAM,CAAC;IAEpB,UAAU,EAAE,MAAM,CAAC;IAEnB,QAAQ,EAAE,OAAO,CAAC;IAElB,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IAEtC,WAAW,EAAE,MAAM,CAAC;IAEpB,cAAc,EAAE,MAAM,CAAC;IAEvB,UAAU,EAAE,MAAM,CAAC;IAEnB,gBAAgB,EAAE,MAAM,CAAC;IAEzB,eAAe,EAAE,MAAM,CAAC;IAExB,QAAQ,EAAE,OAAO,CAAC;IAElB,eAAe,EAAE,OAAO,CAAC;IAEzB,OAAO,EAAE,MAAM,CAAC;IAEhB,IAAI,EAAE,MAAM,CAAC;IAEb,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,YAAY,EAAE,MAAM,CAAC;IAErB,eAAe,EAAE,MAAM,CAAC;IAExB,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW,EAAE,MAAM,CAAC;IAEpB,GAAG,EAAE,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"afterScreenshot.interfaces.d.ts","sourceRoot":"","sources":["../../src/helpers/afterScreenshot.interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAE7B,gBAAgB,EAAE,MAAM,CAAC;IAEzB,QAAQ,EAAE,MAAM,CAAC;IAEjB,WAAW,EAAE,OAAO,CAAC;IAErB,IAAI,EAAE,MAAM,CAAC;IAEb,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IAEnC,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW,EAAE,MAAM,CAAC;IAEpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,QAAQ,EAAE,yBAAyB,CAAC;IAEpC,QAAQ,EAAE,yBAAyB,CAAC;IAEpC,YAAY,CAAC,EAAE,CAAC,WAAW,GAAG,WAAW,EAAE,CAAC,EAAE,CAAC;IAE/C,WAAW,EAAE,OAAO,CAAC;IAErB,eAAe,EAAE,OAAO,CAAC;IAEzB,YAAY,EAAE,MAAM,CAAC;IAErB,cAAc,CAAC,EAAE,CAAC,WAAW,GAAG,WAAW,EAAE,CAAC,EAAE,CAAC;IAEjD,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IAEtC,WAAW,EAAE,MAAM,CAAC;IAEpB,UAAU,EAAE,MAAM,CAAC;IAEnB,QAAQ,EAAE,OAAO,CAAC;IAElB,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IAEtC,WAAW,EAAE,MAAM,CAAC;IAEpB,cAAc,EAAE,MAAM,CAAC;IAEvB,UAAU,EAAE,MAAM,CAAC;IAEnB,gBAAgB,EAAE,MAAM,CAAC;IAEzB,eAAe,EAAE,MAAM,CAAC;IAExB,QAAQ,EAAE,OAAO,CAAC;IAElB,eAAe,EAAE,OAAO,CAAC;IAEzB,OAAO,EAAE,MAAM,CAAC;IAEhB,IAAI,EAAE,MAAM,CAAC;IAEb,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,YAAY,EAAE,MAAM,CAAC;IAErB,eAAe,EAAE,MAAM,CAAC;IAExB,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW,EAAE,MAAM,CAAC;IAEpB,GAAG,EAAE,MAAM,CAAC;CACf"}
@@ -13,16 +13,21 @@ const log = logger('@wdio/visual-service:@wdio/image-comparison-core:afterScreen
13
13
  * to set all back to the original state
14
14
  */
15
15
  export default async function afterScreenshot(browserInstance, options) {
16
- const { actualFolder, base64Image, disableBlinkingCursor, disableCSSAnimation, enableLayoutTesting, fileName: fileNameOptions, filePath, hideElements, hideScrollBars: noScrollBars, isLandscape, isNativeContext, removeElements, } = options;
16
+ const { actualFolder, base64Image, disableBlinkingCursor, disableCSSAnimation, enableLayoutTesting, fileName: fileNameOptions, filePath, hideElements, hideScrollBars: noScrollBars, isLandscape, isNativeContext, removeElements, alwaysSaveActualImage, } = options;
17
17
  const path = getAndCreatePath(actualFolder, filePath);
18
18
  const fileName = formatFileName(fileNameOptions);
19
- await saveBase64Image(base64Image, join(path, fileName));
20
19
  const result = {
21
20
  devicePixelRatio: fileNameOptions.devicePixelRatio,
22
21
  fileName,
23
22
  isLandscape,
24
23
  path,
25
24
  };
25
+ if (alwaysSaveActualImage) {
26
+ await saveBase64Image(base64Image, join(path, fileName));
27
+ }
28
+ else {
29
+ result.base64Image = base64Image;
30
+ }
26
31
  if (isNativeContext) {
27
32
  return result;
28
33
  }
@@ -67,6 +67,7 @@ describe('afterScreenshot', () => {
67
67
  isLandscape: false,
68
68
  isNativeContext: false,
69
69
  platformName: '',
70
+ alwaysSaveActualImage: true,
70
71
  ...overrides,
71
72
  });
72
73
  it('should be able to return the ScreenshotOutput with default options', async () => {
@@ -84,6 +85,16 @@ describe('afterScreenshot', () => {
84
85
  expect(vi.mocked(saveBase64Image)).toHaveBeenCalledWith(options.base64Image, join(mockPath, mockFileName));
85
86
  expect(result).toMatchSnapshot();
86
87
  });
88
+ it('should return base64 when alwaysSaveActualImage is false', async () => {
89
+ const mockBrowserInstance = createMockBrowserInstance();
90
+ const options = createBaseOptions({
91
+ alwaysSaveActualImage: false,
92
+ });
93
+ const result = await afterScreenshot(mockBrowserInstance, options);
94
+ expect(vi.mocked(saveBase64Image)).not.toHaveBeenCalled();
95
+ expect(result.base64Image).toBe(options.base64Image);
96
+ expect(result).toMatchSnapshot();
97
+ });
87
98
  it('should handle native context and skip browser operations', async () => {
88
99
  const mockBrowserInstance = createMockBrowserInstance();
89
100
  const options = createBaseOptions({
@@ -47,6 +47,7 @@ export interface BuildAfterScreenshotOptionsInput {
47
47
  wicOptions: {
48
48
  formatImageName: string;
49
49
  savePerInstance: boolean;
50
+ alwaysSaveActualImage?: boolean;
50
51
  };
51
52
  enrichedInstanceData?: BeforeScreenshotResult;
52
53
  beforeOptions?: BeforeScreenshotOptions;
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/helpers/options.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,KAAK,EAAE,gCAAgC,EAAE,sCAAsC,EAAE,MAAM,iCAAiC,CAAA;AAC/H,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AACvG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAA;AACzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAS/E;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,cAAc,CA2DpE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,sCAAsC,GAChD,sCAAsC,CAOxC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gCAAgC,GAAG,gCAAgC,CAoBhH;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CACzC,YAAY,EAAE,GAAG,EACjB,aAAa,EAAE;IACX,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;IAC5B,cAAc,CAAC,EAAE,WAAW,EAAE,CAAA;IAC9B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC/B,EACD,UAAU,EAAE;IACR,uBAAuB,EAAE,MAAM,CAAA;IAC/B,oBAAoB,EAAE,MAAM,CAAA;IAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC/B,GACF,uBAAuB,CAazB;AAED,MAAM,WAAW,gCAAgC;IAE7C,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,YAAY,CAAA;IAC1B,UAAU,EAAE;QACR,eAAe,EAAE,MAAM,CAAA;QACvB,eAAe,EAAE,OAAO,CAAA;KAC3B,CAAA;IAGD,oBAAoB,CAAC,EAAE,sBAAsB,CAAA;IAC7C,aAAa,CAAC,EAAE,uBAAuB,CAAA;CAC1C;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,EACxC,WAAW,EACX,OAAO,EACP,GAAG,EACH,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,UAAU,EACb,EAAE,gCAAgC,GAAG,sBAAsB,CAyE3D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,mBAAmB,EAAE,gCAAgC,GAAG,sBAAsB,EAAE,CAQpH"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/helpers/options.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,KAAK,EAAE,gCAAgC,EAAE,sCAAsC,EAAE,MAAM,iCAAiC,CAAA;AAC/H,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AACvG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAA;AACzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAS/E;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,cAAc,CA4DpE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,sCAAsC,GAChD,sCAAsC,CAOxC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gCAAgC,GAAG,gCAAgC,CAoBhH;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CACzC,YAAY,EAAE,GAAG,EACjB,aAAa,EAAE;IACX,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;IAC5B,cAAc,CAAC,EAAE,WAAW,EAAE,CAAA;IAC9B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC/B,EACD,UAAU,EAAE;IACR,uBAAuB,EAAE,MAAM,CAAA;IAC/B,oBAAoB,EAAE,MAAM,CAAA;IAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC/B,GACF,uBAAuB,CAazB;AAED,MAAM,WAAW,gCAAgC;IAE7C,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,YAAY,CAAA;IAC1B,UAAU,EAAE;QACR,eAAe,EAAE,MAAM,CAAA;QACvB,eAAe,EAAE,OAAO,CAAA;QACxB,qBAAqB,CAAC,EAAE,OAAO,CAAA;KAClC,CAAA;IAGD,oBAAoB,CAAC,EAAE,sBAAsB,CAAA;IAC7C,aAAa,CAAC,EAAE,uBAAuB,CAAA;CAC1C;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,EACxC,WAAW,EACX,OAAO,EACP,GAAG,EACH,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,UAAU,EACb,EAAE,gCAAgC,GAAG,sBAAsB,CA0E3D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,mBAAmB,EAAE,gCAAgC,GAAG,sBAAsB,EAAE,CAQpH"}
@@ -47,6 +47,12 @@ export interface ClassOptions {
47
47
  * Wait for fonts to be fully loaded before taking a screenshot.
48
48
  */
49
49
  waitForFontsLoaded?: boolean;
50
+ /**
51
+ * Always save the actual image to disk, even when comparison passes.
52
+ * When false, the actual image is only saved when comparison fails (mismatch > 0 or > threshold).
53
+ * @default true
54
+ */
55
+ alwaysSaveActualImage?: boolean;
50
56
  /**
51
57
  * If no baseline image is found during comparison, automatically save the image to the baseline folder.
52
58
  */
@@ -291,6 +297,11 @@ export interface DefaultOptions {
291
297
  * Wait for fonts to be fully loaded before taking a screenshot.
292
298
  */
293
299
  waitForFontsLoaded: boolean;
300
+ /**
301
+ * Always save the actual image to disk, even when comparison passes.
302
+ * When false, the actual image is only saved when comparison fails (mismatch > 0 or > threshold).
303
+ */
304
+ alwaysSaveActualImage: boolean;
294
305
  }
295
306
  export interface CompareOptions {
296
307
  /**
@@ -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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"}
@@ -33,6 +33,7 @@ export function defaultOptions(options) {
33
33
  // This also saves an extra webdriver call
34
34
  hideScrollBars: getBooleanOption(options, 'hideScrollBars', !isStorybookMode),
35
35
  waitForFontsLoaded: options.waitForFontsLoaded ?? true,
36
+ alwaysSaveActualImage: options.alwaysSaveActualImage ?? true,
36
37
  /**
37
38
  * Compare options (merged sequentially):
38
39
  * 1. Default options (fallback)
@@ -132,7 +133,7 @@ export function buildAfterScreenshotOptions({ base64Image, folders, tag, isNativ
132
133
  const isTestInBrowser = enrichedInstanceData?.isTestInBrowser ?? !isNativeContext;
133
134
  const logName = enrichedInstanceData?.logName ?? instanceData.logName;
134
135
  const name = enrichedInstanceData?.name ?? instanceData.name;
135
- const { formatImageName, savePerInstance } = wicOptions;
136
+ const { formatImageName, savePerInstance, alwaysSaveActualImage } = wicOptions;
136
137
  const afterOptions = {
137
138
  actualFolder: folders.actualFolder,
138
139
  base64Image,
@@ -163,6 +164,7 @@ export function buildAfterScreenshotOptions({ base64Image, folders, tag, isNativ
163
164
  isLandscape,
164
165
  isNativeContext,
165
166
  platformName: instanceData.platformName,
167
+ alwaysSaveActualImage: alwaysSaveActualImage ?? true,
166
168
  };
167
169
  // Add browser state options only for web commands (when beforeOptions is provided)
168
170
  if (beforeOptions) {
@@ -243,7 +243,8 @@ describe('options', () => {
243
243
  instanceData: mockInstanceData,
244
244
  wicOptions: {
245
245
  formatImageName: '{tag}-{browserName}-{width}x{height}',
246
- savePerInstance: false
246
+ savePerInstance: false,
247
+ alwaysSaveActualImage: true
247
248
  }
248
249
  };
249
250
  it('should build options for native commands (no enriched data)', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/helpers/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/helpers/utils.ts"],"names":[],"mappings":"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"}
@@ -160,6 +160,7 @@ export interface CommonCheckVariables {
160
160
  /** WIC options */
161
161
  autoSaveBaseline: boolean;
162
162
  savePerInstance: boolean;
163
+ alwaysSaveActualImage?: boolean;
163
164
  /** Optional WIC options (not all methods need these) */
164
165
  isHybridApp?: boolean;
165
166
  }
@@ -174,6 +175,8 @@ export interface ExtractCommonCheckVariablesOptions {
174
175
  export interface FolderOptions {
175
176
  /** Whether to auto-save baseline images */
176
177
  autoSaveBaseline: boolean;
178
+ /** Always save the actual image to disk */
179
+ alwaysSaveActualImage?: boolean;
177
180
  /** The actual folder path */
178
181
  actualFolder: string;
179
182
  /** The baseline folder path */
@@ -1 +1 @@
1
- {"version":3,"file":"utils.interfaces.d.ts","sourceRoot":"","sources":["../../src/helpers/utils.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAE3E,MAAM,WAAW,uBAAuB;IACpC,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IAClC,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,eAAe,EAAE,OAAO,CAAC;IACzB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACtD,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iCAAiC;IAC9C,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,+BAA+B;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,mBAAmB,EAAE,OAAO,CAAC;IAC7B,qCAAqC;IACrC,uBAAuB,EAAE,MAAM,CAAC;IAChC,sBAAsB;IACtB,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,8BAA8B;IAC3C,gCAAgC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,4BAA4B;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,+BAA+B;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB;IACtB,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;CAAG;AAEzD,MAAM,WAAW,gCAAgC;IAC7C,2BAA2B;IAC3B,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC;IACrC,oCAAoC;IACpC,uBAAuB,EAAE,gBAAgB,CAAC;IAC1C,4BAA4B;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,4BAA4B;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,6DAA6D;IAC7D,mBAAmB,EAAE,OAAO,CAAC;IAC7B,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B;IACvC,2BAA2B;IAC3B,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC;IACrC,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,4BAA4B;IAC5B,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IAClC,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IAClC,2BAA2B;IAC3B,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC;IACrC,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAC9D,2BAA2B;IAC3B,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC;IACrC,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACjC,mBAAmB;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IAEnB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,GAAG,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,4BAA4B,EAAE,OAAO,CAAC;IAEtC,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,kBAAkB;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IAEzB,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,kCAAkC;IAC/C,yBAAyB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,YAAY,EAAE,GAAG,CAAC;IAClB,6BAA6B;IAC7B,UAAU,EAAE,GAAG,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC1B,2CAA2C;IAC3C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,mCAAmC;IACnC,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACtC,mFAAmF;IACnF,oBAAoB,EAAE,oBAAoB,CAAC;CAC9C;AAED,MAAM,WAAW,yBAAyB;IACtC,8CAA8C;IAC9C,cAAc,EAAE;QACZ,GAAG,EAAE,GAAG,CAAC;QACT,MAAM,EAAE,GAAG,CAAC;KACf,CAAC;IACF,yBAAyB;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB;IACxB,gBAAgB,EAAE,GAAG,CAAC;IACtB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,8BAA8B;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,4BAA4B,EAAE,OAAO,CAAC;IACtC,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iDAAiD;IACjD,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,qCAAqC;IAClD,iEAAiE;IACjE,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,0BAA0B;IAC1B,iBAAiB,EAAE,GAAG,CAAC;IACvB,6BAA6B;IAC7B,oBAAoB,EAAE,GAAG,CAAC;IAC1B,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,kDAAkD;IAClD,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,iCAAkC,SAAQ,OAAO;IAC9D,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,mCAAmC;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAoB,SAAQ,SAAS,EAAE,WAAW;CAAG"}
1
+ {"version":3,"file":"utils.interfaces.d.ts","sourceRoot":"","sources":["../../src/helpers/utils.interfaces.ts"],"names":[],"mappings":"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"}
@@ -489,6 +489,7 @@ export function extractCommonCheckVariables(options) {
489
489
  // WIC options
490
490
  autoSaveBaseline: wicOptions.autoSaveBaseline,
491
491
  savePerInstance: wicOptions.savePerInstance,
492
+ ...(wicOptions.alwaysSaveActualImage !== undefined && { alwaysSaveActualImage: wicOptions.alwaysSaveActualImage }),
492
493
  // Optional WIC options
493
494
  ...(wicOptions.isHybridApp !== undefined && { isHybridApp: wicOptions.isHybridApp }),
494
495
  };
@@ -500,6 +501,7 @@ export function buildFolderOptions(options) {
500
501
  const { commonCheckVariables } = options;
501
502
  return {
502
503
  autoSaveBaseline: commonCheckVariables.autoSaveBaseline,
504
+ ...(commonCheckVariables.alwaysSaveActualImage !== undefined && { alwaysSaveActualImage: commonCheckVariables.alwaysSaveActualImage }),
503
505
  actualFolder: commonCheckVariables.actualFolder,
504
506
  baselineFolder: commonCheckVariables.baselineFolder,
505
507
  diffFolder: commonCheckVariables.diffFolder,
@@ -12,7 +12,7 @@ export declare function removeDiffImageIfExists(diffFilePath: string): Promise<v
12
12
  /**
13
13
  * Check if the image exists and create a new baseline image if needed
14
14
  */
15
- export declare function checkBaselineImageExists({ actualFilePath, baselineFilePath, autoSaveBaseline, updateBaseline }: CheckBaselineImageExists): Promise<void>;
15
+ export declare function checkBaselineImageExists({ actualFilePath, baselineFilePath, autoSaveBaseline, updateBaseline, actualBase64Image, }: CheckBaselineImageExists): Promise<void>;
16
16
  /**
17
17
  * Get the rotated image if needed
18
18
  */
@@ -40,7 +40,7 @@ export declare function makeCroppedBase64Image({ addIOSBezelCorners, base64Image
40
40
  /**
41
41
  * Execute the image compare
42
42
  */
43
- export declare function executeImageCompare({ isViewPortScreenshot, isNativeContext, options, testContext, }: ExecuteImageCompare): Promise<ImageCompareResult | number>;
43
+ export declare function executeImageCompare({ isViewPortScreenshot, isNativeContext, options, testContext, actualBase64Image, }: ExecuteImageCompare): Promise<ImageCompareResult | number>;
44
44
  /**
45
45
  * Make a full page image with Canvas
46
46
  */
@@ -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":"AAUA,OAAO,KAAK,EACR,YAAY,EACZ,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,8BAA8B,EAC9B,wBAAwB,EACxB,YAAY,EACZ,kCAAkC,EAClC,kCAAkC,EACrC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAQ1E;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3E;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWjF;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,EAC3C,cAAc,EACd,gBAAgB,EAChB,gBAAwB,EACxB,cAAsB,EACtB,iBAAiB,GACpB,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD1C;AACD;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,EAAE,4BAA4B,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAKvI;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAChC,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,IAAI,GACP,EAAE,iBAAiB,GAAG,IAAI,CAW1B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC5B,MAAM,EACN,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,KAAK,EACL,WAAW,GACd,EAAE,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBjC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,EACxC,kBAAkB,EAClB,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,MAAM,EACN,WAAW,EACX,KAAK,GACR,EAAE,qBAAqB,iBAiDvB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,EAC1C,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,MAAM,EACN,KAAK,EACL,WAAW,EACX,OAAO,EACP,OAAO,EACP,KAAK,GACR,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU3C;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,EACzC,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,4BAAoC,EACpC,KAAK,EACL,WAAW,EACX,UAAU,EACV,gBAA4C,GAC/C,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqCtC;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACrC,EACI,oBAAoB,EACpB,eAAe,EACf,OAAO,EACP,WAAW,EACX,iBAAiB,GACpB,EAAE,mBAAmB,GACvB,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,CAgKtC;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CACzC,eAAe,EAAE,uBAAuB,EACxC,EAAE,gBAAgB,EAAE,WAAW,EAAE,EAAE,8BAA8B,GAClE,OAAO,CAAC,MAAM,CAAC,CAmCjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAG1E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAcnG;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAM3G;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,EAC9C,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,KAAK,EACL,gBAAgB,GACnB,EAAE,kCAAkC,GAAG,OAAO,CAAC,MAAM,CAAC,CAgCtD;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,EAC9C,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,KAAK,EACL,gBAAgB,GACnB,EAAE,kCAAkC,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BtD"}
@@ -94,7 +94,7 @@ vi.mock('./images.js', async () => {
94
94
  addBlockOuts: vi.fn(),
95
95
  };
96
96
  });
97
- import { executeImageCompare } from './images.js';
97
+ import { executeImageCompare, checkBaselineImageExists } from './images.js';
98
98
  import * as images from './images.js';
99
99
  describe('executeImageCompare', () => {
100
100
  const mockDeviceRectangles = {
@@ -117,6 +117,7 @@ describe('executeImageCompare', () => {
117
117
  folderOptions: {
118
118
  actualFolder: '/actual',
119
119
  autoSaveBaseline: false,
120
+ alwaysSaveActualImage: true,
120
121
  baselineFolder: '/baseline',
121
122
  browserName: 'chrome',
122
123
  deviceName: 'desktop',
@@ -404,6 +405,10 @@ describe('executeImageCompare', () => {
404
405
  it('should create JSON report files when enabled', async () => {
405
406
  const optionsWithJsonReport = {
406
407
  ...mockOptions,
408
+ folderOptions: {
409
+ ...mockOptions.folderOptions,
410
+ alwaysSaveActualImage: true,
411
+ },
407
412
  compareOptions: {
408
413
  ...mockOptions.compareOptions,
409
414
  wic: {
@@ -525,6 +530,149 @@ describe('executeImageCompare', () => {
525
530
  });
526
531
  expect(result).toMatchSnapshot();
527
532
  });
533
+ it('should compare from base64 when not saving actuals', async () => {
534
+ const base64Image = Buffer.from('base64-image').toString('base64');
535
+ const optionsWithBase64 = {
536
+ ...mockOptions,
537
+ folderOptions: {
538
+ ...mockOptions.folderOptions,
539
+ alwaysSaveActualImage: false,
540
+ autoSaveBaseline: false,
541
+ }
542
+ };
543
+ vi.mocked(compareImages.default).mockResolvedValue({
544
+ rawMisMatchPercentage: 0,
545
+ misMatchPercentage: 0,
546
+ getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
547
+ diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
548
+ analysisTime: 10,
549
+ diffPixels: []
550
+ });
551
+ await executeImageCompare({
552
+ isViewPortScreenshot: true,
553
+ isNativeContext: false,
554
+ options: optionsWithBase64,
555
+ testContext: mockTestContext,
556
+ actualBase64Image: base64Image,
557
+ });
558
+ expect(images.saveBase64Image).not.toHaveBeenCalled();
559
+ expect(compareImages.default).toHaveBeenCalledWith(expect.any(Buffer), Buffer.from(base64Image, 'base64'), expect.any(Object));
560
+ expect(fsPromises.writeFile).not.toHaveBeenCalled();
561
+ });
562
+ it('should disable JSON reports when actuals are not saved', async () => {
563
+ const optionsWithJsonButNoSave = {
564
+ ...mockOptions,
565
+ folderOptions: {
566
+ ...mockOptions.folderOptions,
567
+ alwaysSaveActualImage: false,
568
+ },
569
+ compareOptions: {
570
+ ...mockOptions.compareOptions,
571
+ wic: {
572
+ ...mockOptions.compareOptions.wic,
573
+ createJsonReportFiles: true,
574
+ saveAboveTolerance: 0.1,
575
+ },
576
+ },
577
+ };
578
+ await executeImageCompare({
579
+ isViewPortScreenshot: true,
580
+ isNativeContext: false,
581
+ options: optionsWithJsonButNoSave,
582
+ testContext: mockTestContext,
583
+ actualBase64Image: Buffer.from('base64-image').toString('base64'),
584
+ });
585
+ expect(logWarnSpy).toHaveBeenCalled();
586
+ expect(createCompareReport.createJsonReportIfNeeded).toHaveBeenCalledWith(expect.objectContaining({
587
+ imageCompareOptions: expect.objectContaining({ createJsonReportFiles: false }),
588
+ }));
589
+ });
590
+ it('should save base64 actual for auto-saved baseline', async () => {
591
+ const base64Image = Buffer.from('base64-image').toString('base64');
592
+ const optionsWithAutoSave = {
593
+ ...mockOptions,
594
+ folderOptions: {
595
+ ...mockOptions.folderOptions,
596
+ alwaysSaveActualImage: false,
597
+ autoSaveBaseline: true,
598
+ }
599
+ };
600
+ vi.mocked(fsPromises.access).mockImplementation(async (path) => {
601
+ if (path === '/mock/baseline/test.png') {
602
+ throw new Error('File not found');
603
+ }
604
+ return undefined;
605
+ });
606
+ vi.mocked(compareImages.default).mockResolvedValue({
607
+ rawMisMatchPercentage: 0,
608
+ misMatchPercentage: 0,
609
+ getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
610
+ diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
611
+ analysisTime: 10,
612
+ diffPixels: []
613
+ });
614
+ await executeImageCompare({
615
+ isViewPortScreenshot: true,
616
+ isNativeContext: false,
617
+ options: optionsWithAutoSave,
618
+ testContext: mockTestContext,
619
+ actualBase64Image: base64Image,
620
+ });
621
+ expect(fsPromises.writeFile).toHaveBeenCalledWith('/mock/actual/test.png', Buffer.from(base64Image, 'base64'));
622
+ });
623
+ it('should save base64 actual on diff when not always saving', async () => {
624
+ const base64Image = Buffer.from('base64-image').toString('base64');
625
+ const optionsWithDiff = {
626
+ ...mockOptions,
627
+ folderOptions: {
628
+ ...mockOptions.folderOptions,
629
+ alwaysSaveActualImage: false,
630
+ }
631
+ };
632
+ vi.mocked(compareImages.default).mockResolvedValue({
633
+ rawMisMatchPercentage: 0.5,
634
+ misMatchPercentage: 0.5,
635
+ getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
636
+ diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
637
+ analysisTime: 10,
638
+ diffPixels: []
639
+ });
640
+ await executeImageCompare({
641
+ isViewPortScreenshot: true,
642
+ isNativeContext: false,
643
+ options: optionsWithDiff,
644
+ testContext: mockTestContext,
645
+ actualBase64Image: base64Image,
646
+ });
647
+ expect(fsPromises.writeFile).toHaveBeenCalledWith('/mock/actual/test.png', Buffer.from(base64Image, 'base64'));
648
+ });
649
+ it('should update baseline using base64 when visual baseline is updated', async () => {
650
+ const base64Image = Buffer.from('base64-image').toString('base64');
651
+ vi.mocked(utils.updateVisualBaseline).mockReturnValueOnce(true);
652
+ const optionsWithUpdate = {
653
+ ...mockOptions,
654
+ folderOptions: {
655
+ ...mockOptions.folderOptions,
656
+ alwaysSaveActualImage: false,
657
+ }
658
+ };
659
+ vi.mocked(compareImages.default).mockResolvedValue({
660
+ rawMisMatchPercentage: 0,
661
+ misMatchPercentage: 0,
662
+ getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
663
+ diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
664
+ analysisTime: 10,
665
+ diffPixels: []
666
+ });
667
+ await executeImageCompare({
668
+ isViewPortScreenshot: true,
669
+ isNativeContext: false,
670
+ options: optionsWithUpdate,
671
+ testContext: mockTestContext,
672
+ actualBase64Image: base64Image,
673
+ });
674
+ expect(writeFileSync).toHaveBeenCalledWith('/mock/baseline/test.png', Buffer.from(base64Image, 'base64'));
675
+ });
528
676
  it('should handle Android device pixel ratio correctly', async () => {
529
677
  const androidOptions = {
530
678
  ...mockOptions,
@@ -766,4 +914,74 @@ describe('executeImageCompare', () => {
766
914
  expect(images.saveBase64Image).not.toHaveBeenCalled();
767
915
  expect(log.warn).not.toHaveBeenCalled();
768
916
  });
917
+ it('should not save actual image when autoSaveBaseline is true, alwaysSaveActualImage is false, baseline exists, and comparison passes', async () => {
918
+ // This test covers issue #1085: autoSaveBaseline collides with alwaysSaveActualImage
919
+ // When baseline exists and comparison passes, actual image should NOT be saved
920
+ const base64Image = Buffer.from('base64-image').toString('base64');
921
+ const optionsWithAutoSave = {
922
+ ...mockOptions,
923
+ folderOptions: {
924
+ ...mockOptions.folderOptions,
925
+ alwaysSaveActualImage: false,
926
+ autoSaveBaseline: true,
927
+ }
928
+ };
929
+ vi.mocked(fsPromises.access).mockResolvedValue(undefined);
930
+ vi.mocked(images.checkBaselineImageExists).mockImplementation(async () => {
931
+ return Promise.resolve();
932
+ });
933
+ vi.mocked(compareImages.default).mockResolvedValue({
934
+ rawMisMatchPercentage: 0,
935
+ misMatchPercentage: 0,
936
+ getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
937
+ diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
938
+ analysisTime: 10,
939
+ diffPixels: []
940
+ });
941
+ await executeImageCompare({
942
+ isViewPortScreenshot: true,
943
+ isNativeContext: false,
944
+ options: optionsWithAutoSave,
945
+ testContext: mockTestContext,
946
+ actualBase64Image: base64Image,
947
+ });
948
+ expect(images.saveBase64Image).not.toHaveBeenCalled();
949
+ expect(fsPromises.writeFile).not.toHaveBeenCalledWith('/mock/actual/test.png', expect.anything());
950
+ });
951
+ it('should not save actual image when baseline does not exist, alwaysSaveActualImage is false, and autoSaveBaseline is false', async () => {
952
+ // This test covers issue #1098: When both flags are false, we respect the user's choice
953
+ // and provide a helpful error message suggesting to adjust the arguments if needed
954
+ const base64Image = Buffer.from('base64-image').toString('base64');
955
+ const optionsWithoutAutoSave = {
956
+ ...mockOptions,
957
+ folderOptions: {
958
+ ...mockOptions.folderOptions,
959
+ alwaysSaveActualImage: false,
960
+ autoSaveBaseline: false,
961
+ }
962
+ };
963
+ vi.mocked(fsPromises.access).mockImplementation(async (path) => {
964
+ if (path === '/mock/baseline/test.png' || path === '/mock/actual/test.png') {
965
+ throw new Error('File not found');
966
+ }
967
+ return undefined;
968
+ });
969
+ vi.mocked(images.checkBaselineImageExists).mockImplementation(checkBaselineImageExists);
970
+ vi.mocked(compareImages.default).mockResolvedValue({
971
+ rawMisMatchPercentage: 0,
972
+ misMatchPercentage: 0,
973
+ getBuffer: vi.fn().mockResolvedValue(Buffer.from('diff-image-data')),
974
+ diffBounds: { left: 0, top: 0, right: 0, bottom: 0 },
975
+ analysisTime: 10,
976
+ diffPixels: []
977
+ });
978
+ await expect(executeImageCompare({
979
+ isViewPortScreenshot: true,
980
+ isNativeContext: false,
981
+ options: optionsWithoutAutoSave,
982
+ testContext: mockTestContext,
983
+ actualBase64Image: base64Image,
984
+ })).rejects.toThrow(/If you need the actual image to create a baseline, please set alwaysSaveActualImage to true/);
985
+ expect(images.saveBase64Image).not.toHaveBeenCalled();
986
+ });
769
987
  });
@@ -21,6 +21,8 @@ export interface ExecuteImageCompare {
21
21
  isViewPortScreenshot: boolean;
22
22
  /** Whether this is a native context */
23
23
  isNativeContext: boolean;
24
+ /** The base64 image to use for comparison (when alwaysSaveActualImage is false) */
25
+ actualBase64Image?: string;
24
26
  }
25
27
  export interface ImageCompareOptions {
26
28
  /** Optional ignore regions */
@@ -72,6 +74,8 @@ export interface MethodImageCompareCompareOptions extends BaseImageCompareOption
72
74
  export interface ImageCompareFolderOptions extends Folders {
73
75
  /** Auto save image to baseline */
74
76
  autoSaveBaseline: boolean;
77
+ /** Always save the actual image to disk */
78
+ alwaysSaveActualImage?: boolean;
75
79
  /** The name of the browser */
76
80
  browserName: string;
77
81
  /** The name of the device */
@@ -169,6 +173,8 @@ export interface CheckBaselineImageExists {
169
173
  autoSaveBaseline?: boolean;
170
174
  /** Whether to update baseline */
171
175
  updateBaseline?: boolean;
176
+ /** Optional base64 image (when actual file doesn't exist yet) */
177
+ actualBase64Image?: string;
172
178
  }
173
179
  export interface RotatedImage {
174
180
  /** Whether this is a webdriver element screenshot */
@@ -1 +1 @@
1
- {"version":3,"file":"images.interfaces.d.ts","sourceRoot":"","sources":["../../src/methods/images.interfaces.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"images.interfaces.d.ts","sourceRoot":"","sources":["../../src/methods/images.interfaces.ts"],"names":[],"mappings":"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"}
@@ -41,7 +41,7 @@ export async function removeDiffImageIfExists(diffFilePath) {
41
41
  /**
42
42
  * Check if the image exists and create a new baseline image if needed
43
43
  */
44
- export async function checkBaselineImageExists({ actualFilePath, baselineFilePath, autoSaveBaseline = false, updateBaseline = false }) {
44
+ export async function checkBaselineImageExists({ actualFilePath, baselineFilePath, autoSaveBaseline = false, updateBaseline = false, actualBase64Image, }) {
45
45
  try {
46
46
  if (updateBaseline || !(await checkIfImageExists(baselineFilePath))) {
47
47
  throw new Error();
@@ -52,7 +52,10 @@ export async function checkBaselineImageExists({ actualFilePath, baselineFilePat
52
52
  try {
53
53
  const autoSaveMessage = 'Autosaved the';
54
54
  const updateBaselineMessage = 'Updated the actual';
55
- const data = readFileSync(actualFilePath);
55
+ // Use base64 image if provided, otherwise read from file
56
+ const data = actualBase64Image
57
+ ? Buffer.from(actualBase64Image, 'base64')
58
+ : readFileSync(actualFilePath);
56
59
  writeFileSync(baselineFilePath, data);
57
60
  log.info('\x1b[33m%s\x1b[0m', `
58
61
  #####################################################################################
@@ -70,11 +73,15 @@ export async function checkBaselineImageExists({ actualFilePath, baselineFilePat
70
73
  }
71
74
  }
72
75
  else {
76
+ // Check if actual file exists before referencing it in error message
77
+ const actualFileExists = await checkIfImageExists(actualFilePath);
78
+ const filePathMessage = actualFileExists
79
+ ? `The image can be found here:\n${actualFilePath}`
80
+ : 'The actual image was not saved to disk (alwaysSaveActualImage is false).\nIf you need the actual image to create a baseline, please set alwaysSaveActualImage to true.';
73
81
  throw new Error(`
74
82
  #####################################################################################
75
- Baseline image not found, save the actual image manually to the baseline.
76
- The image can be found here:
77
- ${actualFilePath}
83
+ Baseline image not found, save the actual image manually to the baseline.
84
+ ${filePathMessage}
78
85
  #####################################################################################`);
79
86
  }
80
87
  }
@@ -222,11 +229,21 @@ export async function makeCroppedBase64Image({ addIOSBezelCorners, base64Image,
222
229
  /**
223
230
  * Execute the image compare
224
231
  */
225
- export async function executeImageCompare({ isViewPortScreenshot, isNativeContext, options, testContext, }) {
232
+ export async function executeImageCompare({ isViewPortScreenshot, isNativeContext, options, testContext, actualBase64Image, }) {
226
233
  // 1. Set some variables
227
234
  const { devicePixelRatio, deviceRectangles, ignoreRegions = [], isAndroidNativeWebScreenshot, isAndroid, fileName, } = options;
228
- const { actualFolder, autoSaveBaseline, baselineFolder, browserName, deviceName, diffFolder, isMobile, savePerInstance } = options.folderOptions;
235
+ const { actualFolder, autoSaveBaseline, alwaysSaveActualImage, baselineFolder, browserName, deviceName, diffFolder, isMobile, savePerInstance } = options.folderOptions;
229
236
  const imageCompareOptions = { ...options.compareOptions.wic, ...options.compareOptions.method };
237
+ // 1a. Disable JSON reports if alwaysSaveActualImage is false (JSON reports need the actual file to exist)
238
+ if (!alwaysSaveActualImage && imageCompareOptions.createJsonReportFiles) {
239
+ log.warn('\x1b[33m%s\x1b[0m', `
240
+ #####################################################################################
241
+ WARNING:
242
+ JSON report files require the actual image to be saved to disk.
243
+ Since alwaysSaveActualImage is false, createJsonReportFiles has been disabled.
244
+ #####################################################################################`);
245
+ imageCompareOptions.createJsonReportFiles = false;
246
+ }
230
247
  // 2. Create all needed folders and file paths
231
248
  const filePaths = prepareComparisonFilePaths({
232
249
  actualFolder,
@@ -239,8 +256,28 @@ export async function executeImageCompare({ isViewPortScreenshot, isNativeContex
239
256
  fileName
240
257
  });
241
258
  const { actualFilePath, baselineFilePath, diffFilePath } = filePaths;
259
+ // 2a. If we have a base64 image and alwaysSaveActualImage is false, use it directly
260
+ const useBase64Image = !alwaysSaveActualImage && actualBase64Image !== undefined;
261
+ let actualImageBuffer;
262
+ if (useBase64Image) {
263
+ // Convert base64 to buffer for comparison
264
+ actualImageBuffer = Buffer.from(actualBase64Image, 'base64');
265
+ // Only save actual image if baseline doesn't exist and autoSaveBaseline is true
266
+ if (autoSaveBaseline && !(await checkIfImageExists(baselineFilePath))) {
267
+ await saveBase64Image(actualBase64Image, actualFilePath);
268
+ }
269
+ }
270
+ else {
271
+ // Read from file as before
272
+ actualImageBuffer = readFileSync(actualFilePath);
273
+ }
242
274
  // 3a. Check if there is a baseline image, and determine if it needs to be auto saved or not
243
- await checkBaselineImageExists({ actualFilePath, baselineFilePath, autoSaveBaseline });
275
+ await checkBaselineImageExists({
276
+ actualFilePath,
277
+ baselineFilePath,
278
+ autoSaveBaseline,
279
+ actualBase64Image: useBase64Image ? actualBase64Image : undefined,
280
+ });
244
281
  // 3b. At this point we shouldn't have a diff image, so check if there is a diff image and remove it if it exists
245
282
  await removeDiffImageIfExists(diffFilePath);
246
283
  // 4. Prepare the compare
@@ -270,13 +307,20 @@ export async function executeImageCompare({ isViewPortScreenshot, isNativeContex
270
307
  scaleToSameSize: imageCompareOptions.scaleImagesToSameSize,
271
308
  };
272
309
  // 5. Execute the compare and retrieve the data
273
- const data = await compareImages(readFileSync(baselineFilePath), readFileSync(actualFilePath), compareOptions);
310
+ const data = await compareImages(readFileSync(baselineFilePath), actualImageBuffer, compareOptions);
274
311
  const rawMisMatchPercentage = data.rawMisMatchPercentage;
275
312
  const reportMisMatchPercentage = imageCompareOptions.rawMisMatchPercentage
276
313
  ? rawMisMatchPercentage
277
314
  : Number(data.rawMisMatchPercentage.toFixed(3));
278
315
  // 6. Generate and save the diff when there is a diff
279
316
  const { diffBoundingBoxes, storeDiffs } = await generateAndSaveDiff(data, imageCompareOptions, ignoredBoxes, diffFilePath, rawMisMatchPercentage);
317
+ // 6a. Save actual image on failure if alwaysSaveActualImage is false
318
+ const saveAboveTolerance = imageCompareOptions.saveAboveTolerance ?? 0;
319
+ const hasFailure = rawMisMatchPercentage > 0 || rawMisMatchPercentage > saveAboveTolerance;
320
+ if (useBase64Image && hasFailure && actualBase64Image) {
321
+ // Save the actual image only when comparison fails
322
+ await saveBase64Image(actualBase64Image, actualFilePath);
323
+ }
280
324
  // 7. Create JSON report if requested
281
325
  await createJsonReportIfNeeded({
282
326
  boundingBoxes: {
@@ -297,7 +341,8 @@ export async function executeImageCompare({ isViewPortScreenshot, isNativeContex
297
341
  await checkBaselineImageExists({
298
342
  actualFilePath,
299
343
  baselineFilePath,
300
- updateBaseline: true
344
+ updateBaseline: true,
345
+ actualBase64Image: useBase64Image ? actualBase64Image : undefined,
301
346
  });
302
347
  finalReportMisMatchPercentage = 0;
303
348
  }
@@ -169,6 +169,20 @@ describe('checkBaselineImageExists', () => {
169
169
  expect(vi.mocked(writeFileSync)).toHaveBeenCalledWith('/path/to/baseline.png', Buffer.from('image data'));
170
170
  expect(logInfoSpy.mock.calls).toMatchSnapshot();
171
171
  });
172
+ it('should use provided base64 when auto-saving baseline', async () => {
173
+ accessSpy.mockRejectedValue(new Error('File not found'));
174
+ const base64Actual = Buffer.from('image data').toString('base64');
175
+ vi.mocked(writeFileSync).mockImplementation(() => { });
176
+ await checkBaselineImageExists({
177
+ actualFilePath: '/path/to/actual.png',
178
+ baselineFilePath: '/path/to/baseline.png',
179
+ autoSaveBaseline: true,
180
+ actualBase64Image: base64Actual,
181
+ });
182
+ expect(vi.mocked(readFileSync)).not.toHaveBeenCalled();
183
+ expect(vi.mocked(writeFileSync)).toHaveBeenCalledWith('/path/to/baseline.png', Buffer.from(base64Actual, 'base64'));
184
+ expect(logInfoSpy.mock.calls).toMatchSnapshot();
185
+ });
172
186
  it('should throw error when file does not exist and autoSaveBaseline is false', async () => {
173
187
  accessSpy.mockRejectedValue(new Error('File not found'));
174
188
  await expect(checkBaselineImageExists({
@@ -195,6 +209,17 @@ describe('checkBaselineImageExists', () => {
195
209
  expect(vi.mocked(writeFileSync)).not.toHaveBeenCalled();
196
210
  expect(logInfoSpy).not.toHaveBeenCalled();
197
211
  });
212
+ it('should mention missing actual file in error when not saved to disk', async () => {
213
+ accessSpy.mockRejectedValue(new Error('File not found'));
214
+ vi.mocked(fsPromises.access).mockRejectedValue(new Error('File not found'));
215
+ await expect(checkBaselineImageExists({
216
+ actualFilePath: '/path/to/actual.png',
217
+ baselineFilePath: '/path/to/baseline.png',
218
+ autoSaveBaseline: false
219
+ })).rejects.toThrow(/actual image was not saved to disk/);
220
+ expect(vi.mocked(readFileSync)).not.toHaveBeenCalled();
221
+ expect(vi.mocked(writeFileSync)).not.toHaveBeenCalled();
222
+ });
198
223
  });
199
224
  describe('rotateBase64Image', () => {
200
225
  let jimpReadMock;
@@ -119,6 +119,7 @@ export declare const BASE_CHECK_OPTIONS: {
119
119
  autoElementScroll: boolean;
120
120
  addIOSBezelCorners: boolean;
121
121
  autoSaveBaseline: boolean;
122
+ alwaysSaveActualImage: boolean;
122
123
  clearFolder: boolean;
123
124
  userBasedFullPageScreenshot: boolean;
124
125
  enableLegacyScreenshotMethod: boolean;
@@ -479,6 +480,7 @@ export declare const createBaseOptions: (type: "screen" | "element", overrides?:
479
480
  autoElementScroll: boolean;
480
481
  addIOSBezelCorners: boolean;
481
482
  autoSaveBaseline: boolean;
483
+ alwaysSaveActualImage: boolean;
482
484
  clearFolder: boolean;
483
485
  userBasedFullPageScreenshot: boolean;
484
486
  enableLegacyScreenshotMethod: boolean;
@@ -613,6 +615,7 @@ export declare const createBaseOptions: (type: "screen" | "element", overrides?:
613
615
  autoElementScroll: boolean;
614
616
  addIOSBezelCorners: boolean;
615
617
  autoSaveBaseline: boolean;
618
+ alwaysSaveActualImage: boolean;
616
619
  clearFolder: boolean;
617
620
  userBasedFullPageScreenshot: boolean;
618
621
  enableLegacyScreenshotMethod: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../src/mocks/mocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAA;AACxF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAE/E,eAAO,MAAM,yBAAyB,EAAE,uBAoCvC,CAAA;AACD,eAAO,MAAM,YAAY;;;CAGxB,CAAA;AACD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;CAqBlC,CAAA;AACD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;CAmB3B,CAAA;AACD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEvB,CAAA;AACD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkG9B,CAAA;AACD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDlC,CAAA;AACD,eAAO,MAAM,qBAAqB;;;CAGjC,CAAA;AACD,eAAO,MAAM,qBAAqB;;;;;;;;;CASjC,CAAA;AACD,eAAO,MAAM,0BAA0B,GAAI,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGvD,CAAA;AACF,eAAO,MAAM,yBAAyB,GAAI,cAAc;;;CAGtD,CAAA;AACF,eAAO,MAAM,mBAAmB,GAAI,cAAc;;;;;;;;;CAGhD,CAAA;AACF,eAAO,MAAM,iBAAiB,GAAI,MAAM,QAAQ,GAAG,SAAS,EAAE,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAK/D,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAAH,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyBf,CAAA;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,yBAAyB,EACjE,WAAW,EAAE,CAAC,EACd,SAAS,GAAE,OAAO,CAAC,CAAC,CAAM,GAC3B,CAAC,CAmCH"}
1
+ {"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../src/mocks/mocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAA;AACxF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAE/E,eAAO,MAAM,yBAAyB,EAAE,uBAoCvC,CAAA;AACD,eAAO,MAAM,YAAY;;;CAGxB,CAAA;AACD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;CAqBlC,CAAA;AACD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;CAmB3B,CAAA;AACD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEvB,CAAA;AACD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmG9B,CAAA;AACD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDlC,CAAA;AACD,eAAO,MAAM,qBAAqB;;;CAGjC,CAAA;AACD,eAAO,MAAM,qBAAqB;;;;;;;;;CASjC,CAAA;AACD,eAAO,MAAM,0BAA0B,GAAI,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGvD,CAAA;AACF,eAAO,MAAM,yBAAyB,GAAI,cAAc;;;CAGtD,CAAA;AACF,eAAO,MAAM,mBAAmB,GAAI,cAAc;;;;;;;;;CAGhD,CAAA;AACF,eAAO,MAAM,iBAAiB,GAAI,MAAM,QAAQ,GAAG,SAAS,EAAE,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAK/D,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAAH,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyBf,CAAA;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,yBAAyB,EACjE,WAAW,EAAE,CAAC,EACd,SAAS,GAAE,OAAO,CAAC,CAAC,CAAM,GAC3B,CAAC,CAmCH"}
@@ -153,6 +153,7 @@ export const BASE_CHECK_OPTIONS = {
153
153
  autoElementScroll: true,
154
154
  addIOSBezelCorners: false,
155
155
  autoSaveBaseline: false,
156
+ alwaysSaveActualImage: true,
156
157
  clearFolder: false,
157
158
  userBasedFullPageScreenshot: false,
158
159
  enableLegacyScreenshotMethod: false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wdio/image-comparison-core",
3
- "version": "1.0.2",
3
+ "version": "1.1.1",
4
4
  "author": "Wim Selles - wswebcreation",
5
5
  "description": "Image comparison core module for @wdio/visual-service - WebdriverIO visual testing framework",
6
6
  "keywords": [
@@ -31,7 +31,7 @@
31
31
  "@wdio/types": "^9.20.0"
32
32
  },
33
33
  "devDependencies": {
34
- "webdriverio": "^9.20.1"
34
+ "webdriverio": "^9.23.0"
35
35
  },
36
36
  "publishConfig": {
37
37
  "access": "public"