@appium/images-plugin 1.3.6 → 2.0.0

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,98 +1,77 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = exports.ImageElementPlugin = exports.IMAGE_STRATEGY = void 0;
9
- exports.getImgElFromArgs = getImgElFromArgs;
10
-
11
- require("source-map-support/register");
12
-
13
- var _lodash = _interopRequireDefault(require("lodash"));
14
-
15
- var _driver = require("appium/driver");
16
-
17
- var _plugin = _interopRequireDefault(require("appium/plugin"));
18
-
19
- var _compare = require("./compare");
20
-
21
- var _finder = _interopRequireDefault(require("./finder"));
22
-
23
- var _imageElement = require("./image-element");
24
-
2
+ /* eslint-disable no-case-declarations */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.IMAGE_STRATEGY = exports.getImgElFromArgs = exports.ImageElementPlugin = void 0;
8
+ const lodash_1 = __importDefault(require("lodash"));
9
+ const driver_1 = require("appium/driver");
10
+ const plugin_1 = __importDefault(require("appium/plugin"));
11
+ const compare_1 = require("./compare");
12
+ const finder_1 = __importDefault(require("./finder"));
13
+ const image_element_1 = require("./image-element");
25
14
  const IMAGE_STRATEGY = '-image';
26
15
  exports.IMAGE_STRATEGY = IMAGE_STRATEGY;
