@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.
@@ -1,320 +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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
- return new (P || (P = Promise))(function (resolve, reject) {
24
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
- step((generator = generator.apply(thisArg, _arguments || [])).next());
28
- });
29
- };
30
- var __importDefault = (this && this.__importDefault) || function (mod) {
31
- return (mod && mod.__esModule) ? mod : { "default": mod };
32
- };
33
- Object.defineProperty(exports, "__esModule", { value: true });
34
- const lodash_1 = __importDefault(require("lodash"));
35
- const chai_1 = __importDefault(require("chai"));
36
- const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
37
- const base_driver_1 = __importDefault(require("@appium/base-driver"));
38
- const finder_1 = __importDefault(require("../../lib/finder"));
39
- const plugin_1 = require("../../lib/plugin");
40
- const image_element_1 = __importStar(require("../../lib/image-element"));
41
- const sinon_1 = __importDefault(require("sinon"));
42
- chai_1.default.should();
43
- chai_1.default.use(chai_as_promised_1.default);
44
- const defRect = { x: 100, y: 110, width: 50, height: 25 };
45
- const defTemplate = 'iVBORasdf';
46
- describe('ImageElement', function () {
47
- const driver = new base_driver_1.default();
48
- describe('.size', function () {
49
- it('should return the width and height of the image el', function () {
50
- const el = new image_element_1.default(defTemplate, defRect);
51
- el.size.should.eql({ width: defRect.width, height: defRect.height });
52
- });
53
- });
54
- describe('.location', function () {
55
- it('should return the location of the image el', function () {
56
- const el = new image_element_1.default(defTemplate, defRect);
57
- el.location.should.eql({ x: defRect.x, y: defRect.y });
58
- });
59
- });
60
- describe('.center', function () {
61
- it('should return the center location of the image el', function () {
62
- const el = new image_element_1.default(defTemplate, defRect);
63
- el.center.should.eql({
64
- x: defRect.x + defRect.width / 2,
65
- y: defRect.y + defRect.height / 2
66
- });
67
- });
68
- });
69
- describe('.asElement', function () {
70
- it('should get the webdriver object representation of the element', function () {
71
- const el = new image_element_1.default(defTemplate, defRect);
72
- el.asElement('ELEMENT').ELEMENT.should.match(/^appium-image-el/);
73
- });
74
- });
75
- describe('.equals', function () {
76
- it('should say two image elements with same rect are equal', function () {
77
- const el1 = new image_element_1.default('foo', defRect);
78
- const el2 = new image_element_1.default('bar', defRect);
79
- el1.equals(el2).should.be.true;
80
- el2.equals(el1).should.be.true;
81
- });
82
- it('should say two image elements with different rect are not equal', function () {
83
- const el1 = new image_element_1.default(defTemplate, Object.assign(Object.assign({}, defRect), { x: 0 }));
84
- const el2 = new image_element_1.default(defTemplate, defRect);
85
- el1.equals(el2).should.be.false;
86
- el2.equals(el1).should.be.false;
87
- });
88
- });
89
- describe('.click', function () {
90
- it('should reject an invalid tap strategy', function () {
91
- return __awaiter(this, void 0, void 0, function* () {
92
- const d = new base_driver_1.default();
93
- const el = new image_element_1.default(defTemplate, defRect);
94
- yield d.settings.update({ imageElementTapStrategy: 'bad' });
95
- yield el.click(d).should.eventually.be.rejectedWith(/Incorrect imageElementTapStrategy/);
96
- });
97
- });
98
- it('should try to check for image element staleness, and throw if stale', function () {
99
- return __awaiter(this, void 0, void 0, function* () {
100
- const d = new base_driver_1.default();
101
- const f = new finder_1.default(d);
102
- sinon_1.default.stub(f, 'findByImage').throws();
103
- const el = new image_element_1.default(defTemplate, defRect, null, null, f);
104
- // we need to check for staleness if explicitly requested to do so
105
- yield d.settings.update({
106
- checkForImageElementStaleness: true,
107
- autoUpdateImageElementPosition: false
108
- });
109
- yield el.click(d).should.eventually.be.rejectedWith(/no longer attached/);
110
- // and also if we are updating the element position
111
- yield d.settings.update({
112
- checkForImageElementStaleness: false,
113
- autoUpdateImageElementPosition: true
114
- });
115
- yield el.click(d).should.eventually.be.rejectedWith(/no longer attached/);
116
- });
117
- });
118
- it('should auto-update element position if requested', function () {
119
- return __awaiter(this, void 0, void 0, function* () {
120
- const d = new base_driver_1.default();
121
- d.performActions = lodash_1.default.noop;
122
- sinon_1.default.stub(d, 'performActions');
123
- const f = new finder_1.default(d);
124
- const el = new image_element_1.default(defTemplate, defRect, null, null, f);
125
- const newRect = Object.assign(Object.assign({}, defRect), { x: defRect.x + 10, y: defRect.y + 5 });
126
- const elPos2 = new image_element_1.default(defTemplate, newRect, null, null, f);
127
- sinon_1.default.stub(f, 'findByImage').returns(elPos2);
128
- yield d.settings.update({
129
- autoUpdateImageElementPosition: true,
130
- });
131
- el.rect.should.not.eql(newRect);
132
- yield el.click(d);
133
- el.rect.should.eql(newRect);
134
- });
135
- });
136
- it('should tap the center of an element using w3c actions by default', function () {
137
- return __awaiter(this, void 0, void 0, function* () {
138
- const d = new base_driver_1.default();
139
- d.performActions = lodash_1.default.noop;
140
- const actionStub = sinon_1.default.stub(d, 'performActions');
141
- const el = new image_element_1.default(defTemplate, defRect);
142
- // skip the staleness check for this test
143
- yield d.settings.update({
144
- checkForImageElementStaleness: false,
145
- });
146
- yield el.click(d);
147
- const pointerMoveAction = actionStub.args[0][0][0].actions[0];
148
- pointerMoveAction.x.should.equal(el.center.x);
149
- pointerMoveAction.y.should.equal(el.center.y);
150
- });
151
- });
152
- it('should fall back to touchactions if w3c actions do not exist on driver', function () {
153
- return __awaiter(this, void 0, void 0, function* () {
154
- const d = new base_driver_1.default();
155
- d.performTouch = lodash_1.default.noop;
156
- const actionStub = sinon_1.default.stub(d, 'performTouch');
157
- const el = new image_element_1.default(defTemplate, defRect);
158
- // skip the staleness check for this test
159
- yield d.settings.update({
160
- checkForImageElementStaleness: false,
161
- });
162
- yield el.click(d);
163
- const action = actionStub.args[0][0][0].options;
164
- action.x.should.equal(el.center.x);
165
- action.y.should.equal(el.center.y);
166
- });
167
- });
168
- it('should use touchactions if requested', function () {
169
- return __awaiter(this, void 0, void 0, function* () {
170
- const d = new base_driver_1.default();
171
- d.performActions = lodash_1.default.noop;
172
- const w3cStub = sinon_1.default.stub(d, 'performActions');
173
- d.performTouch = lodash_1.default.noop;
174
- const touchStub = sinon_1.default.stub(d, 'performTouch');
175
- const el = new image_element_1.default(defTemplate, defRect);
176
- // skip the staleness check for this test
177
- yield d.settings.update({
178
- checkForImageElementStaleness: false,
179
- imageElementTapStrategy: 'touchActions',
180
- });
181
- yield el.click(d);
182
- const action = touchStub.args[0][0][0].options;
183
- action.x.should.equal(el.center.x);
184
- action.y.should.equal(el.center.y);
185
- w3cStub.callCount.should.eql(0);
186
- });
187
- });
188
- it('should throw if driver does not implement any type of action', function () {
189
- return __awaiter(this, void 0, void 0, function* () {
190
- const d = new base_driver_1.default();
191
- const el = new image_element_1.default(defTemplate, defRect);
192
- // skip the staleness check for this test
193
- yield d.settings.update({
194
- checkForImageElementStaleness: false,
195
- });
196
- yield el.click(d).should.eventually.be.rejectedWith(/did not implement/);
197
- });
198
- });
199
- });
200
- describe('#execute', function () {
201
- // aGFwcHkgdGVzdGluZw== is 'happy testing'
202
- const f = new finder_1.default(driver);
203
- const imgEl = new image_element_1.default(defTemplate, defRect, 0, 'aGFwcHkgdGVzdGluZw==', f);
204
- const clickStub = sinon_1.default.stub(imgEl, 'click');
205
- before(function () {
206
- f.imgElCache.set(imgEl.id, imgEl);
207
- clickStub.returns(true);
208
- });
209
- after(function () {
210
- f.imgElCache.reset();
211
- clickStub.restore();
212
- });
213
- it('should reject executions for unsupported commands', function () {
214
- return __awaiter(this, void 0, void 0, function* () {
215
- yield image_element_1.default.execute(driver, imgEl, 'foobar')
216
- .should.eventually.be.rejectedWith(/not yet been implemented/);
217
- });
218
- });
219
- it('should get displayed status of element', function () {
220
- return __awaiter(this, void 0, void 0, function* () {
221
- yield image_element_1.default.execute(driver, imgEl, 'elementDisplayed')
222
- .should.eventually.be.true;
223
- });
224
- });
225
- it('should get size of element', function () {
226
- return __awaiter(this, void 0, void 0, function* () {
227
- yield image_element_1.default.execute(driver, imgEl, 'getSize')
228
- .should.eventually.eql({ width: defRect.width, height: defRect.height });
229
- });
230
- });
231
- it('should get location of element', function () {
232
- return __awaiter(this, void 0, void 0, function* () {
233
- yield image_element_1.default.execute(driver, imgEl, 'getLocation')
234
- .should.eventually.eql({ x: defRect.x, y: defRect.y });
235
- });
236
- });
237
- it('should get location in view of element', function () {
238
- return __awaiter(this, void 0, void 0, function* () {
239
- yield image_element_1.default.execute(driver, imgEl, 'getLocation')
240
- .should.eventually.eql({ x: defRect.x, y: defRect.y });
241
- });
242
- });
243
- it('should get rect of element', function () {
244
- return __awaiter(this, void 0, void 0, function* () {
245
- yield image_element_1.default.execute(driver, imgEl, 'getElementRect')
246
- .should.eventually.eql(defRect);
247
- });
248
- });
249
- it('should get score of element', function () {
250
- return __awaiter(this, void 0, void 0, function* () {
251
- yield image_element_1.default.execute(driver, imgEl, 'getAttribute', 'score')
252
- .should.eventually.eql(0);
253
- });
254
- });
255
- it('should get visual of element', function () {
256
- return __awaiter(this, void 0, void 0, function* () {
257
- yield image_element_1.default.execute(driver, imgEl, 'getAttribute', 'visual')
258
- .should.eventually.eql('aGFwcHkgdGVzdGluZw==');
259
- });
260
- });
261
- it('should get null as visual of element by default', function () {
262
- return __awaiter(this, void 0, void 0, function* () {
263
- const imgElement = new image_element_1.default(defTemplate, defRect);
264
- yield image_element_1.default.execute(driver, imgElement, 'getAttribute', 'visual')
265
- .should.eventually.eql(null);
266
- });
267
- });
268
- it('should not get other attribute', function () {
269
- return __awaiter(this, void 0, void 0, function* () {
270
- yield image_element_1.default.execute(driver, imgEl, 'getAttribute', 'content-desc')
271
- .should.eventually.rejectedWith('Method has not yet been implemented');
272
- });
273
- });
274
- it('should click element', function () {
275
- return __awaiter(this, void 0, void 0, function* () {
276
- yield image_element_1.default.execute(driver, imgEl, 'click')
277
- .should.eventually.be.true;
278
- });
279
- });
280
- });
281
- });
282
- describe('image element LRU cache', function () {
283
- it('should accept and cache image elements', function () {
284
- const el1 = new image_element_1.default(defTemplate, defRect);
285
- const el2 = new image_element_1.default(defTemplate, defRect);
286
- const cache = (new finder_1.default()).imgElCache;
287
- cache.set(el1.id, el1);
288
- el1.equals(cache.get(el1.id)).should.be.true;
289
- lodash_1.default.isUndefined(cache.get(el2.id)).should.be.true;
290
- cache.has(el1.id).should.be.true;
291
- cache.has(el2.id).should.be.false;
292
- });
293
- it('once cache reaches max size, should eject image elements', function () {
294
- const el1 = new image_element_1.default(defTemplate, defRect);
295
- const el2 = new image_element_1.default(defTemplate, defRect);
296
- const cache = (new finder_1.default(null, defTemplate.length + 1)).imgElCache;
297
- cache.set(el1.id, el1);
298
- cache.has(el1.id).should.be.true;
299
- cache.set(el2.id, el2);
300
- cache.has(el2.id).should.be.true;
301
- cache.has(el1.id).should.be.false;
302
- });
303
- });
304
- describe('getImgElFromArgs', function () {
305
- it('should return the image element id from json obj in args', function () {
306
- const imgEl = `${image_element_1.IMAGE_ELEMENT_PREFIX}foo`;
307
- const args = [1, 'foo', imgEl];
308
- (0, plugin_1.getImgElFromArgs)(args).should.eql(imgEl);
309
- });
310
- it('should not return anything if image element id not in args', function () {
311
- const args = [1, 'foo'];
312
- lodash_1.default.isUndefined((0, plugin_1.getImgElFromArgs)(args)).should.be.true;
313
- });
314
- it('should not find image element id in anything but prefix', function () {
315
- const notImgEl = `foo${image_element_1.IMAGE_ELEMENT_PREFIX}`;
316
- const args = [1, 'foo', notImgEl];
317
- lodash_1.default.isUndefined((0, plugin_1.getImgElFromArgs)(args)).should.be.true;
318
- });
319
- });
320
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZWxlbWVudC1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9pbWFnZS1lbGVtZW50LXNwZWNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUF1QjtBQUN2QixnREFBd0I7QUFDeEIsd0VBQThDO0FBQzlDLHNFQUE2QztBQUM3Qyw4REFBa0Q7QUFDbEQsNkNBQW9EO0FBQ3BELHlFQUE2RTtBQUM3RSxrREFBMEI7QUFHMUIsY0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ2QsY0FBSSxDQUFDLEdBQUcsQ0FBQywwQkFBYyxDQUFDLENBQUM7QUFHekIsTUFBTSxPQUFPLEdBQUcsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFDLENBQUM7QUFDeEQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDO0FBRWhDLFFBQVEsQ0FBQyxjQUFjLEVBQUU7SUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBVSxFQUFFLENBQUM7SUFFaEMsUUFBUSxDQUFDLE9BQU8sRUFBRTtRQUNoQixFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsTUFBTSxFQUFFLEdBQUcsSUFBSSx1QkFBWSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNsRCxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxXQUFXLEVBQUU7UUFDcEIsRUFBRSxDQUFDLDRDQUE0QyxFQUFFO1lBQy9DLE1BQU0s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
@@ -1,199 +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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
- return new (P || (P = Promise))(function (resolve, reject) {
24
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
- step((generator = generator.apply(thisArg, _arguments || [])).next());
28
- });
29
- };
30
- var __importDefault = (this && this.__importDefault) || function (mod) {
31
- return (mod && mod.__esModule) ? mod : { "default": mod };
32
- };
33
- Object.defineProperty(exports, "__esModule", { value: true });
34
- let hasOpenCV = false;
35
- try {
36
- require('opencv4nodejs');
37
- hasOpenCV = true;
38
- }
39
- catch (ign) { }
40
- const chai_1 = __importDefault(require("chai"));
41
- const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
42
- const index_1 = __importStar(require("../../index"));
43
- const compare_1 = require("../../lib/compare");
44
- const base_driver_1 = __importDefault(require("@appium/base-driver"));
45
- const finder_1 = require("../../lib/finder");
46
- const fixtures_1 = require("../fixtures");
47
- chai_1.default.use(chai_as_promised_1.default);
48
- chai_1.default.should();
49
- const describeOrSkip = hasOpenCV ? describe : describe.skip;
50
- describeOrSkip('ImageElementPlugin#handle', function () {
51
- const next = () => { };
52
- const driver = new base_driver_1.default();
53
- const p = new index_1.default();
54
- describe('compareImages', function () {
55
- this.timeout(6000);
56
- it('should compare images via match features mode', function () {
57
- return __awaiter(this, void 0, void 0, function* () {
58
- const res = yield p.compareImages(next, driver, compare_1.MATCH_FEATURES_MODE, fixtures_1.TEST_IMG_1_B64, fixtures_1.TEST_IMG_2_B64, {});
59
- res.count.should.eql(0);
60
- });
61
- });
62
- it('should compare images via get similarity mode', function () {
63
- return __awaiter(this, void 0, void 0, function* () {
64
- const res = yield p.compareImages(next, driver, compare_1.GET_SIMILARITY_MODE, fixtures_1.TEST_IMG_1_B64, fixtures_1.TEST_IMG_2_B64, {});
65
- res.score.should.be.above(0.2);
66
- });
67
- });
68
- it('should compare images via match template mode', function () {
69
- return __awaiter(this, void 0, void 0, function* () {
70
- const res = yield p.compareImages(next, driver, compare_1.MATCH_TEMPLATE_MODE, fixtures_1.TEST_IMG_1_B64, fixtures_1.TEST_IMG_2_B64, {});
71
- res.rect.height.should.be.above(0);
72
- res.rect.width.should.be.above(0);
73
- res.score.should.be.above(0.2);
74
- });
75
- });
76
- it('should throw an error if comparison mode is not supported', function () {
77
- return __awaiter(this, void 0, void 0, function* () {
78
- yield p.compareImages(next, driver, 'some mode', '', '')
79
- .should.eventually.be.rejectedWith(/comparison mode is unknown/);
80
- });
81
- });
82
- });
83
- describe('findElement(s)', function () {
84
- driver.settings = { getSettings: () => ({}) };
85
- driver.isW3CProtocol = () => true;
86
- driver.getScreenshot = () => fixtures_1.TEST_IMG_2_B64;
87
- driver.getWindowSize = () => ({ width: 64, height: 64 });
88
- it('should defer execution to regular command if not a find command', function () {
89
- return __awaiter(this, void 0, void 0, function* () {
90
- const next = () => true;
91
- yield p.handle(next, driver, 'sendKeys').should.eventually.become(true);
92
- });
93
- });
94
- it('should defer execution to regular command if it is a find command but a different strategy', function () {
95
- return __awaiter(this, void 0, void 0, function* () {
96
- const next = () => true;
97
- yield p.findElement(next, driver, 'xpath', '//foo/bar').should.eventually.become(true);
98
- yield p.findElements(next, driver, 'xpath', '//foo/bar').should.eventually.become(true);
99
- });
100
- });
101
- it('should find an image element inside a screenshot', function () {
102
- return __awaiter(this, void 0, void 0, function* () {
103
- const el = yield p.findElement(next, driver, index_1.IMAGE_STRATEGY, fixtures_1.TEST_IMG_2_PART_B64);
104
- el[finder_1.W3C_ELEMENT_KEY].should.include('appium-image-element');
105
- });
106
- });
107
- it('should find image elements inside a screenshot', function () {
108
- return __awaiter(this, void 0, void 0, function* () {
109
- const els = yield p.findElements(next, driver, index_1.IMAGE_STRATEGY, fixtures_1.TEST_IMG_2_PART_B64);
110
- els.should.have.length(1);
111
- els[0][finder_1.W3C_ELEMENT_KEY].should.include('appium-image-element');
112
- });
113
- });
114
- });
115
- describe('Element interactions', function () {
116
- let elId;
117
- before(function () {
118
- return __awaiter(this, void 0, void 0, function* () {
119
- driver.settings = { getSettings: () => ({}) };
120
- driver.isW3CProtocol = () => true;
121
- driver.getScreenshot = () => fixtures_1.TEST_IMG_2_B64;
122
- driver.getWindowSize = () => ({ width: 64, height: 64 });
123
- const el = yield p.findElement(next, driver, index_1.IMAGE_STRATEGY, fixtures_1.TEST_IMG_2_PART_B64);
124
- elId = el[finder_1.W3C_ELEMENT_KEY];
125
- });
126
- });
127
- it('should click on the screen coords of the middle of the element', function () {
128
- return __awaiter(this, void 0, void 0, function* () {
129
- let action = null;
130
- driver.performActions = (a) => { action = a; };
131
- yield p.handle(next, driver, 'click', elId);
132
- action.should.eql([{
133
- type: 'pointer',
134
- id: 'mouse',
135
- parameters: { pointerType: 'touch' },
136
- actions: [
137
- { type: 'pointerMove', x: 24, y: 40, duration: 0 },
138
- { type: 'pointerDown', button: 0 },
139
- { type: 'pause', duration: 125 },
140
- { type: 'pointerUp', button: 0 },
141
- ]
142
- }]);
143
- });
144
- });
145
- it('should always say the element is displayed', function () {
146
- return __awaiter(this, void 0, void 0, function* () {
147
- yield p.handle(next, driver, 'elementDisplayed', elId).should.eventually.be.true;
148
- });
149
- });
150
- it('should return the matched region size', function () {
151
- return __awaiter(this, void 0, void 0, function* () {
152
- yield p.handle(next, driver, 'getSize', elId).should.eventually.eql({
153
- width: 48,
154
- height: 48,
155
- });
156
- });
157
- });
158
- it('should return the matched region location', function () {
159
- return __awaiter(this, void 0, void 0, function* () {
160
- yield p.handle(next, driver, 'getLocation', elId).should.eventually.eql({
161
- x: 0,
162
- y: 16,
163
- });
164
- });
165
- });
166
- it('should return the region rect', function () {
167
- return __awaiter(this, void 0, void 0, function* () {
168
- yield p.handle(next, driver, 'getElementRect', elId).should.eventually.eql({
169
- x: 0,
170
- y: 16,
171
- height: 48,
172
- width: 48,
173
- });
174
- });
175
- });
176
- it('should return the match score as the score attr', function () {
177
- return __awaiter(this, void 0, void 0, function* () {
178
- yield p.handle(next, driver, 'getAttribute', 'score', elId).should.eventually.be.above(0.7);
179
- });
180
- });
181
- it('should return the match visualization as the visual attr', function () {
182
- return __awaiter(this, void 0, void 0, function* () {
183
- driver.settings = { getSettings: () => ({
184
- getMatchedImageResult: true,
185
- }) };
186
- const el = yield p.findElement(next, driver, index_1.IMAGE_STRATEGY, fixtures_1.TEST_IMG_2_PART_B64);
187
- elId = el[finder_1.W3C_ELEMENT_KEY];
188
- yield p.handle(next, driver, 'getAttribute', 'visual', elId).should.eventually.include('iVBOR');
189
- });
190
- });
191
- it('should not allow any other attrs', function () {
192
- return __awaiter(this, void 0, void 0, function* () {
193
- yield p.handle(next, driver, 'getAttribute', 'rando', elId).should.eventually.be
194
- .rejectedWith(/not yet/i);
195
- });
196
- });
197
- });
198
- });
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXNwZWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3BsdWdpbi1zcGVjcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDdEIsSUFBSTtJQUNGLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN6QixTQUFTLEdBQUcsSUFBSSxDQUFDO0NBQ2xCO0FBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRTtBQUVoQixnREFBd0I7QUFDeEIsd0VBQThDO0FBQzlDLHFEQUFpRTtBQUNqRSwrQ0FBa0c7QUFDbEcsc0VBQTZDO0FBQzdDLDZDQUFtRDtBQUNuRCwwQ0FBa0Y7QUFFbEYsY0FBSSxDQUFDLEdBQUcsQ0FBQywwQkFBYyxDQUFDLENBQUM7QUFDekIsY0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBRWQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7QUFFNUQsY0FBYyxDQUFDLDJCQUEyQixFQUFFO0lBQzFDLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFVLEVBQUUsQ0FBQztJQUNoQyxNQUFNLENBQUMsR0FBRyxJQUFJLGVBQWtCLEVBQUUsQ0FBQztJQUNuQyxRQUFRLENBQUMsZUFBZSxFQUFFO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsRUFBRSxDQUFDLCtDQUErQyxFQUFFOztnQkFDbEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsNkJBQW1CLEVBQUUseUJBQWMsRUFBRSx5QkFBYyxFQUFFLEVBQUUsQ0FBQyxDQUFD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