@appium/images-plugin 2.0.10 → 2.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/build/lib/compare.d.ts +0 -4
- package/build/lib/compare.d.ts.map +1 -1
- package/build/lib/compare.js +12 -19
- package/build/lib/compare.js.map +1 -1
- package/build/lib/constants.d.ts +13 -0
- package/build/lib/constants.d.ts.map +1 -0
- package/build/lib/constants.js +59 -0
- package/build/lib/constants.js.map +1 -0
- package/build/lib/finder.d.ts +37 -48
- package/build/lib/finder.d.ts.map +1 -1
- package/build/lib/finder.js +167 -160
- package/build/lib/finder.js.map +1 -1
- package/build/lib/image-element.d.ts +60 -20
- package/build/lib/image-element.d.ts.map +1 -1
- package/build/lib/image-element.js +56 -34
- package/build/lib/image-element.js.map +1 -1
- package/build/lib/plugin.d.ts +3 -2
- package/build/lib/plugin.d.ts.map +1 -1
- package/build/lib/plugin.js +10 -12
- package/build/lib/plugin.js.map +1 -1
- package/lib/compare.js +6 -17
- package/lib/constants.js +70 -0
- package/lib/finder.js +186 -195
- package/lib/image-element.js +64 -31
- package/lib/plugin.js +10 -12
- package/package.json +4 -3
package/build/lib/finder.js
CHANGED
|
@@ -3,96 +3,61 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.DEFAULT_FIX_IMAGE_TEMPLATE_SCALE = exports.DEFAULT_SETTINGS = exports.MJSONWP_ELEMENT_KEY = exports.W3C_ELEMENT_KEY = void 0;
|
|
7
6
|
const lodash_1 = __importDefault(require("lodash"));
|
|
8
7
|
const lru_cache_1 = __importDefault(require("lru-cache"));
|
|
9
8
|
const driver_1 = require("appium/driver");
|
|
10
|
-
const support_1 = require("appium/support");
|
|
11
9
|
const image_element_1 = require("./image-element");
|
|
12
10
|
const compare_1 = require("./compare");
|
|
13
11
|
const logger_1 = __importDefault(require("./logger"));
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
const W3C_ELEMENT_KEY = support_1.util.W3C_WEB_ELEMENT_IDENTIFIER;
|
|
17
|
-
exports.W3C_ELEMENT_KEY = W3C_ELEMENT_KEY;
|
|
18
|
-
const DEFAULT_FIX_IMAGE_TEMPLATE_SCALE = 1;
|
|
19
|
-
exports.DEFAULT_FIX_IMAGE_TEMPLATE_SCALE = DEFAULT_FIX_IMAGE_TEMPLATE_SCALE;
|
|
12
|
+
const constants_1 = require("./constants");
|
|
13
|
+
const sharp_1 = __importDefault(require("sharp"));
|
|
20
14
|
// Used to compare ratio and screen width
|
|
21
15
|
// Pixel is basically under 1080 for example. 100K is probably enough fo a while.
|
|
22
16
|
const FLOAT_PRECISION = 100000;
|
|
23
17
|
const MAX_CACHE_ITEMS = 100;
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
// whether Appium should ensure that an image template sent in during image
|
|
38
|
-
// element find should have its size adjusted so the match algorithm will not
|
|
39
|
-
// complain
|
|
40
|
-
fixImageTemplateSize: false,
|
|
41
|
-
// whether Appium should ensure that an image template sent in during image
|
|
42
|
-
// element find should have its scale adjusted to display size so the match
|
|
43
|
-
// algorithm will not complain.
|
|
44
|
-
// e.g. iOS has `width=375, height=667` window rect, but its screenshot is
|
|
45
|
-
// `width=750 × height=1334` pixels. This setting help to adjust the scale
|
|
46
|
-
// if a user use `width=750 × height=1334` pixels's base template image.
|
|
47
|
-
fixImageTemplateScale: false,
|
|
48
|
-
// Users might have scaled template image to reduce their storage size.
|
|
49
|
-
// This setting allows users to scale a template image they send to Appium server
|
|
50
|
-
// so that the Appium server compares the actual scale users originally had.
|
|
51
|
-
// e.g. If a user has an image of 270 x 32 pixels which was originally 1080 x 126 pixels,
|
|
52
|
-
// the user can set {defaultImageTemplateScale: 4.0} to scale the small image
|
|
53
|
-
// to the original one so that Appium can compare it as the original one.
|
|
54
|
-
defaultImageTemplateScale: image_element_1.DEFAULT_TEMPLATE_IMAGE_SCALE,
|
|
55
|
-
// whether Appium should re-check that an image element can be matched
|
|
56
|
-
// against the current screenshot before clicking it
|
|
57
|
-
checkForImageElementStaleness: true,
|
|
58
|
-
// whether before clicking on an image element Appium should re-determine the
|
|
59
|
-
// position of the element on screen
|
|
60
|
-
autoUpdateImageElementPosition: false,
|
|
61
|
-
// which method to use for tapping by coordinate for image elements. the
|
|
62
|
-
// options are 'w3c' or 'mjsonwp'
|
|
63
|
-
imageElementTapStrategy: image_element_1.IMAGE_EL_TAP_STRATEGY_W3C,
|
|
64
|
-
// which method to use to save the matched image area in ImageElement class.
|
|
65
|
-
// It is used for debugging purpose.
|
|
66
|
-
getMatchedImageResult: false,
|
|
67
|
-
};
|
|
68
|
-
exports.DEFAULT_SETTINGS = DEFAULT_SETTINGS;
|
|
18
|
+
const MAX_CACHE_AGE_MS = 24 * 60 * 60 * 1000;
|
|
19
|
+
/**
|
|
20
|
+
* Checks if one rect fully contains another
|
|
21
|
+
*
|
|
22
|
+
* @param {import('@appium/types').Rect} templateRect The bounding rect
|
|
23
|
+
* @param {import('@appium/types').Rect} rect The rect to be checked for containment
|
|
24
|
+
* @returns {boolean} True if templateRect contains rect
|
|
25
|
+
*/
|
|
26
|
+
function containsRect(templateRect, rect) {
|
|
27
|
+
return templateRect.x <= rect.x && templateRect.y <= rect.y
|
|
28
|
+
&& rect.width <= templateRect.x + templateRect.width - rect.x
|
|
29
|
+
&& rect.height <= templateRect.y + templateRect.height - rect.y;
|
|
30
|
+
}
|
|
69
31
|
const NO_OCCURRENCES_PATTERN = /Cannot find any occurrences/;
|
|
70
32
|
const CONDITION_UNMET_PATTERN = /Condition unmet/;
|
|
71
33
|
class ImageElementFinder {
|
|
72
34
|
/**
|
|
73
|
-
*
|
|
74
|
-
* @param {ExternalDriver} driver
|
|
75
|
-
* @param {number} [maxSize]
|
|
35
|
+
* @param {number} max
|
|
76
36
|
*/
|
|
77
|
-
constructor(
|
|
78
|
-
this.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
sizeCalculation: (el) => el.template.length,
|
|
37
|
+
constructor(max = MAX_CACHE_ITEMS) {
|
|
38
|
+
this._imgElCache = new lru_cache_1.default({
|
|
39
|
+
ttl: MAX_CACHE_AGE_MS,
|
|
40
|
+
updateAgeOnGet: true,
|
|
41
|
+
max,
|
|
83
42
|
});
|
|
84
43
|
}
|
|
85
|
-
setDriver(driver) {
|
|
86
|
-
this.driver = driver;
|
|
87
|
-
}
|
|
88
44
|
/**
|
|
89
45
|
* @param {ImageElement} imgEl
|
|
90
46
|
* @returns {Element}
|
|
91
47
|
*/
|
|
92
48
|
registerImageElement(imgEl) {
|
|
93
|
-
this.
|
|
94
|
-
|
|
95
|
-
|
|
49
|
+
this._imgElCache.set(imgEl.id, imgEl);
|
|
50
|
+
return imgEl.asElement();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* @param {string} imgElId
|
|
54
|
+
* @returns {ImageElement|undefined}
|
|
55
|
+
*/
|
|
56
|
+
getImageElement(imgElId) {
|
|
57
|
+
return this._imgElCache.get(imgElId);
|
|
58
|
+
}
|
|
59
|
+
clearImageElements() {
|
|
60
|
+
this._imgElCache.clear();
|
|
96
61
|
}
|
|
97
62
|
/**
|
|
98
63
|
* @typedef FindByImageOptions
|
|
@@ -102,41 +67,55 @@ class ImageElementFinder {
|
|
|
102
67
|
* multiple
|
|
103
68
|
* @property {boolean} [ignoreDefaultImageTemplateScale=false] - Whether we
|
|
104
69
|
* ignore defaultImageTemplateScale. It can be used when you would like to
|
|
105
|
-
* scale
|
|
70
|
+
* scale template with defaultImageTemplateScale setting.
|
|
71
|
+
* @property {import('@appium/types').Rect?} containerRect - The bounding
|
|
72
|
+
* rectangle to limit the search in
|
|
106
73
|
*/
|
|
107
74
|
/**
|
|
108
75
|
* Find a screen rect represented by an ImageElement corresponding to an image
|
|
109
76
|
* template sent in by the client
|
|
110
77
|
*
|
|
111
|
-
* @param {
|
|
78
|
+
* @param {Buffer} template - image used as a template to be
|
|
112
79
|
* matched in the screenshot
|
|
80
|
+
* @param {ExternalDriver} driver
|
|
113
81
|
* @param {FindByImageOptions} opts - additional options
|
|
114
82
|
*
|
|
115
83
|
* @returns {Promise<Element|Element[]|ImageElement>} - WebDriver element with a special id prefix
|
|
116
84
|
*/
|
|
117
|
-
async findByImage(
|
|
118
|
-
|
|
119
|
-
throw new Error(`Can't find without a driver!`);
|
|
120
|
-
}
|
|
121
|
-
const settings = { ...DEFAULT_SETTINGS, ...this.driver.settings.getSettings() };
|
|
85
|
+
async findByImage(template, driver, { shouldCheckStaleness = false, multiple = false, ignoreDefaultImageTemplateScale = false, containerRect = null }) {
|
|
86
|
+
const settings = { ...constants_1.DEFAULT_SETTINGS, ...driver.settings.getSettings() };
|
|
122
87
|
const { imageMatchThreshold: threshold, imageMatchMethod, fixImageTemplateSize, fixImageTemplateScale, defaultImageTemplateScale, getMatchedImageResult: visualize, } = settings;
|
|
123
88
|
logger_1.default.info(`Finding image element with match threshold ${threshold}`);
|
|
124
|
-
if (!
|
|
125
|
-
throw new Error("This driver does not support the required '
|
|
89
|
+
if (!driver.getWindowRect && !driver.getWindowSize) {
|
|
90
|
+
throw new Error("This driver does not support the required 'getWindowRect' command");
|
|
91
|
+
}
|
|
92
|
+
let screenSize;
|
|
93
|
+
if (driver.getWindowRect) {
|
|
94
|
+
const screenRect = await driver.getWindowRect();
|
|
95
|
+
screenSize = {
|
|
96
|
+
width: screenRect.width,
|
|
97
|
+
height: screenRect.height,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// TODO: Drop the deprecated endpoint
|
|
102
|
+
screenSize = await driver.getWindowSize();
|
|
126
103
|
}
|
|
127
|
-
const { width: screenWidth, height: screenHeight } = await this.driver.getWindowSize();
|
|
128
104
|
// someone might have sent in a template that's larger than the screen
|
|
129
105
|
// dimensions. If so let's check and cut it down to size since the algorithm
|
|
130
106
|
// will not work unless we do. But because it requires some potentially
|
|
131
107
|
// expensive commands, only do this if the user has requested it in settings.
|
|
132
108
|
if (fixImageTemplateSize) {
|
|
133
|
-
|
|
109
|
+
template = await this.ensureTemplateSize(template, {
|
|
110
|
+
width: containerRect ? containerRect.width : screenSize.width,
|
|
111
|
+
height: containerRect ? containerRect.height : screenSize.height,
|
|
112
|
+
});
|
|
134
113
|
}
|
|
135
114
|
const results = [];
|
|
136
115
|
const condition = async () => {
|
|
137
116
|
try {
|
|
138
|
-
const {
|
|
139
|
-
|
|
117
|
+
const { screenshot, scale } = await this.getScreenshotForImageFind(driver, screenSize);
|
|
118
|
+
template = await this.fixImageTemplateScale(template, {
|
|
140
119
|
defaultImageTemplateScale,
|
|
141
120
|
ignoreDefaultImageTemplateScale,
|
|
142
121
|
fixImageTemplateScale,
|
|
@@ -150,13 +129,17 @@ class ImageElementFinder {
|
|
|
150
129
|
if (imageMatchMethod) {
|
|
151
130
|
comparisonOpts.method = imageMatchMethod;
|
|
152
131
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
132
|
+
const pushIfOk = (el) => {
|
|
133
|
+
if (containerRect && !containsRect(containerRect, el.rect)) {
|
|
134
|
+
logger_1.default.debug(`The matched element rectangle ${JSON.stringify(el.rect)} is not located ` +
|
|
135
|
+
`inside of the bounding rectangle ${JSON.stringify(containerRect)}, thus rejected`);
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
results.push(el);
|
|
139
|
+
return true;
|
|
140
|
+
};
|
|
141
|
+
const elOrEls = await (0, compare_1.compareImages)(constants_1.MATCH_TEMPLATE_MODE, screenshot, template, comparisonOpts);
|
|
142
|
+
return lodash_1.default.some((lodash_1.default.isArray(elOrEls) ? elOrEls : [elOrEls]).map(pushIfOk));
|
|
160
143
|
}
|
|
161
144
|
catch (err) {
|
|
162
145
|
// if compareImages fails, we'll get a specific error, but we should
|
|
@@ -170,7 +153,7 @@ class ImageElementFinder {
|
|
|
170
153
|
}
|
|
171
154
|
};
|
|
172
155
|
try {
|
|
173
|
-
await
|
|
156
|
+
await driver.implicitWaitForCondition(condition);
|
|
174
157
|
}
|
|
175
158
|
catch (err) {
|
|
176
159
|
// this `implicitWaitForCondition` method will throw a 'Condition unmet'
|
|
@@ -191,7 +174,14 @@ class ImageElementFinder {
|
|
|
191
174
|
}
|
|
192
175
|
const elements = results.map(({ rect, score, visualization }) => {
|
|
193
176
|
logger_1.default.info(`Image template matched: ${JSON.stringify(rect)}`);
|
|
194
|
-
return new image_element_1.ImageElement(
|
|
177
|
+
return new image_element_1.ImageElement({
|
|
178
|
+
template,
|
|
179
|
+
rect,
|
|
180
|
+
score,
|
|
181
|
+
match: visualization ? Buffer.from(visualization, 'base64') : null,
|
|
182
|
+
finder: this,
|
|
183
|
+
containerRect,
|
|
184
|
+
});
|
|
195
185
|
});
|
|
196
186
|
// if we're just checking staleness, return straightaway so we don't add
|
|
197
187
|
// a new element to the cache. shouldCheckStaleness does not support multiple
|
|
@@ -205,68 +195,72 @@ class ImageElementFinder {
|
|
|
205
195
|
/**
|
|
206
196
|
* Ensure that the image template sent in for a find is of a suitable size
|
|
207
197
|
*
|
|
208
|
-
* @param {
|
|
209
|
-
* @param {
|
|
210
|
-
* @param {number} screenHeight - height of screen
|
|
198
|
+
* @param {Buffer} template - template image
|
|
199
|
+
* @param {import('@appium/types').Size} maxSize - size of the bounding rectangle
|
|
211
200
|
*
|
|
212
|
-
* @returns {Promise<
|
|
201
|
+
* @returns {Promise<Buffer>} image, potentially resized
|
|
213
202
|
*/
|
|
214
|
-
async ensureTemplateSize(
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
logger_1.default.info(`Template image is ${tplWidth}x${tplHeight}.
|
|
203
|
+
async ensureTemplateSize(template, maxSize) {
|
|
204
|
+
const imgObj = (0, sharp_1.default)(template);
|
|
205
|
+
const { width: tplWidth, height: tplHeight } = await imgObj.metadata();
|
|
206
|
+
logger_1.default.info(`Template image is ${tplWidth}x${tplHeight}. Bounding rectangle size is ${maxSize.width}x${maxSize.height}`);
|
|
218
207
|
// if the template fits inside the screen dimensions, we're good
|
|
219
|
-
if (tplWidth <=
|
|
220
|
-
return
|
|
208
|
+
if (tplWidth <= maxSize.width && tplHeight <= maxSize.height) {
|
|
209
|
+
return template;
|
|
221
210
|
}
|
|
222
211
|
logger_1.default.info(`Scaling template image from ${tplWidth}x${tplHeight} to match ` +
|
|
223
|
-
`
|
|
224
|
-
// otherwise, scale it to fit inside the
|
|
225
|
-
|
|
226
|
-
return
|
|
212
|
+
`the bounding rectangle at ${maxSize.width}x${maxSize.height}`);
|
|
213
|
+
// otherwise, scale it to fit inside the bounding rectangle dimensions:
|
|
214
|
+
// https://sharp.pixelplumbing.com/api-resize
|
|
215
|
+
return await imgObj.resize({
|
|
216
|
+
width: parseInt(maxSize.width, 10),
|
|
217
|
+
height: parseInt(maxSize.height, 10),
|
|
218
|
+
fit: 'inside',
|
|
219
|
+
})
|
|
220
|
+
.toBuffer();
|
|
227
221
|
}
|
|
228
222
|
/**
|
|
229
223
|
* Get the screenshot image that will be used for find by element, potentially
|
|
230
224
|
* altering it in various ways based on user-requested settings
|
|
231
225
|
*
|
|
232
|
-
* @param {
|
|
233
|
-
* @param {
|
|
226
|
+
* @param {ExternalDriver} driver
|
|
227
|
+
* @param {import('@appium/types').Size} screenSize - The original size of the screen
|
|
234
228
|
*
|
|
235
|
-
* @returns {Promise<Screenshot & {scale?: ScreenshotScale}>}
|
|
229
|
+
* @returns {Promise<Screenshot & {scale?: ScreenshotScale}>} PNG screenshot and ScreenshotScale
|
|
236
230
|
*/
|
|
237
|
-
async getScreenshotForImageFind(
|
|
238
|
-
if (!
|
|
231
|
+
async getScreenshotForImageFind(driver, screenSize) {
|
|
232
|
+
if (!driver.getScreenshot) {
|
|
239
233
|
throw new Error("This driver does not support the required 'getScreenshot' command");
|
|
240
234
|
}
|
|
241
|
-
const settings = Object.assign({}, DEFAULT_SETTINGS,
|
|
235
|
+
const settings = Object.assign({}, constants_1.DEFAULT_SETTINGS, driver.settings.getSettings());
|
|
242
236
|
const { fixImageFindScreenshotDims } = settings;
|
|
243
|
-
|
|
237
|
+
const screenshot = Buffer.from(await driver.getScreenshot(), 'base64');
|
|
244
238
|
// if the user has requested not to correct for aspect or size differences
|
|
245
239
|
// between the screenshot and the screen, just return the screenshot now
|
|
246
240
|
if (!fixImageFindScreenshotDims) {
|
|
247
241
|
logger_1.default.info(`Not verifying screenshot dimensions match screen`);
|
|
248
|
-
return {
|
|
242
|
+
return { screenshot };
|
|
249
243
|
}
|
|
250
|
-
if (
|
|
251
|
-
logger_1.default.warn(`The retrieved screen size ${
|
|
244
|
+
if (screenSize.width < 1 || screenSize.height < 1) {
|
|
245
|
+
logger_1.default.warn(`The retrieved screen size ${screenSize.width}x${screenSize.height} does ` +
|
|
252
246
|
`not seem to be valid. No changes will be applied to the screenshot`);
|
|
253
|
-
return {
|
|
247
|
+
return { screenshot };
|
|
254
248
|
}
|
|
255
249
|
// otherwise, do some verification on the screenshot to make sure it matches
|
|
256
250
|
// the screen size and aspect ratio
|
|
257
251
|
logger_1.default.info('Verifying screenshot size and aspect ratio');
|
|
258
|
-
let imgObj =
|
|
259
|
-
let { width: shotWidth, height: shotHeight } = imgObj.
|
|
252
|
+
let imgObj = (0, sharp_1.default)(screenshot);
|
|
253
|
+
let { width: shotWidth, height: shotHeight } = await imgObj.metadata();
|
|
260
254
|
if (shotWidth < 1 || shotHeight < 1) {
|
|
261
255
|
logger_1.default.warn(`The retrieved screenshot size ${shotWidth}x${shotHeight} does ` +
|
|
262
256
|
`not seem to be valid. No changes will be applied to the screenshot`);
|
|
263
|
-
return {
|
|
257
|
+
return { screenshot };
|
|
264
258
|
}
|
|
265
|
-
if (
|
|
259
|
+
if (screenSize.width === shotWidth && screenSize.height === shotHeight) {
|
|
266
260
|
// the height and width of the screenshot and the device screen match, which
|
|
267
261
|
// means we should be safe when doing template matches
|
|
268
262
|
logger_1.default.info('Screenshot size matched screen size');
|
|
269
|
-
return {
|
|
263
|
+
return { screenshot };
|
|
270
264
|
}
|
|
271
265
|
// otherwise, if they don't match, it could spell problems for the accuracy
|
|
272
266
|
// of coordinates returned by the image match algorithm, since we match based
|
|
@@ -274,16 +268,16 @@ class ImageElementFinder {
|
|
|
274
268
|
// are two potential types of mismatch: aspect ratio mismatch and scale
|
|
275
269
|
// mismatch. We need to detect and fix both
|
|
276
270
|
const scale = { xScale: 1.0, yScale: 1.0 };
|
|
277
|
-
const screenAR =
|
|
271
|
+
const screenAR = screenSize.width / screenSize.height;
|
|
278
272
|
const shotAR = shotWidth / shotHeight;
|
|
279
273
|
if (Math.round(screenAR * FLOAT_PRECISION) === Math.round(shotAR * FLOAT_PRECISION)) {
|
|
280
274
|
logger_1.default.info(`Screenshot aspect ratio '${shotAR}' (${shotWidth}x${shotHeight}) matched ` +
|
|
281
|
-
`screen aspect ratio '${screenAR}' (${
|
|
275
|
+
`screen aspect ratio '${screenAR}' (${screenSize.width}x${screenSize.height})`);
|
|
282
276
|
}
|
|
283
277
|
else {
|
|
284
278
|
logger_1.default.warn(`When trying to find an element, determined that the screen ` +
|
|
285
279
|
`aspect ratio and screenshot aspect ratio are different. Screen ` +
|
|
286
|
-
`is ${
|
|
280
|
+
`is ${screenSize.width}x${screenSize.height} whereas screenshot is ` +
|
|
287
281
|
`${shotWidth}x${shotHeight}.`);
|
|
288
282
|
// In the case where the x-scale and y-scale are different, we need to decide
|
|
289
283
|
// which one to respect, otherwise the screenshot and template will end up
|
|
@@ -291,43 +285,54 @@ class ImageElementFinder {
|
|
|
291
285
|
// this.getScreenshot(shotWidth, shotHeight) is 540x397,
|
|
292
286
|
// this.getDeviceSize(screenWidth, screenHeight) is 1080x1920.
|
|
293
287
|
// The ratio would then be {xScale: 0.5, yScale: 0.2}.
|
|
294
|
-
// In this case, we must
|
|
288
|
+
// In this case, we must use `yScale: 0.2` as scaleFactor, because
|
|
295
289
|
// if we select the xScale, the height will be bigger than real screenshot size
|
|
296
290
|
// which is used to image comparison by OpenCV as a base image.
|
|
297
291
|
// All of this is primarily useful when the screenshot is a horizontal slice taken out of the
|
|
298
292
|
// screen (for example not including top/bottom nav bars)
|
|
299
|
-
const xScale = (1.0 * shotWidth) /
|
|
300
|
-
const yScale = (1.0 * shotHeight) /
|
|
301
|
-
const scaleFactor = xScale
|
|
302
|
-
|
|
293
|
+
const xScale = (1.0 * shotWidth) / screenSize.width;
|
|
294
|
+
const yScale = (1.0 * shotHeight) / screenSize.height;
|
|
295
|
+
const scaleFactor = Math.min(xScale, yScale);
|
|
296
|
+
const [newWidth, newHeight] = [shotWidth * scaleFactor, shotHeight * scaleFactor]
|
|
297
|
+
.map((x) => parseInt(x, 10));
|
|
298
|
+
logger_1.default.warn(`Resizing screenshot to ${newWidth}x${newHeight} to match ` +
|
|
303
299
|
`screen aspect ratio so that image element coordinates have a ` +
|
|
304
300
|
`greater chance of being correct.`);
|
|
305
|
-
imgObj = imgObj.resize(
|
|
301
|
+
imgObj = imgObj.resize({
|
|
302
|
+
width: newWidth,
|
|
303
|
+
height: newHeight,
|
|
304
|
+
fit: 'fill',
|
|
305
|
+
});
|
|
306
306
|
scale.xScale *= scaleFactor;
|
|
307
307
|
scale.yScale *= scaleFactor;
|
|
308
|
-
shotWidth =
|
|
309
|
-
shotHeight = imgObj.bitmap.height;
|
|
308
|
+
[shotWidth, shotHeight] = [newWidth, newHeight];
|
|
310
309
|
}
|
|
311
310
|
// Resize based on the screen dimensions only if both width and height are mismatched
|
|
312
311
|
// since except for that, it might be a situation which is different window rect and
|
|
313
312
|
// screenshot size like `@driver.window_rect #=>x=0, y=0, width=1080, height=1794` and
|
|
314
313
|
// `"deviceScreenSize"=>"1080x1920"`
|
|
315
|
-
if (
|
|
314
|
+
if (screenSize.width !== shotWidth && screenSize.height !== shotHeight) {
|
|
316
315
|
logger_1.default.info(`Scaling screenshot from ${shotWidth}x${shotHeight} to match ` +
|
|
317
|
-
`screen at ${
|
|
318
|
-
imgObj = imgObj.resize(
|
|
319
|
-
|
|
320
|
-
|
|
316
|
+
`screen at ${screenSize.width}x${screenSize.height}`);
|
|
317
|
+
imgObj = imgObj.resize({
|
|
318
|
+
width: parseInt(screenSize.width, 10),
|
|
319
|
+
height: parseInt(screenSize.height, 10),
|
|
320
|
+
fit: 'fill',
|
|
321
|
+
});
|
|
322
|
+
scale.xScale *= (1.0 * screenSize.width) / shotWidth;
|
|
323
|
+
scale.yScale *= (1.0 * screenSize.height) / shotHeight;
|
|
321
324
|
}
|
|
322
|
-
|
|
323
|
-
|
|
325
|
+
return {
|
|
326
|
+
screenshot: await imgObj.toBuffer(),
|
|
327
|
+
scale,
|
|
328
|
+
};
|
|
324
329
|
}
|
|
325
330
|
/**
|
|
326
331
|
* @typedef ImageTemplateSettings
|
|
327
332
|
* @property {boolean} fixImageTemplateScale - fixImageTemplateScale in device-settings
|
|
328
333
|
* @property {number} defaultImageTemplateScale - defaultImageTemplateScale in device-settings
|
|
329
334
|
* @property {boolean} ignoreDefaultImageTemplateScale - Ignore defaultImageTemplateScale if it has true.
|
|
330
|
-
* If
|
|
335
|
+
* If the template has been scaled to defaultImageTemplateScale or should ignore the scale,
|
|
331
336
|
* this parameter should be true. e.g. click in image-element module
|
|
332
337
|
* @property {number} xScale - Scale ratio for width
|
|
333
338
|
* @property {number} yScale - Scale ratio for height
|
|
@@ -337,27 +342,26 @@ class ImageElementFinder {
|
|
|
337
342
|
* Get a image that will be used for template maching.
|
|
338
343
|
* Returns scaled image if scale ratio is provided.
|
|
339
344
|
*
|
|
340
|
-
*
|
|
341
|
-
* @param {string} b64Template - base64-encoded image used as a template to be
|
|
345
|
+
* @param {Buffer} template - image used as a template to be
|
|
342
346
|
* matched in the screenshot
|
|
343
347
|
* @param {ImageTemplateSettings} opts - Image template scale related options
|
|
344
348
|
*
|
|
345
|
-
* @returns {Promise<
|
|
349
|
+
* @returns {Promise<Buffer>} scaled template screenshot
|
|
346
350
|
*/
|
|
347
|
-
async fixImageTemplateScale(
|
|
351
|
+
async fixImageTemplateScale(template, opts) {
|
|
348
352
|
if (!opts) {
|
|
349
|
-
return
|
|
353
|
+
return template;
|
|
350
354
|
}
|
|
351
|
-
let { fixImageTemplateScale = false, defaultImageTemplateScale =
|
|
355
|
+
let { fixImageTemplateScale: fixTplScale = false, defaultImageTemplateScale = constants_1.DEFAULT_TEMPLATE_IMAGE_SCALE, ignoreDefaultImageTemplateScale = false, xScale = constants_1.DEFAULT_FIX_IMAGE_TEMPLATE_SCALE, yScale = constants_1.DEFAULT_FIX_IMAGE_TEMPLATE_SCALE, } = opts;
|
|
352
356
|
if (ignoreDefaultImageTemplateScale) {
|
|
353
|
-
defaultImageTemplateScale =
|
|
357
|
+
defaultImageTemplateScale = constants_1.DEFAULT_TEMPLATE_IMAGE_SCALE;
|
|
354
358
|
}
|
|
355
359
|
// Default
|
|
356
|
-
if (defaultImageTemplateScale ===
|
|
357
|
-
return
|
|
360
|
+
if (defaultImageTemplateScale === constants_1.DEFAULT_TEMPLATE_IMAGE_SCALE && !fixTplScale) {
|
|
361
|
+
return template;
|
|
358
362
|
}
|
|
359
363
|
// Calculate xScale and yScale Appium should scale
|
|
360
|
-
if (
|
|
364
|
+
if (fixTplScale) {
|
|
361
365
|
xScale *= defaultImageTemplateScale;
|
|
362
366
|
yScale *= defaultImageTemplateScale;
|
|
363
367
|
}
|
|
@@ -366,24 +370,27 @@ class ImageElementFinder {
|
|
|
366
370
|
}
|
|
367
371
|
// xScale and yScale can be NaN if defaultImageTemplateScale is string, for example
|
|
368
372
|
if (!parseFloat(String(xScale)) || !parseFloat(String(yScale))) {
|
|
369
|
-
return
|
|
373
|
+
return template;
|
|
370
374
|
}
|
|
371
375
|
// Return if the scale is default, 1, value
|
|
372
376
|
if (Math.round(xScale * FLOAT_PRECISION) ===
|
|
373
|
-
Math.round(DEFAULT_FIX_IMAGE_TEMPLATE_SCALE * FLOAT_PRECISION) &&
|
|
377
|
+
Math.round(constants_1.DEFAULT_FIX_IMAGE_TEMPLATE_SCALE * FLOAT_PRECISION) &&
|
|
374
378
|
Math.round(Number(yScale * FLOAT_PRECISION ===
|
|
375
|
-
Math.round(DEFAULT_FIX_IMAGE_TEMPLATE_SCALE * FLOAT_PRECISION)))) {
|
|
376
|
-
return
|
|
379
|
+
Math.round(constants_1.DEFAULT_FIX_IMAGE_TEMPLATE_SCALE * FLOAT_PRECISION)))) {
|
|
380
|
+
return template;
|
|
377
381
|
}
|
|
378
|
-
let
|
|
379
|
-
|
|
382
|
+
let imgObj = (0, sharp_1.default)(template);
|
|
383
|
+
const { width: baseTempWidth, height: baseTempHeigh } = await imgObj.metadata();
|
|
380
384
|
const scaledWidth = baseTempWidth * xScale;
|
|
381
385
|
const scaledHeight = baseTempHeigh * yScale;
|
|
382
|
-
logger_1.default.info(`Scaling template image from ${baseTempWidth}x${baseTempHeigh}`
|
|
383
|
-
` to ${scaledWidth}x${scaledHeight}`);
|
|
386
|
+
logger_1.default.info(`Scaling template image from ${baseTempWidth}x${baseTempHeigh} to ${scaledWidth}x${scaledHeight}`);
|
|
384
387
|
logger_1.default.info(`The ratio is ${xScale} and ${yScale}`);
|
|
385
|
-
|
|
386
|
-
|
|
388
|
+
imgObj = imgObj.resize({
|
|
389
|
+
width: parseInt(scaledWidth, 10),
|
|
390
|
+
height: parseInt(scaledHeight, 10),
|
|
391
|
+
fit: 'fill',
|
|
392
|
+
});
|
|
393
|
+
return await imgObj.toBuffer();
|
|
387
394
|
}
|
|
388
395
|
}
|
|
389
396
|
exports.default = ImageElementFinder;
|
|
@@ -393,7 +400,7 @@ exports.default = ImageElementFinder;
|
|
|
393
400
|
*/
|
|
394
401
|
/**
|
|
395
402
|
* @typedef Screenshot
|
|
396
|
-
* @property {
|
|
403
|
+
* @property {Buffer} screenshot - screenshot image as PNG
|
|
397
404
|
*/
|
|
398
405
|
/**
|
|
399
406
|
* @typedef ScreenshotScale
|
package/build/lib/finder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finder.js","sourceRoot":"","sources":["../../lib/finder.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"finder.js","sourceRoot":"","sources":["../../lib/finder.js"],"names":[],"mappings":"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"}
|