@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 +2 -2
- package/README.md +2 -0
- package/build/lib/compare.d.ts +28 -0
- package/build/lib/compare.d.ts.map +1 -0
- package/build/lib/compare.js +59 -70
- package/build/lib/finder.d.ts +163 -0
- package/build/lib/finder.d.ts.map +1 -0
- package/build/lib/finder.js +323 -358
- 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 +193 -224
- 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 -67
- package/build/tsconfig.tsbuildinfo +1 -1
- package/index.js +1 -3
- package/lib/compare.js +26 -11
- 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 +34 -24
- package/build/index.js +0 -27
- package/build/test/e2e/plugin-e2e-specs.js +0 -62
- 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/finder-specs.js +0 -334
- package/build/test/unit/image-element-specs.js +0 -275
- package/build/test/unit/plugin-specs.js +0 -149
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
-
};
|
|
24
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
const lodash_1 = __importDefault(require("lodash"));
|
|
26
|
-
const support_1 = require("@appium/support");
|
|
27
|
-
const base_driver_1 = __importDefault(require("@appium/base-driver"));
|
|
28
|
-
const index_1 = __importStar(require("../../index"));
|
|
29
|
-
const finder_1 = __importDefault(require("../../lib/finder"));
|
|
30
|
-
const image_element_1 = __importDefault(require("../../lib/image-element"));
|
|
31
|
-
const sinon_1 = __importDefault(require("sinon"));
|
|
32
|
-
const fixtures_1 = require("../fixtures");
|
|
33
|
-
const chai_1 = __importDefault(require("chai"));
|
|
34
|
-
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
|
|
35
|
-
const compareModule = require('../../lib/compare');
|
|
36
|
-
chai_1.default.use(chai_as_promised_1.default);
|
|
37
|
-
const should = chai_1.default.should();
|
|
38
|
-
const plugin = new index_1.default();
|
|
39
|
-
class PluginDriver extends base_driver_1.default {
|
|
40
|
-
async getWindowSize() { }
|
|
41
|
-
async getScreenshot() { }
|
|
42
|
-
findElement(strategy, selector) {
|
|
43
|
-
return plugin.findElement(lodash_1.default.noop, this, strategy, selector);
|
|
44
|
-
}
|
|
45
|
-
findElements(strategy, selector) {
|
|
46
|
-
return plugin.findElements(lodash_1.default.noop, this, strategy, selector);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
describe('finding elements by image', function () {
|
|
50
|
-
describe('findElement', function () {
|
|
51
|
-
it('should use a different special method to find element by image', async function () {
|
|
52
|
-
const d = new PluginDriver();
|
|
53
|
-
sinon_1.default.stub(plugin.finder, 'findByImage').returns(true);
|
|
54
|
-
sinon_1.default.stub(d, 'findElOrElsWithProcessing').returns(false);
|
|
55
|
-
await d.findElement(index_1.IMAGE_STRATEGY, 'foo').should.eventually.be.true;
|
|
56
|
-
await d.findElements(index_1.IMAGE_STRATEGY, 'foo').should.eventually.be.true;
|
|
57
|
-
});
|
|
58
|
-
it('should not be able to find image element from any other element', async function () {
|
|
59
|
-
const d = new PluginDriver();
|
|
60
|
-
await d.findElementFromElement(index_1.IMAGE_STRATEGY, 'foo', 'elId')
|
|
61
|
-
.should.eventually.be.rejectedWith(/Locator Strategy.+is not supported/);
|
|
62
|
-
await d.findElementsFromElement(index_1.IMAGE_STRATEGY, 'foo', 'elId')
|
|
63
|
-
.should.eventually.be.rejectedWith(/Locator Strategy.+is not supported/);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
describe('findByImage', function () {
|
|
67
|
-
const rect = { x: 10, y: 20, width: 30, height: 40 };
|
|
68
|
-
const score = 0.9;
|
|
69
|
-
const size = { width: 100, height: 200 };
|
|
70
|
-
const screenshot = 'iVBORfoo';
|
|
71
|
-
const template = 'iVBORbar';
|
|
72
|
-
let compareStub;
|
|
73
|
-
let d = new PluginDriver();
|
|
74
|
-
let f = new finder_1.default(d);
|
|
75
|
-
function basicStub(driver, finder) {
|
|
76
|
-
const sizeStub = sinon_1.default.stub(driver, 'getWindowSize').returns(size);
|
|
77
|
-
const screenStub = sinon_1.default.stub(finder, 'getScreenshotForImageFind').returns(screenshot);
|
|
78
|
-
return { sizeStub, screenStub };
|
|
79
|
-
}
|
|
80
|
-
function basicImgElVerify(imgElProto, finder) {
|
|
81
|
-
const imgElId = imgElProto.ELEMENT;
|
|
82
|
-
finder.imgElCache.has(imgElId).should.be.true;
|
|
83
|
-
const imgEl = finder.imgElCache.get(imgElId);
|
|
84
|
-
(imgEl instanceof image_element_1.default).should.be.true;
|
|
85
|
-
imgEl.rect.should.eql(rect);
|
|
86
|
-
imgEl.score.should.eql(score);
|
|
87
|
-
return imgEl;
|
|
88
|
-
}
|
|
89
|
-
beforeEach(function () {
|
|
90
|
-
compareStub = sinon_1.default.stub(compareModule, 'compareImages').returns({ rect, score });
|
|
91
|
-
d = new PluginDriver();
|
|
92
|
-
f = new finder_1.default(d);
|
|
93
|
-
basicStub(d, f);
|
|
94
|
-
});
|
|
95
|
-
afterEach(function () {
|
|
96
|
-
compareStub.restore();
|
|
97
|
-
});
|
|
98
|
-
it('should find an image element happypath', async function () {
|
|
99
|
-
const imgElProto = await f.findByImage(template, { multiple: false });
|
|
100
|
-
basicImgElVerify(imgElProto, f);
|
|
101
|
-
});
|
|
102
|
-
it('should find image elements happypath', async function () {
|
|
103
|
-
compareStub.restore();
|
|
104
|
-
compareStub = sinon_1.default.stub(compareModule, 'compareImages').returns([{ rect, score }]);
|
|
105
|
-
const els = await f.findByImage(template, { multiple: true });
|
|
106
|
-
els.should.have.length(1);
|
|
107
|
-
basicImgElVerify(els[0], f);
|
|
108
|
-
});
|
|
109
|
-
it('should fail if driver does not support getWindowSize', async function () {
|
|
110
|
-
d.getWindowSize = null;
|
|
111
|
-
await f.findByImage(template, { multiple: false })
|
|
112
|
-
.should.eventually.be.rejectedWith(/driver does not support/);
|
|
113
|
-
});
|
|
114
|
-
it('should fix template size if requested', async function () {
|
|
115
|
-
const newTemplate = 'iVBORbaz';
|
|
116
|
-
await d.settings.update({ fixImageTemplateSize: true });
|
|
117
|
-
sinon_1.default.stub(f, 'ensureTemplateSize').returns(newTemplate);
|
|
118
|
-
const imgElProto = await f.findByImage(template, { multiple: false });
|
|
119
|
-
const imgEl = basicImgElVerify(imgElProto, f);
|
|
120
|
-
imgEl.template.should.eql(newTemplate);
|
|
121
|
-
lodash_1.default.last(compareStub.args)[2].should.eql(newTemplate);
|
|
122
|
-
});
|
|
123
|
-
it('should fix template size scale if requested', async function () {
|
|
124
|
-
const newTemplate = 'iVBORbaz';
|
|
125
|
-
await d.settings.update({ fixImageTemplateScale: true });
|
|
126
|
-
sinon_1.default.stub(f, 'fixImageTemplateScale').returns(newTemplate);
|
|
127
|
-
const imgElProto = await f.findByImage(template, { multiple: false });
|
|
128
|
-
const imgEl = basicImgElVerify(imgElProto, f);
|
|
129
|
-
imgEl.template.should.eql(newTemplate);
|
|
130
|
-
lodash_1.default.last(compareStub.args)[2].should.eql(newTemplate);
|
|
131
|
-
});
|
|
132
|
-
it('should not fix template size scale if it is not requested', async function () {
|
|
133
|
-
const newTemplate = 'iVBORbaz';
|
|
134
|
-
await d.settings.update({});
|
|
135
|
-
sinon_1.default.stub(f, 'fixImageTemplateScale').returns(newTemplate);
|
|
136
|
-
f.fixImageTemplateScale.callCount.should.eql(0);
|
|
137
|
-
});
|
|
138
|
-
it('should throw an error if template match fails', async function () {
|
|
139
|
-
compareStub.throws(new Error('Cannot find any occurrences'));
|
|
140
|
-
await f.findByImage(template, { multiple: false })
|
|
141
|
-
.should.eventually.be.rejectedWith(/element could not be located/);
|
|
142
|
-
});
|
|
143
|
-
it('should return empty array for multiple elements if template match fails', async function () {
|
|
144
|
-
compareStub.throws(new Error('Cannot find any occurrences'));
|
|
145
|
-
await f.findByImage(template, { multiple: true }).should.eventually.eql([]);
|
|
146
|
-
});
|
|
147
|
-
it('should respect implicit wait', async function () {
|
|
148
|
-
d.setImplicitWait(10);
|
|
149
|
-
compareStub.resetHistory();
|
|
150
|
-
compareStub.onCall(0).throws(new Error('Cannot find any occurrences'));
|
|
151
|
-
compareStub.returns({ rect, score });
|
|
152
|
-
const imgElProto = await f.findByImage(template, { multiple: false });
|
|
153
|
-
basicImgElVerify(imgElProto, f);
|
|
154
|
-
compareStub.callCount.should.eql(2);
|
|
155
|
-
});
|
|
156
|
-
it('should not add element to cache and return it directly when checking staleness', async function () {
|
|
157
|
-
const imgEl = await f.findByImage(template, { multiple: false, shouldCheckStaleness: true });
|
|
158
|
-
(imgEl instanceof image_element_1.default).should.be.true;
|
|
159
|
-
f.imgElCache.has(imgEl.id).should.be.false;
|
|
160
|
-
imgEl.rect.should.eql(rect);
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
describe('fixImageTemplateScale', function () {
|
|
164
|
-
const d = new PluginDriver();
|
|
165
|
-
const f = new finder_1.default(d);
|
|
166
|
-
const basicTemplate = 'iVBORbaz';
|
|
167
|
-
it('should not fix template size scale if no scale value', async function () {
|
|
168
|
-
await f.fixImageTemplateScale(basicTemplate, { fixImageTemplateScale: true })
|
|
169
|
-
.should.eventually.eql(basicTemplate);
|
|
170
|
-
});
|
|
171
|
-
it('should not fix template size scale if it is null', async function () {
|
|
172
|
-
await f.fixImageTemplateScale(basicTemplate, null)
|
|
173
|
-
.should.eventually.eql(basicTemplate);
|
|
174
|
-
});
|
|
175
|
-
it('should not fix template size scale if it is not number', async function () {
|
|
176
|
-
await f.fixImageTemplateScale(basicTemplate, 'wrong-scale')
|
|
177
|
-
.should.eventually.eql(basicTemplate);
|
|
178
|
-
});
|
|
179
|
-
it('should fix template size scale', async function () {
|
|
180
|
-
const actual = 'iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAWElEQVR4AU3BQRWAQAhAwa/PGBsEgrC16AFBKEIPXW7OXO+Rmey9iQjMjHFzrLUwM7qbqmLcHKpKRFBVuDvj4agq3B1VRUQYT2bS3QwRQVUZF/CaGRHB3wc1vSZbHO5+BgAAAABJRU5ErkJggg==';
|
|
181
|
-
await f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
182
|
-
fixImageTemplateScale: true, xScale: 1.5, yScale: 1.5
|
|
183
|
-
}).should.eventually.eql(actual);
|
|
184
|
-
});
|
|
185
|
-
it('should not fix template size scale because of fixImageTemplateScale being false', async function () {
|
|
186
|
-
await f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
187
|
-
fixImageTemplateScale: false, xScale: 1.5, yScale: 1.5
|
|
188
|
-
}).should.eventually.eql(fixtures_1.TINY_PNG);
|
|
189
|
-
});
|
|
190
|
-
it('should fix template size scale with default scale', async function () {
|
|
191
|
-
const actual = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwUlEQVR4AaXBPUsrQQCG0SeX+cBdkTjwTpG1NPgLpjY/fW1stt4UYmm2cJqwMCsaw70uJJ3CBc9Z/P3Cl+12S9u2tG1L27bEGLm/v2ez2bDZbJDEd/7wS4YT7z3X19fc3Nxwd3dHXdd47xnHkefnZ8ZxpKoq6rqmqiqMMcwMJ1VV0TQN0zThnOPj44O6rsk503UdkmiahqZpWK1WGGOYGU7quqZpGqy1SCLnTM6Z19dXcs5IYpomrLVI4uLigpnhpKoqVqsVkjgcDjw9PdF1HTlnuq5DEs45JHE4HDgznByPR97e3pimiVIK4zhyPB7x3hNCIITA5eUl3nsWiwVnhpNSCsMwsNvtGIaB/X5PKQVJpJSQxHq9RhLOOc4MJ9M0sdvt2G639H3PTBIxRiQhCUnEGLHWcmY4KaUwDAN93/P4+MhyuSSlhCRSSkjCOYe1FmstZ6bve2YvLy/s93tmy+USSUhCEpIIIfAd8/DwwOz9/Z1SCpJIKSGJ9XqNJJxz/MS0bcvs6uoKScQYkYQkJBFjxFrLT0zbtsxub29JKSGJlBKScM5hrcVay09MzplZjJHPz0+894QQCCHwP/7wS/8A4e6nAg+R8LwAAAAASUVORK5CYII=';
|
|
192
|
-
await f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
193
|
-
defaultImageTemplateScale: 4.0
|
|
194
|
-
}).should.eventually.eql(actual);
|
|
195
|
-
});
|
|
196
|
-
it('should fix template size scale with default scale and image scale', async function () {
|
|
197
|
-
const actual = 'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACaUlEQVR4AbXBMWvrWBSF0c9BsFPtW91UR1U6+///FKlKKt8qqnyqnMozggkI8xgMj6x1uv+L/6zryrIsrOvKsiys68qyLFwuF87nM5fLhfP5zOVy4Xw+84wXftkLv2ziQBK26b0TEVQVu4jANrvM5Hq9spOEJCQhCUlI4mjiQBK26b1TVewkYRvb7DKTMQaZiW1s01rDNraRxNHEgSRaa1QVO0m01jjKTDKTXe+d3jtVxU4SjyYOJGGbnSRs03snM8lMMpPb7UZmkplEBFXFThK2eTRxIAnbSMI2VcX39zdjDMYYZCaZyRiDMQZVxU4StqkqHk0cSEISf5KZ7DKTMQbLsrCTRGuN3jtVxaOJg6qiqqgqqoqqoqoYY5CZ7GwTEdzvd97f34kIeu/YRhKPJg6qiswkM7ndbmQmmUlmkpnsbBMR2CYimOeZ3ju2kcSjiYOqIjP5+vpi2za2bWPbNo5aa7TW2PXe6b3Te6e1hiQeTRxUFbfbjW3bGGNwvV4ZY2Ab27TWsI1tbGMb27TWsI0kHk0cVBWZybZtXK9XPj8/+fj4YJ5nIoLWGraJCOZ5RhKSkIQkJPFo4qCqyEy2bWOMwefnJ+u6cjqdsM3ONvM8cz6feca0ris/rtcrmcnONhHB/X7n/f2diKD3jm0k8axpWRZ+ZCaZyc42EYFtIoJ5num9YxtJPGta15U/sY1tdm9vb/Te6b1jG0k8a1qWhR+2sU1rjdYatrGNbWxjm9YaknjWtK4rPyKCiKC1hm0igojg9fUVSUhCEpJ41rQsC0e22dkmIrhcLvyNF/7H6XTib73wy174Zf8AJEsePtlPj10AAAAASUVORK5CYII=';
|
|
198
|
-
await f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
199
|
-
defaultImageTemplateScale: 4.0,
|
|
200
|
-
fixImageTemplateScale: true,
|
|
201
|
-
xScale: 1.5, yScale: 1.5
|
|
202
|
-
}).should.eventually.eql(actual);
|
|
203
|
-
});
|
|
204
|
-
it('should not fix template size scale with default scale and image scale', async function () {
|
|
205
|
-
const actual = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwUlEQVR4AaXBPUsrQQCG0SeX+cBdkTjwTpG1NPgLpjY/fW1stt4UYmm2cJqwMCsaw70uJJ3CBc9Z/P3Cl+12S9u2tG1L27bEGLm/v2ez2bDZbJDEd/7wS4YT7z3X19fc3Nxwd3dHXdd47xnHkefnZ8ZxpKoq6rqmqiqMMcwMJ1VV0TQN0zThnOPj44O6rsk503UdkmiahqZpWK1WGGOYGU7quqZpGqy1SCLnTM6Z19dXcs5IYpomrLVI4uLigpnhpKoqVqsVkjgcDjw9PdF1HTlnuq5DEs45JHE4HDgznByPR97e3pimiVIK4zhyPB7x3hNCIITA5eUl3nsWiwVnhpNSCsMwsNvtGIaB/X5PKQVJpJSQxHq9RhLOOc4MJ9M0sdvt2G639H3PTBIxRiQhCUnEGLHWcmY4KaUwDAN93/P4+MhyuSSlhCRSSkjCOYe1FmstZ6bve2YvLy/s93tmy+USSUhCEpIIIfAd8/DwwOz9/Z1SCpJIKSGJ9XqNJJxz/MS0bcvs6uoKScQYkYQkJBFjxFrLT0zbtsxub29JKSGJlBKScM5hrcVay09MzplZjJHPz0+894QQCCHwP/7wS/8A4e6nAg+R8LwAAAAASUVORK5CYII=';
|
|
206
|
-
await f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
207
|
-
defaultImageTemplateScale: 4.0,
|
|
208
|
-
fixImageTemplateScale: false,
|
|
209
|
-
xScale: 1.5, yScale: 1.5
|
|
210
|
-
}).should.eventually.eql(actual);
|
|
211
|
-
});
|
|
212
|
-
it('should not fix template size scale because of ignoreDefaultImageTemplateScale', async function () {
|
|
213
|
-
await f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
214
|
-
defaultImageTemplateScale: 4.0,
|
|
215
|
-
ignoreDefaultImageTemplateScale: true,
|
|
216
|
-
}).should.eventually.eql(fixtures_1.TINY_PNG);
|
|
217
|
-
});
|
|
218
|
-
it('should ignore defaultImageTemplateScale to fix template size scale because of ignoreDefaultImageTemplateScale', async function () {
|
|
219
|
-
const actual = 'iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAWElEQVR4AU3BQRWAQAhAwa/PGBsEgrC16AFBKEIPXW7OXO+Rmey9iQjMjHFzrLUwM7qbqmLcHKpKRFBVuDvj4agq3B1VRUQYT2bS3QwRQVUZF/CaGRHB3wc1vSZbHO5+BgAAAABJRU5ErkJggg==';
|
|
220
|
-
await f.fixImageTemplateScale(fixtures_1.TINY_PNG, {
|
|
221
|
-
defaultImageTemplateScale: 4.0,
|
|
222
|
-
ignoreDefaultImageTemplateScale: true,
|
|
223
|
-
fixImageTemplateScale: true,
|
|
224
|
-
xScale: 1.5, yScale: 1.5
|
|
225
|
-
}).should.eventually.eql(actual);
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
describe('ensureTemplateSize', function () {
|
|
229
|
-
const d = new PluginDriver();
|
|
230
|
-
const f = new finder_1.default(d);
|
|
231
|
-
it('should not resize the template if it is smaller than the screen', async function () {
|
|
232
|
-
const screen = fixtures_1.TINY_PNG_DIMS.map((n) => n * 2);
|
|
233
|
-
await f.ensureTemplateSize(fixtures_1.TINY_PNG, ...screen)
|
|
234
|
-
.should.eventually.eql(fixtures_1.TINY_PNG);
|
|
235
|
-
});
|
|
236
|
-
it('should not resize the template if it is the same size as the screen', async function () {
|
|
237
|
-
await f.ensureTemplateSize(fixtures_1.TINY_PNG, ...fixtures_1.TINY_PNG_DIMS)
|
|
238
|
-
.should.eventually.eql(fixtures_1.TINY_PNG);
|
|
239
|
-
});
|
|
240
|
-
it('should resize the template if it is bigger than the screen', async function () {
|
|
241
|
-
const screen = fixtures_1.TINY_PNG_DIMS.map((n) => n / 2);
|
|
242
|
-
const newTemplate = await f.ensureTemplateSize(fixtures_1.TINY_PNG, ...screen);
|
|
243
|
-
newTemplate.should.not.eql(fixtures_1.TINY_PNG);
|
|
244
|
-
newTemplate.length.should.be.below(fixtures_1.TINY_PNG.length);
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
describe('getScreenshotForImageFind', function () {
|
|
248
|
-
let d;
|
|
249
|
-
let f;
|
|
250
|
-
beforeEach(function () {
|
|
251
|
-
d = new PluginDriver();
|
|
252
|
-
f = new finder_1.default(d);
|
|
253
|
-
sinon_1.default.stub(d, 'getScreenshot').returns(fixtures_1.TINY_PNG);
|
|
254
|
-
});
|
|
255
|
-
it('should fail if driver does not support getScreenshot', async function () {
|
|
256
|
-
const d = new base_driver_1.default();
|
|
257
|
-
const f = new finder_1.default(d);
|
|
258
|
-
await f.getScreenshotForImageFind()
|
|
259
|
-
.should.eventually.be.rejectedWith(/driver does not support/);
|
|
260
|
-
});
|
|
261
|
-
it('should not adjust or verify screenshot if asked not to by settings', async function () {
|
|
262
|
-
await d.settings.update({ fixImageFindScreenshotDims: false });
|
|
263
|
-
const screen = fixtures_1.TINY_PNG_DIMS.map((n) => n + 1);
|
|
264
|
-
const { b64Screenshot, scale } = await f.getScreenshotForImageFind(...screen);
|
|
265
|
-
b64Screenshot.should.eql(fixtures_1.TINY_PNG);
|
|
266
|
-
should.equal(scale, undefined);
|
|
267
|
-
});
|
|
268
|
-
it('should return screenshot without adjustment if it matches screen size', async function () {
|
|
269
|
-
const { b64Screenshot, scale } = await f.getScreenshotForImageFind(...fixtures_1.TINY_PNG_DIMS);
|
|
270
|
-
b64Screenshot.should.eql(fixtures_1.TINY_PNG);
|
|
271
|
-
should.equal(scale, undefined);
|
|
272
|
-
});
|
|
273
|
-
it('should return scaled screenshot with same aspect ratio if matching screen aspect ratio', async function () {
|
|
274
|
-
const screen = fixtures_1.TINY_PNG_DIMS.map((n) => n * 1.5);
|
|
275
|
-
const { b64Screenshot, scale } = await f.getScreenshotForImageFind(...screen);
|
|
276
|
-
b64Screenshot.should.not.eql(fixtures_1.TINY_PNG);
|
|
277
|
-
const screenshotObj = await support_1.imageUtil.getJimpImage(b64Screenshot);
|
|
278
|
-
screenshotObj.bitmap.width.should.eql(screen[0]);
|
|
279
|
-
screenshotObj.bitmap.height.should.eql(screen[1]);
|
|
280
|
-
scale.should.eql({ xScale: 1.5, yScale: 1.5 });
|
|
281
|
-
});
|
|
282
|
-
it('should return scaled screenshot with different aspect ratio if not matching screen aspect ratio', async function () {
|
|
283
|
-
// try first with portrait screen, screen = 8 x 12
|
|
284
|
-
let screen = [fixtures_1.TINY_PNG_DIMS[0] * 2, fixtures_1.TINY_PNG_DIMS[1] * 3];
|
|
285
|
-
let expectedScale = { xScale: 2.67, yScale: 4 };
|
|
286
|
-
const { b64Screenshot, scale } = await f.getScreenshotForImageFind(...screen);
|
|
287
|
-
b64Screenshot.should.not.eql(fixtures_1.TINY_PNG);
|
|
288
|
-
let screenshotObj = await support_1.imageUtil.getJimpImage(b64Screenshot);
|
|
289
|
-
screenshotObj.bitmap.width.should.eql(screen[0]);
|
|
290
|
-
screenshotObj.bitmap.height.should.eql(screen[1]);
|
|
291
|
-
scale.xScale.toFixed(2).should.eql(expectedScale.xScale.toString());
|
|
292
|
-
scale.yScale.should.eql(expectedScale.yScale);
|
|
293
|
-
// then with landscape screen, screen = 12 x 8
|
|
294
|
-
screen = [fixtures_1.TINY_PNG_DIMS[0] * 3, fixtures_1.TINY_PNG_DIMS[1] * 2];
|
|
295
|
-
expectedScale = { xScale: 4, yScale: 2.67 };
|
|
296
|
-
const { b64Screenshot: newScreen, scale: newScale } = await f.getScreenshotForImageFind(...screen);
|
|
297
|
-
newScreen.should.not.eql(fixtures_1.TINY_PNG);
|
|
298
|
-
screenshotObj = await support_1.imageUtil.getJimpImage(newScreen);
|
|
299
|
-
screenshotObj.bitmap.width.should.eql(screen[0]);
|
|
300
|
-
screenshotObj.bitmap.height.should.eql(screen[1]);
|
|
301
|
-
newScale.xScale.should.eql(expectedScale.xScale);
|
|
302
|
-
newScale.yScale.toFixed(2).should.eql(expectedScale.yScale.toString());
|
|
303
|
-
});
|
|
304
|
-
it('should return scaled screenshot with different aspect ratio if not matching screen aspect ratio with fixImageTemplateScale', async function () {
|
|
305
|
-
// try first with portrait screen, screen = 8 x 12
|
|
306
|
-
let screen = [fixtures_1.TINY_PNG_DIMS[0] * 2, fixtures_1.TINY_PNG_DIMS[1] * 3];
|
|
307
|
-
let expectedScale = { xScale: 2.67, yScale: 4 };
|
|
308
|
-
const { b64Screenshot, scale } = await f.getScreenshotForImageFind(...screen);
|
|
309
|
-
b64Screenshot.should.not.eql(fixtures_1.TINY_PNG);
|
|
310
|
-
let screenshotObj = await support_1.imageUtil.getJimpImage(b64Screenshot);
|
|
311
|
-
screenshotObj.bitmap.width.should.eql(screen[0]);
|
|
312
|
-
screenshotObj.bitmap.height.should.eql(screen[1]);
|
|
313
|
-
scale.xScale.toFixed(2).should.eql(expectedScale.xScale.toString());
|
|
314
|
-
scale.yScale.should.eql(expectedScale.yScale);
|
|
315
|
-
// 8 x 12 stretched TINY_PNG
|
|
316
|
-
await f.fixImageTemplateScale(b64Screenshot, { fixImageTemplateScale: true, scale })
|
|
317
|
-
.should.eventually.eql('iVBORw0KGgoAAAANSUhEUgAAAAgAAAAMCAYAAABfnvydAAAAJ0lEQVR4AYXBAQEAIACDMKR/p0fTBrKdbZcPCRIkSJAgQYIECRIkPAzBA1TpeNwZAAAAAElFTkSuQmCC');
|
|
318
|
-
// then with landscape screen, screen = 12 x 8
|
|
319
|
-
screen = [fixtures_1.TINY_PNG_DIMS[0] * 3, fixtures_1.TINY_PNG_DIMS[1] * 2];
|
|
320
|
-
expectedScale = { xScale: 4, yScale: 2.67 };
|
|
321
|
-
const { b64Screenshot: newScreen, scale: newScale } = await f.getScreenshotForImageFind(...screen);
|
|
322
|
-
newScreen.should.not.eql(fixtures_1.TINY_PNG);
|
|
323
|
-
screenshotObj = await support_1.imageUtil.getJimpImage(newScreen);
|
|
324
|
-
screenshotObj.bitmap.width.should.eql(screen[0]);
|
|
325
|
-
screenshotObj.bitmap.height.should.eql(screen[1]);
|
|
326
|
-
newScale.xScale.should.eql(expectedScale.xScale);
|
|
327
|
-
newScale.yScale.toFixed(2).should.eql(expectedScale.yScale.toString());
|
|
328
|
-
// 12 x 8 stretched TINY_PNG
|
|
329
|
-
await f.fixImageTemplateScale(newScreen, { fixImageTemplateScale: true, scale })
|
|
330
|
-
.should.eventually.eql('iVBORw0KGgoAAAANSUhEUgAAAAwAAAAICAYAAADN5B7xAAAAI0lEQVR4AZXBAQEAMAyDMI5/T5W2ayB5245AIokkkkgiiST6+W4DTLyo5PUAAAAASUVORK5CYII=');
|
|
331
|
-
});
|
|
332
|
-
});
|
|
333
|
-
});
|
|
334
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZGVyLXNwZWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2ZpbmRlci1zcGVjcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBdUI7QUFDdkIsNkNBQTRDO0FBQzVDLHNFQUE2QztBQUM3QyxxREFBaUU7QUFDakUsOERBQWtEO0FBQ2xELDRFQUFtRDtBQUNuRCxrREFBMEI7QUFDMUIsMENBQXNEO0FBQ3RELGdEQUF3QjtBQUN4Qix3RUFBOEM7QUFFOUMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDbkQsY0FBSSxDQUFDLEdBQUcsQ0FBQywwQkFBYyxDQUFDLENBQUM7QUFDekIsTUFBTSxNQUFNLEdBQUcsY0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBRTdCLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBa0IsRUFBRSxDQUFDO0FBRXhDLE1BQU0sWUFBYSxTQUFRLHFCQUFVO0lBQ25DLEtBQUssQ0FBQyxhQUFhLEtBQUssQ0FBQztJQUN6QixLQUFLLENBQUMsYUFBYSxLQUFLLENBQUM7SUFDekIsV0FBVyxDQUFFLFFBQVEsRUFBRSxRQUFRO1FBQzdCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxnQkFBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxZQUFZLENBQUUsUUFBUSxFQUFFLFFBQVE7UUFDOUIsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLGdCQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0QsQ0FBQztDQUVGO0FBRUQsUUFBUSxDQUFDLDJCQUEyQixFQUFFO0lBQ3BDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsRUFBRSxDQUFDLGdFQUFnRSxFQUFFLEtBQUs7WUFDeEUs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
|