@appium/images-plugin 1.2.3 → 1.3.2
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/LICENSE +2 -2
- package/README.md +1 -1
- package/build/lib/compare.d.ts +28 -0
- package/build/lib/compare.d.ts.map +1 -0
- package/build/lib/compare.js +60 -76
- package/build/lib/finder.d.ts +163 -0
- package/build/lib/finder.d.ts.map +1 -0
- package/build/lib/finder.js +326 -376
- package/build/lib/image-element.d.ts +108 -0
- package/build/lib/image-element.d.ts.map +1 -0
- package/build/lib/image-element.js +194 -238
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +15 -5
- package/build/lib/plugin.d.ts +25 -0
- package/build/lib/plugin.d.ts.map +1 -0
- package/build/lib/plugin.js +88 -86
- package/build/tsconfig.tsbuildinfo +1 -0
- package/index.js +1 -3
- package/lib/compare.js +34 -14
- package/lib/finder.js +141 -83
- package/lib/image-element.js +69 -65
- package/lib/logger.js +3 -1
- package/lib/plugin.js +14 -15
- package/package.json +36 -23
- package/build/index.js +0 -27
- package/build/test/e2e/plugin-e2e-specs.js +0 -77
- package/build/test/fixtures/appstore.png +0 -0
- package/build/test/fixtures/img1.png +0 -0
- package/build/test/fixtures/img2.png +0 -0
- package/build/test/fixtures/img2_part.png +0 -0
- package/build/test/fixtures/index.js +0 -24
- package/build/test/unit/basic-specs.js +0 -16
- package/build/test/unit/finder-specs.js +0 -409
- package/build/test/unit/image-element-specs.js +0 -320
- package/build/test/unit/plugin-specs.js +0 -199
package/LICENSE
CHANGED
|
@@ -178,7 +178,7 @@
|
|
|
178
178
|
APPENDIX: How to apply the Apache License to your work.
|
|
179
179
|
|
|
180
180
|
To apply the Apache License to your work, attach the following
|
|
181
|
-
boilerplate notice, with the fields enclosed by brackets "
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "{}"
|
|
182
182
|
replaced with your own identifying information. (Don't include
|
|
183
183
|
the brackets!) The text should be enclosed in the appropriate
|
|
184
184
|
comment syntax for the file format. We also recommend that a
|
|
@@ -186,7 +186,7 @@
|
|
|
186
186
|
same "printed page" as the copyright notice for easier
|
|
187
187
|
identification within third-party archives.
|
|
188
188
|
|
|
189
|
-
Copyright
|
|
189
|
+
Copyright JS Foundation and other contributors, https://js.foundation
|
|
190
190
|
|
|
191
191
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
192
|
you may not use this file except in compliance with the License.
|
package/README.md
CHANGED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type OccurrenceResult = import('@appium/opencv').OccurrenceResult;
|
|
2
|
+
/**
|
|
3
|
+
* Performs images comparison using OpenCV framework features.
|
|
4
|
+
* It is expected that both OpenCV framework and opencv4nodejs
|
|
5
|
+
* module are installed on the machine where Appium server is running.
|
|
6
|
+
*
|
|
7
|
+
* @param {string} mode - One of possible comparison modes:
|
|
8
|
+
* matchFeatures, getSimilarity, matchTemplate
|
|
9
|
+
* @param {string} firstImage - Base64-encoded image file.
|
|
10
|
+
* All image formats, that OpenCV library itself accepts, are supported.
|
|
11
|
+
* @param {string} secondImage - Base64-encoded image file.
|
|
12
|
+
* All image formats, that OpenCV library itself accepts, are supported.
|
|
13
|
+
* @param {object} [options] - The content of this dictionary depends
|
|
14
|
+
* on the actual `mode` value. See the documentation on `@appium/support`
|
|
15
|
+
* module for more details.
|
|
16
|
+
* @returns {Promise<object|object[]>} The content of the resulting dictionary depends
|
|
17
|
+
* on the actual `mode` and `options` values. See the documentation on
|
|
18
|
+
* `@appium/support` module for more details.
|
|
19
|
+
* @throws {Error} If required OpenCV modules are not installed or
|
|
20
|
+
* if `mode` value is incorrect or if there was an unexpected issue while
|
|
21
|
+
* matching the images.
|
|
22
|
+
*/
|
|
23
|
+
export function compareImages(mode: string, firstImage: string, secondImage: string, options?: object): Promise<object | object[]>;
|
|
24
|
+
export const DEFAULT_MATCH_THRESHOLD: 0.4;
|
|
25
|
+
export const MATCH_TEMPLATE_MODE: "matchTemplate";
|
|
26
|
+
export const MATCH_FEATURES_MODE: "matchFeatures";
|
|
27
|
+
export const GET_SIMILARITY_MODE: "getSimilarity";
|
|
28
|
+
//# sourceMappingURL=compare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../lib/compare.js"],"names":[],"mappings":"+BA2Fa,OAAO,gBAAgB,EAAE,gBAAgB;AAjFtD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,oCAhBW,MAAM,cAEN,MAAM,eAEN,MAAM,YAEN,MAAM,GAGJ,QAAQ,MAAM,GAAC,MAAM,EAAE,CAAC,CAyCpC;AAzDD,0CAAoC;AAFpC,kDAA4C;AAF5C,kDAA4C;AAC5C,kDAA4C"}
|
package/build/lib/compare.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.MATCH_TEMPLATE_MODE = exports.MATCH_FEATURES_MODE = exports.GET_SIMILARITY_MODE = exports.DEFAULT_MATCH_THRESHOLD = void 0;
|
|
9
|
+
exports.compareImages = compareImages;
|
|
10
|
+
|
|
11
|
+
require("source-map-support/register");
|
|
12
|
+
|
|
13
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
14
|
+
|
|
15
|
+
var _driver = require("appium/driver");
|
|
16
|
+
|
|
17
|
+
var _opencv = require("@appium/opencv");
|
|
18
|
+
|
|
19
19
|
const MATCH_FEATURES_MODE = 'matchFeatures';
|
|
20
20
|
exports.MATCH_FEATURES_MODE = MATCH_FEATURES_MODE;
|
|
21
21
|
const GET_SIMILARITY_MODE = 'getSimilarity';
|
|
@@ -24,65 +24,49 @@ const MATCH_TEMPLATE_MODE = 'matchTemplate';
|
|
|
24
24
|
exports.MATCH_TEMPLATE_MODE = MATCH_TEMPLATE_MODE;
|
|
25
25
|
const DEFAULT_MATCH_THRESHOLD = 0.4;
|
|
26
26
|
exports.DEFAULT_MATCH_THRESHOLD = DEFAULT_MATCH_THRESHOLD;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (options.multiple) {
|
|
64
|
-
return result.multiple.map(convertVisualizationToBase64);
|
|
65
|
-
}
|
|
66
|
-
break;
|
|
67
|
-
default:
|
|
68
|
-
throw new base_driver_1.errors.InvalidArgumentError(`'${mode}' images comparison mode is unknown. ` +
|
|
69
|
-
`Only ${JSON.stringify([MATCH_FEATURES_MODE, GET_SIMILARITY_MODE, MATCH_TEMPLATE_MODE])} modes are supported.`);
|
|
70
|
-
}
|
|
71
|
-
return convertVisualizationToBase64(result);
|
|
72
|
-
});
|
|
27
|
+
|
|
28
|
+
async function compareImages(mode, firstImage, secondImage, options = {}) {
|
|
29
|
+
const img1 = Buffer.from(firstImage, 'base64');
|
|
30
|
+
const img2 = Buffer.from(secondImage, 'base64');
|
|
31
|
+
let result = null;
|
|
32
|
+
|
|
33
|
+
switch (_lodash.default.toLower(mode)) {
|
|
34
|
+
case MATCH_FEATURES_MODE.toLowerCase():
|
|
35
|
+
try {
|
|
36
|
+
result = await (0, _opencv.getImagesMatches)(img1, img2, options);
|
|
37
|
+
} catch (err) {
|
|
38
|
+
result = {
|
|
39
|
+
count: 0
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
break;
|
|
44
|
+
|
|
45
|
+
case GET_SIMILARITY_MODE.toLowerCase():
|
|
46
|
+
result = await (0, _opencv.getImagesSimilarity)(img1, img2, options);
|
|
47
|
+
break;
|
|
48
|
+
|
|
49
|
+
case MATCH_TEMPLATE_MODE.toLowerCase():
|
|
50
|
+
result = await (0, _opencv.getImageOccurrence)(img1, img2, options);
|
|
51
|
+
|
|
52
|
+
if (options.multiple) {
|
|
53
|
+
return result.multiple.map(convertVisualizationToBase64);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
break;
|
|
57
|
+
|
|
58
|
+
default:
|
|
59
|
+
throw new _driver.errors.InvalidArgumentError(`'${mode}' images comparison mode is unknown. ` + `Only ${JSON.stringify([MATCH_FEATURES_MODE, GET_SIMILARITY_MODE, MATCH_TEMPLATE_MODE])} modes are supported.`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return convertVisualizationToBase64(result);
|
|
73
63
|
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* base64 encodes the visualization part of the result
|
|
77
|
-
* (if necessary)
|
|
78
|
-
*
|
|
79
|
-
* @param {OccurrenceResult} element - occurrence result
|
|
80
|
-
*
|
|
81
|
-
**/
|
|
64
|
+
|
|
82
65
|
function convertVisualizationToBase64(element) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
66
|
+
if (!_lodash.default.isEmpty(element.visualization)) {
|
|
67
|
+
element.visualization = element.visualization.toString('base64');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return element;
|
|
87
71
|
}
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQVRDSF9GRUFUVVJFU19NT0RFIiwiR0VUX1NJTUlMQVJJVFlfTU9ERSIsIk1BVENIX1RFTVBMQVRFX01PREUiLCJERUZBVUxUX01BVENIX1RIUkVTSE9MRCIsImNvbXBhcmVJbWFnZXMiLCJtb2RlIiwiZmlyc3RJbWFnZSIsInNlY29uZEltYWdlIiwib3B0aW9ucyIsImltZzEiLCJCdWZmZXIiLCJmcm9tIiwiaW1nMiIsInJlc3VsdCIsIl8iLCJ0b0xvd2VyIiwidG9Mb3dlckNhc2UiLCJnZXRJbWFnZXNNYXRjaGVzIiwiZXJyIiwiY291bnQiLCJnZXRJbWFnZXNTaW1pbGFyaXR5IiwiZ2V0SW1hZ2VPY2N1cnJlbmNlIiwibXVsdGlwbGUiLCJtYXAiLCJjb252ZXJ0VmlzdWFsaXphdGlvblRvQmFzZTY0IiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiZWxlbWVudCIsImlzRW1wdHkiLCJ2aXN1YWxpemF0aW9uIiwidG9TdHJpbmciXSwic291cmNlcyI6WyIuLi8uLi9saWIvY29tcGFyZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtlcnJvcnN9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHtnZXRJbWFnZXNNYXRjaGVzLCBnZXRJbWFnZXNTaW1pbGFyaXR5LCBnZXRJbWFnZU9jY3VycmVuY2V9IGZyb20gJ0BhcHBpdW0vb3BlbmN2JztcblxuY29uc3QgTUFUQ0hfRkVBVFVSRVNfTU9ERSA9ICdtYXRjaEZlYXR1cmVzJztcbmNvbnN0IEdFVF9TSU1JTEFSSVRZX01PREUgPSAnZ2V0U2ltaWxhcml0eSc7XG5jb25zdCBNQVRDSF9URU1QTEFURV9NT0RFID0gJ21hdGNoVGVtcGxhdGUnO1xuXG5jb25zdCBERUZBVUxUX01BVENIX1RIUkVTSE9MRCA9IDAuNDtcblxuLyoqXG4gKiBQZXJmb3JtcyBpbWFnZXMgY29tcGFyaXNvbiB1c2luZyBPcGVuQ1YgZnJhbWV3b3JrIGZlYXR1cmVzLlxuICogSXQgaXMgZXhwZWN0ZWQgdGhhdCBib3RoIE9wZW5DViBmcmFtZXdvcmsgYW5kIG9wZW5jdjRub2RlanNcbiAqIG1vZHVsZSBhcmUgaW5zdGFsbGVkIG9uIHRoZSBtYWNoaW5lIHdoZXJlIEFwcGl1bSBzZXJ2ZXIgaXMgcnVubmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZSAtIE9uZSBvZiBwb3NzaWJsZSBjb21wYXJpc29uIG1vZGVzOlxuICogbWF0Y2hGZWF0dXJlcywgZ2V0U2ltaWxhcml0eSwgbWF0Y2hUZW1wbGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZpcnN0SW1hZ2UgLSBCYXNlNjQtZW5jb2RlZCBpbWFnZSBmaWxlLlxuICogQWxsIGltYWdlIGZvcm1hdHMsIHRoYXQgT3BlbkNWIGxpYnJhcnkgaXRzZWxmIGFjY2VwdHMsIGFyZSBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2Vjb25kSW1hZ2UgLSBCYXNlNjQtZW5jb2RlZCBpbWFnZSBmaWxlLlxuICogQWxsIGltYWdlIGZvcm1hdHMsIHRoYXQgT3BlbkNWIGxpYnJhcnkgaXRzZWxmIGFjY2VwdHMsIGFyZSBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gVGhlIGNvbnRlbnQgb2YgdGhpcyBkaWN0aW9uYXJ5IGRlcGVuZHNcbiAqIG9uIHRoZSBhY3R1YWwgYG1vZGVgIHZhbHVlLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYEBhcHBpdW0vc3VwcG9ydGBcbiAqIG1vZHVsZSBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0fG9iamVjdFtdPn0gVGhlIGNvbnRlbnQgb2YgdGhlIHJlc3VsdGluZyBkaWN0aW9uYXJ5IGRlcGVuZHNcbiAqIG9uIHRoZSBhY3R1YWwgYG1vZGVgIGFuZCBgb3B0aW9uc2AgdmFsdWVzLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb25cbiAqIGBAYXBwaXVtL3N1cHBvcnRgIG1vZHVsZSBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHRocm93cyB7RXJyb3J9IElmIHJlcXVpcmVkIE9wZW5DViBtb2R1bGVzIGFyZSBub3QgaW5zdGFsbGVkIG9yXG4gKiBpZiBgbW9kZWAgdmFsdWUgaXMgaW5jb3JyZWN0IG9yIGlmIHRoZXJlIHdhcyBhbiB1bmV4cGVjdGVkIGlzc3VlIHdoaWxlXG4gKiBtYXRjaGluZyB0aGUgaW1hZ2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wYXJlSW1hZ2VzKG1vZGUsIGZpcnN0SW1hZ2UsIHNlY29uZEltYWdlLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgaW1nMSA9IEJ1ZmZlci5mcm9tKGZpcnN0SW1hZ2UsICdiYXNlNjQnKTtcbiAgY29uc3QgaW1nMiA9IEJ1ZmZlci5mcm9tKHNlY29uZEltYWdlLCAnYmFzZTY0Jyk7XG4gIGxldCByZXN1bHQgPSBudWxsO1xuICBzd2l0Y2ggKF8udG9Mb3dlcihtb2RlKSkge1xuICAgIGNhc2UgTUFUQ0hfRkVBVFVSRVNfTU9ERS50b0xvd2VyQ2FzZSgpOlxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZ2V0SW1hZ2VzTWF0Y2hlcyhpbWcxLCBpbWcyLCBvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBtaWdodCB0aHJvdyBpZiBubyBtYXRjaGVzXG4gICAgICAgIHJlc3VsdCA9IHtjb3VudDogMH07XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIEdFVF9TSU1JTEFSSVRZX01PREUudG9Mb3dlckNhc2UoKTpcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGdldEltYWdlc1NpbWlsYXJpdHkoaW1nMSwgaW1nMiwgb3B0aW9ucyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIE1BVENIX1RFTVBMQVRFX01PREUudG9Mb3dlckNhc2UoKTpcbiAgICAgIC8vIGZpcnN0SW1hZ2UvaW1nMSBpcyB0aGUgZnVsbCBpbWFnZSBhbmQgc2Vjb25kSW1hZ2UvaW1nMiBpcyB0aGUgcGFydGlhbCBvbmVcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGdldEltYWdlT2NjdXJyZW5jZShpbWcxLCBpbWcyLCBvcHRpb25zKTtcbiAgICAgIGlmIChvcHRpb25zLm11bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQubXVsdGlwbGUubWFwKGNvbnZlcnRWaXN1YWxpemF0aW9uVG9CYXNlNjQpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgIGAnJHttb2RlfScgaW1hZ2VzIGNvbXBhcmlzb24gbW9kZSBpcyB1bmtub3duLiBgICtcbiAgICAgICAgICBgT25seSAke0pTT04uc3RyaW5naWZ5KFtcbiAgICAgICAgICAgIE1BVENIX0ZFQVRVUkVTX01PREUsXG4gICAgICAgICAgICBHRVRfU0lNSUxBUklUWV9NT0RFLFxuICAgICAgICAgICAgTUFUQ0hfVEVNUExBVEVfTU9ERSxcbiAgICAgICAgICBdKX0gbW9kZXMgYXJlIHN1cHBvcnRlZC5gXG4gICAgICApO1xuICB9XG4gIHJldHVybiBjb252ZXJ0VmlzdWFsaXphdGlvblRvQmFzZTY0KHJlc3VsdCk7XG59XG5cbi8qKlxuICogYmFzZTY0IGVuY29kZXMgdGhlIHZpc3VhbGl6YXRpb24gcGFydCBvZiB0aGUgcmVzdWx0XG4gKiAoaWYgbmVjZXNzYXJ5KVxuICpcbiAqIEBwYXJhbSB7T2NjdXJyZW5jZVJlc3VsdH0gZWxlbWVudCAtIG9jY3VycmVuY2UgcmVzdWx0XG4gKlxuICoqL1xuZnVuY3Rpb24gY29udmVydFZpc3VhbGl6YXRpb25Ub0Jhc2U2NChlbGVtZW50KSB7XG4gIGlmICghXy5pc0VtcHR5KGVsZW1lbnQudmlzdWFsaXphdGlvbikpIHtcbiAgICBlbGVtZW50LnZpc3VhbGl6YXRpb24gPSBlbGVtZW50LnZpc3VhbGl6YXRpb24udG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbmV4cG9ydCB7XG4gIGNvbXBhcmVJbWFnZXMsXG4gIERFRkFVTFRfTUFUQ0hfVEhSRVNIT0xELFxuICBNQVRDSF9URU1QTEFURV9NT0RFLFxuICBNQVRDSF9GRUFUVVJFU19NT0RFLFxuICBHRVRfU0lNSUxBUklUWV9NT0RFLFxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL29wZW5jdicpLk9jY3VycmVuY2VSZXN1bHR9IE9jY3VycmVuY2VSZXN1bHRcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxtQkFBbUIsR0FBRyxlQUE1Qjs7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxlQUE1Qjs7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxlQUE1Qjs7QUFFQSxNQUFNQyx1QkFBdUIsR0FBRyxHQUFoQzs7O0FBdUJBLGVBQWVDLGFBQWYsQ0FBNkJDLElBQTdCLEVBQW1DQyxVQUFuQyxFQUErQ0MsV0FBL0MsRUFBNERDLE9BQU8sR0FBRyxFQUF0RSxFQUEwRTtFQUN4RSxNQUFNQyxJQUFJLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZTCxVQUFaLEVBQXdCLFFBQXhCLENBQWI7RUFDQSxNQUFNTSxJQUFJLEdBQUdGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZSixXQUFaLEVBQXlCLFFBQXpCLENBQWI7RUFDQSxJQUFJTSxNQUFNLEdBQUcsSUFBYjs7RUFDQSxRQUFRQyxlQUFBLENBQUVDLE9BQUYsQ0FBVVYsSUFBVixDQUFSO0lBQ0UsS0FBS0wsbUJBQW1CLENBQUNnQixXQUFwQixFQUFMO01BQ0UsSUFBSTtRQUNGSCxNQUFNLEdBQUcsTUFBTSxJQUFBSSx3QkFBQSxFQUFpQlIsSUFBakIsRUFBdUJHLElBQXZCLEVBQTZCSixPQUE3QixDQUFmO01BQ0QsQ0FGRCxDQUVFLE9BQU9VLEdBQVAsRUFBWTtRQUVaTCxNQUFNLEdBQUc7VUFBQ00sS0FBSyxFQUFFO1FBQVIsQ0FBVDtNQUNEOztNQUNEOztJQUNGLEtBQUtsQixtQkFBbUIsQ0FBQ2UsV0FBcEIsRUFBTDtNQUNFSCxNQUFNLEdBQUcsTUFBTSxJQUFBTywyQkFBQSxFQUFvQlgsSUFBcEIsRUFBMEJHLElBQTFCLEVBQWdDSixPQUFoQyxDQUFmO01BQ0E7O0lBQ0YsS0FBS04sbUJBQW1CLENBQUNjLFdBQXBCLEVBQUw7TUFFRUgsTUFBTSxHQUFHLE1BQU0sSUFBQVEsMEJBQUEsRUFBbUJaLElBQW5CLEVBQXlCRyxJQUF6QixFQUErQkosT0FBL0IsQ0FBZjs7TUFDQSxJQUFJQSxPQUFPLENBQUNjLFFBQVosRUFBc0I7UUFDcEIsT0FBT1QsTUFBTSxDQUFDUyxRQUFQLENBQWdCQyxHQUFoQixDQUFvQkMsNEJBQXBCLENBQVA7TUFDRDs7TUFDRDs7SUFDRjtNQUNFLE1BQU0sSUFBSUMsY0FBQSxDQUFPQyxvQkFBWCxDQUNILElBQUdyQixJQUFLLHVDQUFULEdBQ0csUUFBT3NCLElBQUksQ0FBQ0MsU0FBTCxDQUFlLENBQ3JCNUIsbUJBRHFCLEVBRXJCQyxtQkFGcUIsRUFHckJDLG1CQUhxQixDQUFmLENBSUwsdUJBTkQsQ0FBTjtFQXBCSjs7RUE2QkEsT0FBT3NCLDRCQUE0QixDQUFDWCxNQUFELENBQW5DO0FBQ0Q7O0FBU0QsU0FBU1csNEJBQVQsQ0FBc0NLLE9BQXRDLEVBQStDO0VBQzdDLElBQUksQ0FBQ2YsZUFBQSxDQUFFZ0IsT0FBRixDQUFVRCxPQUFPLENBQUNFLGFBQWxCLENBQUwsRUFBdUM7SUFDckNGLE9BQU8sQ0FBQ0UsYUFBUixHQUF3QkYsT0FBTyxDQUFDRSxhQUFSLENBQXNCQyxRQUF0QixDQUErQixRQUEvQixDQUF4QjtFQUNEOztFQUVELE9BQU9ILE9BQVA7QUFDRCJ9
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
export default class ImageElementFinder {
|
|
2
|
+
/**
|
|
3
|
+
*
|
|
4
|
+
* @param {ExternalDriver} driver
|
|
5
|
+
* @param {number} [maxSize]
|
|
6
|
+
*/
|
|
7
|
+
constructor(driver: ExternalDriver, maxSize?: number | undefined);
|
|
8
|
+
/** @type {ExternalDriver} */
|
|
9
|
+
driver: ExternalDriver;
|
|
10
|
+
/** @type {LRU<string,ImageElement>} */
|
|
11
|
+
imgElCache: LRU<string, ImageElement>;
|
|
12
|
+
setDriver(driver: any): void;
|
|
13
|
+
/**
|
|
14
|
+
* @param {ImageElement} imgEl
|
|
15
|
+
* @returns {Element}
|
|
16
|
+
*/
|
|
17
|
+
registerImageElement(imgEl: ImageElement): Element;
|
|
18
|
+
/**
|
|
19
|
+
* @typedef FindByImageOptions
|
|
20
|
+
* @property {boolean} [shouldCheckStaleness=false] - whether this call to find an
|
|
21
|
+
* image is merely to check staleness. If so we can bypass a lot of logic
|
|
22
|
+
* @property {boolean} [multiple=false] - Whether we are finding one element or
|
|
23
|
+
* multiple
|
|
24
|
+
* @property {boolean} [ignoreDefaultImageTemplateScale=false] - Whether we
|
|
25
|
+
* ignore defaultImageTemplateScale. It can be used when you would like to
|
|
26
|
+
* scale b64Template with defaultImageTemplateScale setting.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Find a screen rect represented by an ImageElement corresponding to an image
|
|
30
|
+
* template sent in by the client
|
|
31
|
+
*
|
|
32
|
+
* @param {string} b64Template - base64-encoded image used as a template to be
|
|
33
|
+
* matched in the screenshot
|
|
34
|
+
* @param {FindByImageOptions} opts - additional options
|
|
35
|
+
*
|
|
36
|
+
* @returns {Promise<Element|Element[]|ImageElement>} - WebDriver element with a special id prefix
|
|
37
|
+
*/
|
|
38
|
+
findByImage(b64Template: string, { shouldCheckStaleness, multiple, ignoreDefaultImageTemplateScale }: {
|
|
39
|
+
/**
|
|
40
|
+
* - whether this call to find an
|
|
41
|
+
* image is merely to check staleness. If so we can bypass a lot of logic
|
|
42
|
+
*/
|
|
43
|
+
shouldCheckStaleness?: boolean | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* - Whether we are finding one element or
|
|
46
|
+
* multiple
|
|
47
|
+
*/
|
|
48
|
+
multiple?: boolean | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* - Whether we
|
|
51
|
+
* ignore defaultImageTemplateScale. It can be used when you would like to
|
|
52
|
+
* scale b64Template with defaultImageTemplateScale setting.
|
|
53
|
+
*/
|
|
54
|
+
ignoreDefaultImageTemplateScale?: boolean | undefined;
|
|
55
|
+
}): Promise<Element | Element[] | ImageElement>;
|
|
56
|
+
/**
|
|
57
|
+
* Ensure that the image template sent in for a find is of a suitable size
|
|
58
|
+
*
|
|
59
|
+
* @param {string} b64Template - base64-encoded image
|
|
60
|
+
* @param {number} screenWidth - width of screen
|
|
61
|
+
* @param {number} screenHeight - height of screen
|
|
62
|
+
*
|
|
63
|
+
* @returns {Promise<string>} base64-encoded image, potentially resized
|
|
64
|
+
*/
|
|
65
|
+
ensureTemplateSize(b64Template: string, screenWidth: number, screenHeight: number): Promise<string>;
|
|
66
|
+
/**
|
|
67
|
+
* Get the screenshot image that will be used for find by element, potentially
|
|
68
|
+
* altering it in various ways based on user-requested settings
|
|
69
|
+
*
|
|
70
|
+
* @param {number} screenWidth - width of screen
|
|
71
|
+
* @param {number} screenHeight - height of screen
|
|
72
|
+
*
|
|
73
|
+
* @returns {Promise<Screenshot & {scale?: ScreenshotScale}>} base64-encoded screenshot and ScreenshotScale
|
|
74
|
+
*/
|
|
75
|
+
getScreenshotForImageFind(screenWidth: number, screenHeight: number): Promise<Screenshot & {
|
|
76
|
+
scale?: ScreenshotScale | undefined;
|
|
77
|
+
}>;
|
|
78
|
+
/**
|
|
79
|
+
* @typedef ImageTemplateSettings
|
|
80
|
+
* @property {boolean} fixImageTemplateScale - fixImageTemplateScale in device-settings
|
|
81
|
+
* @property {number} defaultImageTemplateScale - defaultImageTemplateScale in device-settings
|
|
82
|
+
* @property {boolean} ignoreDefaultImageTemplateScale - Ignore defaultImageTemplateScale if it has true.
|
|
83
|
+
* If b64Template has been scaled to defaultImageTemplateScale or should ignore the scale,
|
|
84
|
+
* this parameter should be true. e.g. click in image-element module
|
|
85
|
+
* @property {number} xScale - Scale ratio for width
|
|
86
|
+
* @property {number} yScale - Scale ratio for height
|
|
87
|
+
|
|
88
|
+
*/
|
|
89
|
+
/**
|
|
90
|
+
* Get a image that will be used for template maching.
|
|
91
|
+
* Returns scaled image if scale ratio is provided.
|
|
92
|
+
*
|
|
93
|
+
*
|
|
94
|
+
* @param {string} b64Template - base64-encoded image used as a template to be
|
|
95
|
+
* matched in the screenshot
|
|
96
|
+
* @param {ImageTemplateSettings} opts - Image template scale related options
|
|
97
|
+
*
|
|
98
|
+
* @returns {Promise<string>} base64-encoded scaled template screenshot
|
|
99
|
+
*/
|
|
100
|
+
fixImageTemplateScale(b64Template: string, opts: {
|
|
101
|
+
/**
|
|
102
|
+
* - fixImageTemplateScale in device-settings
|
|
103
|
+
*/
|
|
104
|
+
fixImageTemplateScale: boolean;
|
|
105
|
+
/**
|
|
106
|
+
* - defaultImageTemplateScale in device-settings
|
|
107
|
+
*/
|
|
108
|
+
defaultImageTemplateScale: number;
|
|
109
|
+
/**
|
|
110
|
+
* - Ignore defaultImageTemplateScale if it has true.
|
|
111
|
+
* If b64Template has been scaled to defaultImageTemplateScale or should ignore the scale,
|
|
112
|
+
* this parameter should be true. e.g. click in image-element module
|
|
113
|
+
*/
|
|
114
|
+
ignoreDefaultImageTemplateScale: boolean;
|
|
115
|
+
/**
|
|
116
|
+
* - Scale ratio for width
|
|
117
|
+
*/
|
|
118
|
+
xScale: number;
|
|
119
|
+
/**
|
|
120
|
+
* - Scale ratio for height
|
|
121
|
+
*/
|
|
122
|
+
yScale: number;
|
|
123
|
+
}): Promise<string>;
|
|
124
|
+
}
|
|
125
|
+
export type ExternalDriver = import('@appium/types').ExternalDriver;
|
|
126
|
+
export type Element = import('@appium/types').Element;
|
|
127
|
+
export type Screenshot = {
|
|
128
|
+
/**
|
|
129
|
+
* - base64 based screenshot string
|
|
130
|
+
*/
|
|
131
|
+
b64Screenshot: string;
|
|
132
|
+
};
|
|
133
|
+
export type ScreenshotScale = {
|
|
134
|
+
/**
|
|
135
|
+
* - Scale ratio for width
|
|
136
|
+
*/
|
|
137
|
+
xScale: number;
|
|
138
|
+
/**
|
|
139
|
+
* - Scale ratio for height
|
|
140
|
+
*/
|
|
141
|
+
yScale: number;
|
|
142
|
+
};
|
|
143
|
+
import LRU from "lru-cache";
|
|
144
|
+
import { ImageElement } from "./image-element";
|
|
145
|
+
export const W3C_ELEMENT_KEY: "element-6066-11e4-a52e-4f735466cecf";
|
|
146
|
+
export const MJSONWP_ELEMENT_KEY: "ELEMENT";
|
|
147
|
+
export namespace DEFAULT_SETTINGS {
|
|
148
|
+
export { DEFAULT_MATCH_THRESHOLD as imageMatchThreshold };
|
|
149
|
+
export const imageMatchMethod: string;
|
|
150
|
+
export const fixImageFindScreenshotDims: boolean;
|
|
151
|
+
export const fixImageTemplateSize: boolean;
|
|
152
|
+
export const fixImageTemplateScale: boolean;
|
|
153
|
+
export { DEFAULT_TEMPLATE_IMAGE_SCALE as defaultImageTemplateScale };
|
|
154
|
+
export const checkForImageElementStaleness: boolean;
|
|
155
|
+
export const autoUpdateImageElementPosition: boolean;
|
|
156
|
+
export { IMAGE_EL_TAP_STRATEGY_W3C as imageElementTapStrategy };
|
|
157
|
+
export const getMatchedImageResult: boolean;
|
|
158
|
+
}
|
|
159
|
+
export const DEFAULT_FIX_IMAGE_TEMPLATE_SCALE: 1;
|
|
160
|
+
import { DEFAULT_MATCH_THRESHOLD } from "./compare";
|
|
161
|
+
import { DEFAULT_TEMPLATE_IMAGE_SCALE } from "./image-element";
|
|
162
|
+
import { IMAGE_EL_TAP_STRATEGY_W3C } from "./image-element";
|
|
163
|
+
//# sourceMappingURL=finder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finder.d.ts","sourceRoot":"","sources":["../../lib/finder.js"],"names":[],"mappings":"AA0EA;IAOE;;;;OAIG;IACH,oBAHW,cAAc,gCAUxB;IAlBD,6BAA6B;IAC7B,QADW,cAAc,CAClB;IAEP,uCAAuC;IACvC,YADW,IAAI,MAAM,EAAC,YAAY,CAAC,CACxB;IAgBX,6BAEC;IAED;;;OAGG;IACH,4BAHW,YAAY,GACV,OAAO,CAMnB;IAED;;;;;;;;;OASG;IAEH;;;;;;;;;OASG;IACH,yBANW,MAAM;;;;;;;;;;;;;;;;;QAIJ,QAAQ,OAAO,GAAC,OAAO,EAAE,GAAC,YAAY,CAAC,CAuHnD;IAED;;;;;;;;OAQG;IACH,gCANW,MAAM,eACN,MAAM,gBACN,MAAM,GAEJ,QAAQ,MAAM,CAAC,CAqB3B;IAED;;;;;;;;OAQG;IACH,uCALW,MAAM,gBACN,MAAM;;OAuHhB;IAED;;;;;;;;;;OAUG;IACH;;;;;;;;;;OAUG;IACH,mCANW,MAAM;;;;+BAdH,OAAO;;;;mCACP,MAAM;;;;;;yCACN,OAAO;;;;gBAGP,MAAM;;;;gBACN,MAAM;QAYP,QAAQ,MAAM,CAAC,CA+D3B;CACF;6BAKY,OAAO,eAAe,EAAE,cAAc;sBACtC,OAAO,eAAe,EAAE,OAAO;;;;;mBAK9B,MAAM;;;;;;YAKN,MAAM;;;;YACN,MAAM;;;;AA7epB,oEAAwD;AADxD,4CAAsC;;;;;;;;;;;;;AAEtC,iDAA2C"}
|