@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.
- package/CHANGELOG.md +34 -0
- package/dist/commands/checkAppElement.d.ts.map +1 -1
- package/dist/commands/checkAppElement.js +2 -1
- package/dist/commands/checkAppElement.test.js +1 -0
- package/dist/commands/checkAppScreen.d.ts.map +1 -1
- package/dist/commands/checkAppScreen.js +2 -1
- package/dist/commands/checkFullPageScreen.d.ts.map +1 -1
- package/dist/commands/checkFullPageScreen.js +2 -1
- package/dist/commands/checkWebElement.d.ts.map +1 -1
- package/dist/commands/checkWebElement.js +2 -1
- package/dist/commands/checkWebScreen.d.ts.map +1 -1
- package/dist/commands/checkWebScreen.js +2 -1
- package/dist/commands/saveFullPageScreen.js +1 -1
- package/dist/commands/saveWebElement.js +1 -1
- package/dist/commands/saveWebScreen.js +1 -1
- package/dist/helpers/afterScreenshot.d.ts.map +1 -1
- package/dist/helpers/afterScreenshot.interfaces.d.ts +2 -0
- package/dist/helpers/afterScreenshot.interfaces.d.ts.map +1 -1
- package/dist/helpers/afterScreenshot.js +7 -2
- package/dist/helpers/afterScreenshot.test.js +11 -0
- package/dist/helpers/options.d.ts +1 -0
- package/dist/helpers/options.d.ts.map +1 -1
- package/dist/helpers/options.interfaces.d.ts +11 -0
- package/dist/helpers/options.interfaces.d.ts.map +1 -1
- package/dist/helpers/options.js +3 -1
- package/dist/helpers/options.test.js +2 -1
- package/dist/helpers/utils.d.ts.map +1 -1
- package/dist/helpers/utils.interfaces.d.ts +3 -0
- package/dist/helpers/utils.interfaces.d.ts.map +1 -1
- package/dist/helpers/utils.js +2 -0
- package/dist/methods/images.d.ts +2 -2
- package/dist/methods/images.d.ts.map +1 -1
- package/dist/methods/images.executeImageCompare.test.js +219 -1
- package/dist/methods/images.interfaces.d.ts +6 -0
- package/dist/methods/images.interfaces.d.ts.map +1 -1
- package/dist/methods/images.js +55 -10
- package/dist/methods/images.test.js +25 -0
- package/dist/mocks/mocks.d.ts +3 -0
- package/dist/mocks/mocks.d.ts.map +1 -1
- package/dist/mocks/mocks.js +1 -0
- 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,
|
|
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
|
}
|
|
@@ -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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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;
|
|
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({
|
|
@@ -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,
|
|
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":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AAEzE,MAAM,WAAW,YAAY;IAKzB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAEtC;;;OAGG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IAEvC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"options.interfaces.d.ts","sourceRoot":"","sources":["../../src/helpers/options.interfaces.ts"],"names":[],"mappings":"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"}
|
package/dist/helpers/options.js
CHANGED
|
@@ -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":"AAIA,OAAO,KAAK,EACR,yBAAyB,EACzB,qCAAqC,EACrC,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,kCAAkC,EAClC,aAAa,EAEb,qBAAqB,EACrB,iCAAiC,EACjC,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC1B,gCAAgC,EAChC,8BAA8B,EAC9B,qBAAqB,EACrB,iCAAiC,EACjC,cAAc,EACjB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAI3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAA;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAI3D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAczF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAyCrE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAExF;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,GAAG,OAAO,CAEzG;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,GAAG,OAAO,CAE5G;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,iCAAiC,GAAG,MAAM,CAQ7F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,8BAA8B,GAAG,MAAM,CASvF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,gBAAgB,EAAE,MAAM,GAAG,CAAC,CAMxE;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,SAAI,GAAG,cAAc,CAKjG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,cAAc,GAAG,MAAM,CAKhG;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,oBAAoB,EAAE,MAAM,GAAG,qBAAqB,CA4GzF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAC,OAAO,6BAEpC;AAED;;GAEG;AACH,wBAAgB,WAAW,YAE1B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,YAEnC;AACD;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,YAAY,2BAgCnE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,EACtC,eAAe,EACf,KAAK,EACL,eAAe,GAClB,EAAE,0BAA0B,GAAG,OAAO,CAAC,cAAc,CAAC,CA6CtD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCrG;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBnH;AAED;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAAC,EAC5C,eAAe,EACf,uBAAuB,EACvB,SAAS,EACT,KAAK,EACL,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,WAAW,GACd,EAAE,gCAAgC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuC9D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,EACrD,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,EAC9B,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,CAAC,GACP,CAAC,CAAC,CAAC,CAAC,CAEN;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,WAAW,CAAC,OAAO,GAAG,OAAO,CAMlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,YAAY,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAE/G;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAE9G;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,gBAAgB,EAAE,GAAG,GAAG,OAAO,CAElE;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACvC,OAAO,EAAE,kCAAkC,GAC5C,oBAAoB,CA6BtB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,OAAO,EAAE,yBAAyB,GACnC,aAAa,CAcf;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC1C,OAAO,EAAE,qCAAqC,GAC/C,yBAAyB,CAyC3B;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,iCAAiC,GAAG,mBAAmB,CA2B1G"}
|
|
@@ -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":"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
|
|
1
|
+
{"version":3,"file":"utils.interfaces.d.ts","sourceRoot":"","sources":["../../src/helpers/utils.interfaces.ts"],"names":[],"mappings":"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"}
|
package/dist/helpers/utils.js
CHANGED
|
@@ -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,
|
package/dist/methods/images.d.ts
CHANGED
|
@@ -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":"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,
|
|
1
|
+
{"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/methods/images.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACzJ,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9C,MAAM,WAAW,gBAAgB;IAC7B,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAChC,uCAAuC;IACvC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,uBAAuB;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,4CAA4C;IAC5C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,uCAAuC;IACvC,eAAe,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"images.interfaces.d.ts","sourceRoot":"","sources":["../../src/methods/images.interfaces.ts"],"names":[],"mappings":"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"}
|
package/dist/methods/images.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
76
|
-
|
|
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({
|
|
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),
|
|
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;
|
package/dist/mocks/mocks.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/mocks/mocks.js
CHANGED
|
@@ -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.
|
|
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.
|
|
34
|
+
"webdriverio": "^9.23.0"
|
|
35
35
|
},
|
|
36
36
|
"publishConfig": {
|
|
37
37
|
"access": "public"
|