27
-
28
16
  function getImgElFromArgs(args) {
29
- for (let arg of args) {
30
- if (_lodash.default.isString(arg) && arg.startsWith(_imageElement.IMAGE_ELEMENT_PREFIX)) {
31
- return arg;
17
+ for (let arg of args) {
18
+ if (lodash_1.default.isString(arg) && arg.startsWith(image_element_1.IMAGE_ELEMENT_PREFIX)) {
19
+ return arg;
20
+ }
32
21
  }
33
- }
34
22
  }
35
-
36
- class ImageElementPlugin extends _plugin.default {
37
- constructor(pluginName) {
38
- super(pluginName);
39
- this.finder = new _finder.default();
40
- }
41
-
42
- static newMethodMap = {
43
- '/session/:sessionId/appium/compare_images': {
44
- POST: {
45
- command: 'compareImages',
46
- payloadParams: {
47
- required: ['mode', 'firstImage', 'secondImage'],
48
- optional: ['options']
49
- },
50
- neverProxy: true
51
- }
23
+ exports.getImgElFromArgs = getImgElFromArgs;
24
+ class ImageElementPlugin extends plugin_1.default {
25
+ constructor(pluginName) {
26
+ super(pluginName);
27
+ this.finder = new finder_1.default();
28
+ }
29
+ async compareImages(next, driver, ...args) {
30
+ return await (0, compare_1.compareImages)(...args);
52
31
  }
53
- };
54
-
55
- async compareImages(next, driver, ...args) {
56
- return await (0, _compare.compareImages)(...args);
57
- }
58
-
59
- async findElement(next, driver, ...args) {
60
- return await this._find(false, next, driver, ...args);
61
- }
62
-
63
- async findElements(next, driver, ...args) {
64
- return await this._find(true, next, driver, ...args);
65
- }
66
-
67
- async _find(multiple, next, driver, ...args) {
68
- const [strategy, selector] = args;
69
-
70
- if (strategy !== IMAGE_STRATEGY) {
71
- return await next();
32
+ async findElement(next, driver, ...args) {
33
+ return await this._find(false, next, driver, ...args);
72
34
  }
73
-
74
- this.finder.setDriver(driver);
75
- return await this.finder.findByImage(selector, {
76
- multiple
77
- });
78
- }
79
-
80
- async handle(next, driver, cmdName, ...args) {
81
- const imgElId = getImgElFromArgs(args);
82
-
83
- if (imgElId) {
84
- if (!this.finder.imgElCache.has(imgElId)) {
85
- throw new _driver.errors.NoSuchElementError();
86
- }
87
-
88
- const imgEl = this.finder.imgElCache.get(imgElId);
89
- return await _imageElement.ImageElement.execute(driver, imgEl, cmdName, ...args);
35
+ async findElements(next, driver, ...args) {
36
+ return await this._find(true, next, driver, ...args);
37
+ }
38
+ async _find(multiple, next, driver, ...args) {
39
+ const [strategy, selector] = args;
40
+ // if we're not actually finding by image, just do the normal thing
41
+ if (strategy !== IMAGE_STRATEGY) {
42
+ return await next();
43
+ }
44
+ this.finder.setDriver(driver);
45
+ return await this.finder.findByImage(selector, { multiple });
46
+ }
47
+ async handle(next, driver, cmdName, ...args) {
48
+ // if we have a command that involves an image element id, attempt to find the image element
49
+ // and execute the command on it
50
+ const imgElId = getImgElFromArgs(args);
51
+ if (imgElId) {
52
+ if (!this.finder.imgElCache.has(imgElId)) {
53
+ throw new driver_1.errors.NoSuchElementError();
54
+ }
55
+ const imgEl = this.finder.imgElCache.get(imgElId);
56
+ return await image_element_1.ImageElement.execute(driver, imgEl, cmdName, ...args);
57
+ }
58
+ // otherwise just do the normal thing
59
+ return await next();
90
60
  }
91
-
92
- return await next();
93
- }
94
-
95
61
  }
96
-
97
- exports.ImageElementPlugin = exports.default = ImageElementPlugin;
98
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJTUFHRV9TVFJBVEVHWSIsImdldEltZ0VsRnJvbUFyZ3MiLCJhcmdzIiwiYXJnIiwiXyIsImlzU3RyaW5nIiwic3RhcnRzV2l0aCIsIklNQUdFX0VMRU1FTlRfUFJFRklYIiwiSW1hZ2VFbGVtZW50UGx1Z2luIiwiQmFzZVBsdWdpbiIsImNvbnN0cnVjdG9yIiwicGx1Z2luTmFtZSIsImZpbmRlciIsIkltYWdlRWxlbWVudEZpbmRlciIsIm5ld01ldGhvZE1hcCIsIlBPU1QiLCJjb21tYW5kIiwicGF5bG9hZFBhcmFtcyIsInJlcXVpcmVkIiwib3B0aW9uYWwiLCJuZXZlclByb3h5IiwiY29tcGFyZUltYWdlcyIsIm5leHQiLCJkcml2ZXIiLCJmaW5kRWxlbWVudCIsIl9maW5kIiwiZmluZEVsZW1lbnRzIiwibXVsdGlwbGUiLCJzdHJhdGVneSIsInNlbGVjdG9yIiwic2V0RHJpdmVyIiwiZmluZEJ5SW1hZ2UiLCJoYW5kbGUiLCJjbWROYW1lIiwiaW1nRWxJZCIsImltZ0VsQ2FjaGUiLCJoYXMiLCJlcnJvcnMiLCJOb1N1Y2hFbGVtZW50RXJyb3IiLCJpbWdFbCIsImdldCIsIkltYWdlRWxlbWVudCIsImV4ZWN1dGUiXSwic291cmNlcyI6WyIuLi8uLi9saWIvcGx1Z2luLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNhc2UtZGVjbGFyYXRpb25zICovXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge2Vycm9yc30gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgQmFzZVBsdWdpbiBmcm9tICdhcHBpdW0vcGx1Z2luJztcbmltcG9ydCB7Y29tcGFyZUltYWdlc30gZnJvbSAnLi9jb21wYXJlJztcbmltcG9ydCBJbWFnZUVsZW1lbnRGaW5kZXIgZnJvbSAnLi9maW5kZXInO1xuaW1wb3J0IHtJbWFnZUVsZW1lbnQsIElNQUdFX0VMRU1FTlRfUFJFRklYfSBmcm9tICcuL2ltYWdlLWVsZW1lbnQnO1xuXG5jb25zdCBJTUFHRV9TVFJBVEVHWSA9ICctaW1hZ2UnO1xuXG5mdW5jdGlvbiBnZXRJbWdFbEZyb21BcmdzKGFyZ3MpIHtcbiAgZm9yIChsZXQgYXJnIG9mIGFyZ3MpIHtcbiAgICBpZiAoXy5pc1N0cmluZyhhcmcpICYmIGFyZy5zdGFydHNXaXRoKElNQUdFX0VMRU1FTlRfUFJFRklYKSkge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hZ2VFbGVtZW50UGx1Z2luIGV4dGVuZHMgQmFzZVBsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKHBsdWdpbk5hbWUpIHtcbiAgICBzdXBlcihwbHVnaW5OYW1lKTtcbiAgICB0aGlzLmZpbmRlciA9IG5ldyBJbWFnZUVsZW1lbnRGaW5kZXIoKTtcbiAgfVxuXG4gIC8vIHRoaXMgcGx1Z2luIHN1cHBvcnRzIGEgbm9uLXN0YW5kYXJkICdjb21wYXJlIGltYWdlcycgY29tbWFuZFxuICBzdGF0aWMgbmV3TWV0aG9kTWFwID0ge1xuICAgICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9jb21wYXJlX2ltYWdlcyc6IHtcbiAgICAgIFBPU1Q6IHtcbiAgICAgICAgY29tbWFuZDogJ2NvbXBhcmVJbWFnZXMnLFxuICAgICAgICBwYXlsb2FkUGFyYW1zOiB7XG4gICAgICAgICAgcmVxdWlyZWQ6IFsnbW9kZScsICdmaXJzdEltYWdlJywgJ3NlY29uZEltYWdlJ10sXG4gICAgICAgICAgb3B0aW9uYWw6IFsnb3B0aW9ucyddLFxuICAgICAgICB9LFxuICAgICAgICBuZXZlclByb3h5OiB0cnVlLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGFzeW5jIGNvbXBhcmVJbWFnZXMobmV4dCwgZHJpdmVyLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNvbXBhcmVJbWFnZXMoLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBmaW5kRWxlbWVudChuZXh0LCBkcml2ZXIsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZmluZChmYWxzZSwgbmV4dCwgZHJpdmVyLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRFbGVtZW50cyhuZXh0LCBkcml2ZXIsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZmluZCh0cnVlLCBuZXh0LCBkcml2ZXIsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgX2ZpbmQobXVsdGlwbGUsIG5leHQsIGRyaXZlciwgLi4uYXJncykge1xuICAgIGNvbnN0IFtzdHJhdGVneSwgc2VsZWN0b3JdID0gYXJncztcblxuICAgIC8vIGlmIHdlJ3JlIG5vdCBhY3R1YWxseSBmaW5kaW5nIGJ5IGltYWdlLCBqdXN0IGRvIHRoZSBub3JtYWwgdGhpbmdcbiAgICBpZiAoc3RyYXRlZ3kgIT09IElNQUdFX1NUUkFURUdZKSB7XG4gICAgICByZXR1cm4gYXdhaXQgbmV4dCgpO1xuICAgIH1cblxuICAgIHRoaXMuZmluZGVyLnNldERyaXZlcihkcml2ZXIpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRlci5maW5kQnlJbWFnZShzZWxlY3Rvciwge211bHRpcGxlfSk7XG4gIH1cblxuICBhc3luYyBoYW5kbGUobmV4dCwgZHJpdmVyLCBjbWROYW1lLCAuLi5hcmdzKSB7XG4gICAgLy8gaWYgd2UgaGF2ZSBhIGNvbW1hbmQgdGhhdCBpbnZvbHZlcyBhbiBpbWFnZSBlbGVtZW50IGlkLCBhdHRlbXB0IHRvIGZpbmQgdGhlIGltYWdlIGVsZW1lbnRcbiAgICAvLyBhbmQgZXhlY3V0ZSB0aGUgY29tbWFuZCBvbiBpdFxuICAgIGNvbnN0IGltZ0VsSWQgPSBnZXRJbWdFbEZyb21BcmdzKGFyZ3MpO1xuICAgIGlmIChpbWdFbElkKSB7XG4gICAgICBpZiAoIXRoaXMuZmluZGVyLmltZ0VsQ2FjaGUuaGFzKGltZ0VsSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbWdFbCA9IHRoaXMuZmluZGVyLmltZ0VsQ2FjaGUuZ2V0KGltZ0VsSWQpO1xuICAgICAgcmV0dXJuIGF3YWl0IEltYWdlRWxlbWVudC5leGVjdXRlKGRyaXZlciwgaW1nRWwsIGNtZE5hbWUsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIC8vIG90aGVyd2lzZSBqdXN0IGRvIHRoZSBub3JtYWwgdGhpbmdcbiAgICByZXR1cm4gYXdhaXQgbmV4dCgpO1xuICB9XG59XG5cbmV4cG9ydCB7SW1hZ2VFbGVtZW50UGx1Z2luLCBnZXRJbWdFbEZyb21BcmdzLCBJTUFHRV9TVFJBVEVHWX07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGNBQWMsR0FBRyxRQUF2Qjs7O0FBRUEsU0FBU0MsZ0JBQVQsQ0FBMEJDLElBQTFCLEVBQWdDO0VBQzlCLEtBQUssSUFBSUMsR0FBVCxJQUFnQkQsSUFBaEIsRUFBc0I7SUFDcEIsSUFBSUUsZUFBQSxDQUFFQyxRQUFGLENBQVdGLEdBQVgsS0FBbUJBLEdBQUcsQ0FBQ0csVUFBSixDQUFlQyxrQ0FBZixDQUF2QixFQUE2RDtNQUMzRCxPQUFPSixHQUFQO0lBQ0Q7RUFDRjtBQUNGOztBQUVjLE1BQU1LLGtCQUFOLFNBQWlDQyxlQUFqQyxDQUE0QztFQUN6REMsV0FBVyxDQUFDQyxVQUFELEVBQWE7SUFDdEIsTUFBTUEsVUFBTjtJQUNBLEtBQUtDLE1BQUwsR0FBYyxJQUFJQyxlQUFKLEVBQWQ7RUFDRDs7RUFHa0IsT0FBWkMsWUFBWSxHQUFHO0lBQ3BCLDZDQUE2QztNQUMzQ0MsSUFBSSxFQUFFO1FBQ0pDLE9BQU8sRUFBRSxlQURMO1FBRUpDLGFBQWEsRUFBRTtVQUNiQyxRQUFRLEVBQUUsQ0FBQyxNQUFELEVBQVMsWUFBVCxFQUF1QixhQUF2QixDQURHO1VBRWJDLFFBQVEsRUFBRSxDQUFDLFNBQUQ7UUFGRyxDQUZYO1FBTUpDLFVBQVUsRUFBRTtNQU5SO0lBRHFDO0VBRHpCLENBQUg7O0VBYUEsTUFBYkMsYUFBYSxDQUFDQyxJQUFELEVBQU9DLE1BQVAsRUFBZSxHQUFHckIsSUFBbEIsRUFBd0I7SUFDekMsT0FBTyxNQUFNLElBQUFtQixzQkFBQSxFQUFjLEdBQUduQixJQUFqQixDQUFiO0VBQ0Q7O0VBRWdCLE1BQVhzQixXQUFXLENBQUNGLElBQUQsRUFBT0MsTUFBUCxFQUFlLEdBQUdyQixJQUFsQixFQUF3QjtJQUN2QyxPQUFPLE1BQU0sS0FBS3VCLEtBQUwsQ0FBVyxLQUFYLEVBQWtCSCxJQUFsQixFQUF3QkMsTUFBeEIsRUFBZ0MsR0FBR3JCLElBQW5DLENBQWI7RUFDRDs7RUFFaUIsTUFBWndCLFlBQVksQ0FBQ0osSUFBRCxFQUFPQyxNQUFQLEVBQWUsR0FBR3JCLElBQWxCLEVBQXdCO0lBQ3hDLE9BQU8sTUFBTSxLQUFLdUIsS0FBTCxDQUFXLElBQVgsRUFBaUJILElBQWpCLEVBQXVCQyxNQUF2QixFQUErQixHQUFHckIsSUFBbEMsQ0FBYjtFQUNEOztFQUVVLE1BQUx1QixLQUFLLENBQUNFLFFBQUQsRUFBV0wsSUFBWCxFQUFpQkMsTUFBakIsRUFBeUIsR0FBR3JCLElBQTVCLEVBQWtDO0lBQzNDLE1BQU0sQ0FBQzBCLFFBQUQsRUFBV0MsUUFBWCxJQUF1QjNCLElBQTdCOztJQUdBLElBQUkwQixRQUFRLEtBQUs1QixjQUFqQixFQUFpQztNQUMvQixPQUFPLE1BQU1zQixJQUFJLEVBQWpCO0lBQ0Q7O0lBRUQsS0FBS1YsTUFBTCxDQUFZa0IsU0FBWixDQUFzQlAsTUFBdEI7SUFDQSxPQUFPLE1BQU0sS0FBS1gsTUFBTCxDQUFZbUIsV0FBWixDQUF3QkYsUUFBeEIsRUFBa0M7TUFBQ0Y7SUFBRCxDQUFsQyxDQUFiO0VBQ0Q7O0VBRVcsTUFBTkssTUFBTSxDQUFDVixJQUFELEVBQU9DLE1BQVAsRUFBZVUsT0FBZixFQUF3QixHQUFHL0IsSUFBM0IsRUFBaUM7SUFHM0MsTUFBTWdDLE9BQU8sR0FBR2pDLGdCQUFnQixDQUFDQyxJQUFELENBQWhDOztJQUNBLElBQUlnQyxPQUFKLEVBQWE7TUFDWCxJQUFJLENBQUMsS0FBS3RCLE1BQUwsQ0FBWXVCLFVBQVosQ0FBdUJDLEdBQXZCLENBQTJCRixPQUEzQixDQUFMLEVBQTBDO1FBQ3hDLE1BQU0sSUFBSUcsY0FBQSxDQUFPQyxrQkFBWCxFQUFOO01BQ0Q7O01BQ0QsTUFBTUMsS0FBSyxHQUFHLEtBQUszQixNQUFMLENBQVl1QixVQUFaLENBQXVCSyxHQUF2QixDQUEyQk4sT0FBM0IsQ0FBZDtNQUNBLE9BQU8sTUFBTU8sMEJBQUEsQ0FBYUMsT0FBYixDQUFxQm5CLE1BQXJCLEVBQTZCZ0IsS0FBN0IsRUFBb0NOLE9BQXBDLEVBQTZDLEdBQUcvQixJQUFoRCxDQUFiO0lBQ0Q7O0lBR0QsT0FBTyxNQUFNb0IsSUFBSSxFQUFqQjtFQUNEOztBQTFEd0QifQ==
62
+ exports.default = ImageElementPlugin;
63
+ exports.ImageElementPlugin = ImageElementPlugin;
64
+ // this plugin supports a non-standard 'compare images' command
65
+ ImageElementPlugin.newMethodMap = ({
66
+ '/session/:sessionId/appium/compare_images': {
67
+ POST: {
68
+ command: 'compareImages',
69
+ payloadParams: {
70
+ required: ['mode', 'firstImage', 'secondImage'],
71
+ optional: ['options'],
72
+ },
73
+ neverProxy: true,
74
+ },
75
+ },
76
+ });
77
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../lib/plugin.js"],"names":[],"mappings":"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"}