@appium/images-plugin 1.2.3 → 1.2.4
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/README.md +1 -3
- package/build/lib/compare.js +31 -36
- package/build/lib/finder.js +215 -230
- package/build/lib/image-element.js +100 -113
- package/build/lib/plugin.js +27 -46
- package/build/test/e2e/plugin-e2e-specs.js +28 -43
- package/build/test/unit/finder-specs.js +228 -303
- package/build/test/unit/image-element-specs.js +118 -163
- package/build/test/unit/plugin-specs.js +91 -141
- package/build/tsconfig.tsbuildinfo +1 -0
- package/lib/compare.js +9 -4
- package/package.json +6 -5
- package/build/test/unit/basic-specs.js +0 -16
package/README.md
CHANGED
|
@@ -9,8 +9,6 @@ This is an official Appium plugin designed to facilitate image comparison, visua
|
|
|
9
9
|
|
|
10
10
|
## Prerequisites
|
|
11
11
|
|
|
12
|
-
* [OpenCV](https://opencv.org) 3.x native libraries
|
|
13
|
-
* [opencv4nodejs](https://github.com/justadudewhohacks/opencv4nodejs) NPM module: install with `npm i -g opencv4nodejs`. By default the preinstall script of this module also downloads and makes all the required OpenCV libs from source, but this requires developer tools to be available on the host system.
|
|
14
12
|
* Appium Server 2.0+
|
|
15
13
|
|
|
16
14
|
## Installation - Server
|
|
@@ -30,7 +28,7 @@ No special action is needed to make the features available in the various Appium
|
|
|
30
28
|
The plugin will not be active unless turned on when invoking the Appium server:
|
|
31
29
|
|
|
32
30
|
```
|
|
33
|
-
appium --plugins=images
|
|
31
|
+
appium --use-plugins=images
|
|
34
32
|
```
|
|
35
33
|
|
|
36
34
|
## Usage
|
package/build/lib/compare.js
CHANGED
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
4
|
};
|
|
@@ -15,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
6
|
exports.GET_SIMILARITY_MODE = exports.MATCH_FEATURES_MODE = exports.MATCH_TEMPLATE_MODE = exports.DEFAULT_MATCH_THRESHOLD = exports.compareImages = void 0;
|
|
16
7
|
const lodash_1 = __importDefault(require("lodash"));
|
|
17
8
|
const base_driver_1 = require("@appium/base-driver");
|
|
18
|
-
const
|
|
9
|
+
const opencv_1 = require("@appium/opencv");
|
|
19
10
|
const MATCH_FEATURES_MODE = 'matchFeatures';
|
|
20
11
|
exports.MATCH_FEATURES_MODE = MATCH_FEATURES_MODE;
|
|
21
12
|
const GET_SIMILARITY_MODE = 'getSimilarity';
|
|
@@ -45,31 +36,35 @@ exports.DEFAULT_MATCH_THRESHOLD = DEFAULT_MATCH_THRESHOLD;
|
|
|
45
36
|
* if `mode` value is incorrect or if there was an unexpected issue while
|
|
46
37
|
* matching the images.
|
|
47
38
|
*/
|
|
48
|
-
function compareImages(mode, firstImage, secondImage, options = {}) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
result =
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
39
|
+
async function compareImages(mode, firstImage, secondImage, options = {}) {
|
|
40
|
+
const img1 = Buffer.from(firstImage, 'base64');
|
|
41
|
+
const img2 = Buffer.from(secondImage, 'base64');
|
|
42
|
+
let result = null;
|
|
43
|
+
switch (lodash_1.default.toLower(mode)) {
|
|
44
|
+
case MATCH_FEATURES_MODE.toLowerCase():
|
|
45
|
+
try {
|
|
46
|
+
result = await (0, opencv_1.getImagesMatches)(img1, img2, options);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
// might throw if no matches
|
|
50
|
+
result = { count: 0 };
|
|
51
|
+
}
|
|
52
|
+
break;
|
|
53
|
+
case GET_SIMILARITY_MODE.toLowerCase():
|
|
54
|
+
result = await (0, opencv_1.getImagesSimilarity)(img1, img2, options);
|
|
55
|
+
break;
|
|
56
|
+
case MATCH_TEMPLATE_MODE.toLowerCase():
|
|
57
|
+
// firstImage/img1 is the full image and secondImage/img2 is the partial one
|
|
58
|
+
result = await (0, opencv_1.getImageOccurrence)(img1, img2, options);
|
|
59
|
+
if (options.multiple) {
|
|
60
|
+
return result.multiple.map(convertVisualizationToBase64);
|
|
61
|
+
}
|
|
62
|
+
break;
|
|
63
|
+
default:
|
|
64
|
+
throw new base_driver_1.errors.InvalidArgumentError(`'${mode}' images comparison mode is unknown. ` +
|
|
65
|
+
`Only ${JSON.stringify([MATCH_FEATURES_MODE, GET_SIMILARITY_MODE, MATCH_TEMPLATE_MODE])} modes are supported.`);
|
|
66
|
+
}
|
|
67
|
+
return convertVisualizationToBase64(result);
|
|
73
68
|
}
|
|
74
69
|
exports.compareImages = compareImages;
|
|
75
70
|
/**
|
|
@@ -85,4 +80,4 @@ function convertVisualizationToBase64(element) {
|
|
|
85
80
|
}
|
|
86
81
|
return element;
|
|
87
82
|
}
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGFyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9jb21wYXJlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUF1QjtBQUN2QixxREFBNkM7QUFDN0MsMkNBQTJGO0FBRTNGLE1BQU0sbUJBQW1CLEdBQUcsZUFBZSxDQUFDO0FBd0UwQixrREFBbUI7QUF2RXpGLE1BQU0sbUJBQW1CLEdBQUcsZUFBZSxDQUFDO0FBd0UxQyxrREFBbUI7QUF2RXJCLE1BQU0sbUJBQW1CLEdBQUcsZUFBZSxDQUFDO0FBc0VLLGtEQUFtQjtBQXBFcEUsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFvRVosMERBQXVCO0FBbEUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxLQUFLLFVBQVUsYUFBYSxDQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE9BQU8sR0FBRyxFQUFFO0lBQ3ZFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixRQUFRLGdCQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3ZCLEtBQUssbUJBQW1CLENBQUMsV0FBVyxFQUFFO1lBQ3BDLElBQUk7Z0JBQ0YsTUFBTSxHQUFHLE1BQU0sSUFBQSx5QkFBZ0IsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ3REO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osNEJBQTRCO2dCQUM1QixNQUFNLEdBQUcsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLENBQUM7YUFDckI7WUFDRCxNQUFNO1FBQ1IsS0FBSyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUU7WUFDcEMsTUFBTSxHQUFHLE1BQU0sSUFBQSw0QkFBbUIsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3hELE1BQU07UUFDUixLQUFLLG1CQUFtQixDQUFDLFdBQVcsRUFBRTtZQUNwQyw0RUFBNEU7WUFDNUUsTUFBTSxHQUFHLE1BQU0sSUFBQSwyQkFBa0IsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtnQkFDcEIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsTUFBTTtRQUNSO1lBQ0UsTUFBTSxJQUFJLG9CQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxJQUFJLHVDQUF1QztnQkFDbkYsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0tBQ3JIO0lBQ0QsT0FBTyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBaUJRLHNDQUFhO0FBZnRCOzs7Ozs7R0FNRztBQUNILFNBQVMsNEJBQTRCLENBQUUsT0FBTztJQUM1QyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQ3JDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDbEU7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIn0=
|