@appium/images-plugin 1.2.4 → 1.3.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/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 [yyyy] [name of copyright owner]
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
@@ -9,6 +9,8 @@ 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.
12
14
  * Appium Server 2.0+
13
15
 
14
16
  ## Installation - Server
@@ -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"}
@@ -1,12 +1,21 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.GET_SIMILARITY_MODE = exports.MATCH_FEATURES_MODE = exports.MATCH_TEMPLATE_MODE = exports.DEFAULT_MATCH_THRESHOLD = exports.compareImages = void 0;
7
- const lodash_1 = __importDefault(require("lodash"));
8
- const base_driver_1 = require("@appium/base-driver");
9
- const opencv_1 = require("@appium/opencv");
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
+
10
19
  const MATCH_FEATURES_MODE = 'matchFeatures';
11
20
  exports.MATCH_FEATURES_MODE = MATCH_FEATURES_MODE;
12
21
  const GET_SIMILARITY_MODE = 'getSimilarity';
@@ -15,69 +24,49 @@ const MATCH_TEMPLATE_MODE = 'matchTemplate';
15
24
  exports.MATCH_TEMPLATE_MODE = MATCH_TEMPLATE_MODE;
16
25
  const DEFAULT_MATCH_THRESHOLD = 0.4;
17
26
  exports.DEFAULT_MATCH_THRESHOLD = DEFAULT_MATCH_THRESHOLD;
18
- /**
19
- * Performs images comparison using OpenCV framework features.
20
- * It is expected that both OpenCV framework and opencv4nodejs
21
- * module are installed on the machine where Appium server is running.
22
- *
23
- * @param {string} mode - One of possible comparison modes:
24
- * matchFeatures, getSimilarity, matchTemplate
25
- * @param {string} firstImage - Base64-encoded image file.
26
- * All image formats, that OpenCV library itself accepts, are supported.
27
- * @param {string} secondImage - Base64-encoded image file.
28
- * All image formats, that OpenCV library itself accepts, are supported.
29
- * @param {?Object} options [{}] - The content of this dictionary depends
30
- * on the actual `mode` value. See the documentation on `@appium/support`
31
- * module for more details.
32
- * @returns {Object} The content of the resulting dictionary depends
33
- * on the actual `mode` and `options` values. See the documentation on
34
- * `@appium/support` module for more details.
35
- * @throws {Error} If required OpenCV modules are not installed or
36
- * if `mode` value is incorrect or if there was an unexpected issue while
37
- * matching the images.
38
- */
27
+
39
28
  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);
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);
68
63
  }
69
- exports.compareImages = compareImages;
70
- /**
71
- * base64 encodes the visualization part of the result
72
- * (if necessary)
73
- *
74
- * @param {OccurrenceResult} element - occurrence result
75
- *
76
- **/
64
+
77
65
  function convertVisualizationToBase64(element) {
78
- if (!lodash_1.default.isEmpty(element.visualization)) {
79
- element.visualization = element.visualization.toString('base64');
80
- }
81
- return element;
66
+ if (!_lodash.default.isEmpty(element.visualization)) {
67
+ element.visualization = element.visualization.toString('base64');
68
+ }
69
+
70
+ return element;
82
71
  }
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGFyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9jb21wYXJlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUF1QjtBQUN2QixxREFBNkM7QUFDN0MsMkNBQTJGO0FBRTNGLE1BQU0sbUJBQW1CLEdBQUcsZUFBZSxDQUFDO0FBd0UwQixrREFBbUI7QUF2RXpGLE1BQU0sbUJBQW1CLEdBQUcsZUFBZSxDQUFDO0FBd0UxQyxrREFBbUI7QUF2RXJCLE1BQU0sbUJBQW1CLEdBQUcsZUFBZSxDQUFDO0FBc0VLLGtEQUFtQjtBQXBFcEUsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFvRVosMERBQXVCO0FBbEUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxLQUFLLFVBQVUsYUFBYSxDQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE9BQU8sR0FBRyxFQUFFO0lBQ3ZFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixRQUFRLGdCQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3ZCLEtBQUssbUJBQW1CLENBQUMsV0FBVyxFQUFFO1lBQ3BDLElBQUk7Z0JBQ0YsTUFBTSxHQUFHLE1BQU0sSUFBQSx5QkFBZ0IsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ3REO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osNEJBQTRCO2dCQUM1QixNQUFNLEdBQUcsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLENBQUM7YUFDckI7WUFDRCxNQUFNO1FBQ1IsS0FBSyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUU7WUFDcEMsTUFBTSxHQUFHLE1BQU0sSUFBQSw0QkFBbUIsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3hELE1BQU07UUFDUixLQUFLLG1CQUFtQixDQUFDLFdBQVcsRUFBRTtZQUNwQyw0RUFBNEU7WUFDNUUsTUFBTSxHQUFHLE1BQU0sSUFBQSwyQkFBa0IsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZELElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtnQkFDcEIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsTUFBTTtRQUNSO1lBQ0UsTUFBTSxJQUFJLG9CQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxJQUFJLHVDQUF1QztnQkFDbkYsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0tBQ3JIO0lBQ0QsT0FBTyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBaUJRLHNDQUFhO0FBZnRCOzs7Ozs7R0FNRztBQUNILFNBQVMsNEJBQTRCLENBQUUsT0FBTztJQUM1QyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQ3JDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDbEU7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIn0=
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"}