@appium/images-plugin 1.3.7 → 2.0.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.
@@ -1 +1 @@
1
- {"version":3,"file":"finder.js","names":["MJSONWP_ELEMENT_KEY","W3C_ELEMENT_KEY","util","W3C_WEB_ELEMENT_IDENTIFIER","DEFAULT_FIX_IMAGE_TEMPLATE_SCALE","FLOAT_PRECISION","MAX_CACHE_ITEMS","MAX_CACHE_SIZE_BYTES","DEFAULT_SETTINGS","imageMatchThreshold","DEFAULT_MATCH_THRESHOLD","imageMatchMethod","fixImageFindScreenshotDims","fixImageTemplateSize","fixImageTemplateScale","defaultImageTemplateScale","DEFAULT_TEMPLATE_IMAGE_SCALE","checkForImageElementStaleness","autoUpdateImageElementPosition","imageElementTapStrategy","IMAGE_EL_TAP_STRATEGY_W3C","getMatchedImageResult","ImageElementFinder","driver","imgElCache","constructor","maxSize","LRU","max","sizeCalculation","el","template","length","setDriver","registerImageElement","imgEl","set","id","protoKey","isW3CProtocol","asElement","findByImage","b64Template","shouldCheckStaleness","multiple","ignoreDefaultImageTemplateScale","Error","settings","getSettings","threshold","visualize","log","info","getWindowSize","width","screenWidth","height","screenHeight","ensureTemplateSize","results","condition","b64Screenshot","scale","getScreenshotForImageFind","comparisonOpts","method","push","compareImages","MATCH_TEMPLATE_MODE","err","message","match","implicitWaitForCondition","_","isEmpty","errors","NoSuchElementError","elements","map","rect","score","visualization","JSON","stringify","ImageElement","registeredElements","imgObj","imageUtil","getJimpImage","tplWidth","tplHeight","bitmap","scaleToFit","getBuffer","MIME_PNG","toString","getScreenshot","Object","assign","warn","shotWidth","shotHeight","xScale","yScale","screenAR","shotAR","Math","round","scaleFactor","resize","opts","parseFloat","String","Number","imgTempObj","baseTempWidth","baseTempHeigh","scaledWidth","scaledHeight"],"sources":["../../lib/finder.js"],"sourcesContent":["import _ from 'lodash';\nimport LRU from 'lru-cache';\nimport {errors} from 'appium/driver';\nimport {util, imageUtil} from 'appium/support';\nimport {\n ImageElement,\n DEFAULT_TEMPLATE_IMAGE_SCALE,\n IMAGE_EL_TAP_STRATEGY_W3C,\n} from './image-element';\nimport {MATCH_TEMPLATE_MODE, compareImages, DEFAULT_MATCH_THRESHOLD} from './compare';\nimport log from './logger';\n\nconst MJSONWP_ELEMENT_KEY = 'ELEMENT';\nconst W3C_ELEMENT_KEY = util.W3C_WEB_ELEMENT_IDENTIFIER;\nconst DEFAULT_FIX_IMAGE_TEMPLATE_SCALE = 1;\n// Used to compare ratio and screen width\n// Pixel is basically under 1080 for example. 100K is probably enough fo a while.\nconst FLOAT_PRECISION = 100000;\nconst MAX_CACHE_ITEMS = 100;\nconst MAX_CACHE_SIZE_BYTES = 1024 * 1024 * 40; // 40mb\n\nconst DEFAULT_SETTINGS = {\n // value between 0 and 1 representing match strength, below which an image\n // element will not be found\n imageMatchThreshold: DEFAULT_MATCH_THRESHOLD,\n\n // One of possible image matching methods.\n // Read https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html\n // for more details.\n // TM_CCOEFF_NORMED by default\n imageMatchMethod: '',\n\n // if the image returned by getScreenshot differs in size or aspect ratio\n // from the screen, attempt to fix it automatically\n fixImageFindScreenshotDims: true,\n\n // whether Appium should ensure that an image template sent in during image\n // element find should have its size adjusted so the match algorithm will not\n // complain\n fixImageTemplateSize: false,\n\n // whether Appium should ensure that an image template sent in during image\n // element find should have its scale adjusted to display size so the match\n // algorithm will not complain.\n // e.g. iOS has `width=375, height=667` window rect, but its screenshot is\n // `width=750 × height=1334` pixels. This setting help to adjust the scale\n // if a user use `width=750 × height=1334` pixels's base template image.\n fixImageTemplateScale: false,\n\n // Users might have scaled template image to reduce their storage size.\n // This setting allows users to scale a template image they send to Appium server\n // so that the Appium server compares the actual scale users originally had.\n // e.g. If a user has an image of 270 x 32 pixels which was originally 1080 x 126 pixels,\n // the user can set {defaultImageTemplateScale: 4.0} to scale the small image\n // to the original one so that Appium can compare it as the original one.\n defaultImageTemplateScale: DEFAULT_TEMPLATE_IMAGE_SCALE,\n\n // whether Appium should re-check that an image element can be matched\n // against the current screenshot before clicking it\n checkForImageElementStaleness: true,\n\n // whether before clicking on an image element Appium should re-determine the\n // position of the element on screen\n autoUpdateImageElementPosition: false,\n\n // which method to use for tapping by coordinate for image elements. the\n // options are 'w3c' or 'mjsonwp'\n imageElementTapStrategy: IMAGE_EL_TAP_STRATEGY_W3C,\n\n // which method to use to save the matched image area in ImageElement class.\n // It is used for debugging purpose.\n getMatchedImageResult: false,\n};\n\nexport default class ImageElementFinder {\n /** @type {ExternalDriver} */\n driver;\n\n /** @type {LRU<string,ImageElement>} */\n imgElCache;\n\n /**\n *\n * @param {ExternalDriver} driver\n * @param {number} [maxSize]\n */\n constructor(driver, maxSize = MAX_CACHE_SIZE_BYTES) {\n this.driver = driver;\n this.imgElCache = new LRU({\n max: MAX_CACHE_ITEMS,\n maxSize,\n sizeCalculation: (el) => el.template.length,\n });\n }\n\n setDriver(driver) {\n this.driver = driver;\n }\n\n /**\n * @param {ImageElement} imgEl\n * @returns {Element}\n */\n registerImageElement(imgEl) {\n this.imgElCache.set(imgEl.id, imgEl);\n const protoKey = this.driver.isW3CProtocol() ? W3C_ELEMENT_KEY : MJSONWP_ELEMENT_KEY;\n return imgEl.asElement(protoKey);\n }\n\n /**\n * @typedef FindByImageOptions\n * @property {boolean} [shouldCheckStaleness=false] - whether this call to find an\n * image is merely to check staleness. If so we can bypass a lot of logic\n * @property {boolean} [multiple=false] - Whether we are finding one element or\n * multiple\n * @property {boolean} [ignoreDefaultImageTemplateScale=false] - Whether we\n * ignore defaultImageTemplateScale. It can be used when you would like to\n * scale b64Template with defaultImageTemplateScale setting.\n */\n\n /**\n * Find a screen rect represented by an ImageElement corresponding to an image\n * template sent in by the client\n *\n * @param {string} b64Template - base64-encoded image used as a template to be\n * matched in the screenshot\n * @param {FindByImageOptions} opts - additional options\n *\n * @returns {Promise<Element|Element[]|ImageElement>} - WebDriver element with a special id prefix\n */\n async findByImage(\n b64Template,\n {shouldCheckStaleness = false, multiple = false, ignoreDefaultImageTemplateScale = false}\n ) {\n if (!this.driver) {\n throw new Error(`Can't find without a driver!`);\n }\n const settings = {...DEFAULT_SETTINGS, ...this.driver.settings.getSettings()};\n const {\n imageMatchThreshold: threshold,\n imageMatchMethod,\n fixImageTemplateSize,\n fixImageTemplateScale,\n defaultImageTemplateScale,\n getMatchedImageResult: visualize,\n } = settings;\n\n log.info(`Finding image element with match threshold ${threshold}`);\n if (!this.driver.getWindowSize) {\n throw new Error(\"This driver does not support the required 'getWindowSize' command\");\n }\n const {width: screenWidth, height: screenHeight} = await this.driver.getWindowSize();\n\n // someone might have sent in a template that's larger than the screen\n // dimensions. If so let's check and cut it down to size since the algorithm\n // will not work unless we do. But because it requires some potentially\n // expensive commands, only do this if the user has requested it in settings.\n if (fixImageTemplateSize) {\n b64Template = await this.ensureTemplateSize(b64Template, screenWidth, screenHeight);\n }\n\n const results = [];\n const condition = async () => {\n try {\n const {b64Screenshot, scale} = await this.getScreenshotForImageFind(\n screenWidth,\n screenHeight\n );\n\n b64Template = await this.fixImageTemplateScale(b64Template, {\n defaultImageTemplateScale,\n ignoreDefaultImageTemplateScale,\n fixImageTemplateScale,\n ...scale,\n });\n\n const comparisonOpts = {\n threshold,\n visualize,\n multiple,\n };\n if (imageMatchMethod) {\n comparisonOpts.method = imageMatchMethod;\n }\n if (multiple) {\n results.push(\n ...(await compareImages(\n MATCH_TEMPLATE_MODE,\n b64Screenshot,\n b64Template,\n comparisonOpts\n ))\n );\n } else {\n results.push(\n await compareImages(MATCH_TEMPLATE_MODE, b64Screenshot, b64Template, comparisonOpts)\n );\n }\n return true;\n } catch (err) {\n // if compareImages fails, we'll get a specific error, but we should\n // retry, so trap that and just return false to trigger the next round of\n // implicitly waiting. For other errors, throw them to get out of the\n // implicit wait loop\n if (err.message.match(/Cannot find any occurrences/)) {\n return false;\n }\n throw err;\n }\n };\n\n try {\n await this.driver.implicitWaitForCondition(condition);\n } catch (err) {\n // this `implicitWaitForCondition` method will throw a 'Condition unmet'\n // error if an element is not found eventually. In that case, we will\n // handle the element not found response below. In the case where get some\n // _other_ kind of error, it means something blew up totally apart from the\n // implicit wait timeout. We should not mask that error and instead throw\n // it straightaway\n if (!err.message.match(/Condition unmet/)) {\n throw err;\n }\n }\n\n if (_.isEmpty(results)) {\n if (multiple) {\n return [];\n }\n throw new errors.NoSuchElementError();\n }\n\n const elements = results.map(({rect, score, visualization}) => {\n log.info(`Image template matched: ${JSON.stringify(rect)}`);\n return new ImageElement(b64Template, rect, score, visualization, this);\n });\n\n // if we're just checking staleness, return straightaway so we don't add\n // a new element to the cache. shouldCheckStaleness does not support multiple\n // elements, since it is a purely internal mechanism\n if (shouldCheckStaleness) {\n return elements[0];\n }\n\n const registeredElements = elements.map((imgEl) => this.registerImageElement(imgEl));\n\n return multiple ? registeredElements : registeredElements[0];\n }\n\n /**\n * Ensure that the image template sent in for a find is of a suitable size\n *\n * @param {string} b64Template - base64-encoded image\n * @param {number} screenWidth - width of screen\n * @param {number} screenHeight - height of screen\n *\n * @returns {Promise<string>} base64-encoded image, potentially resized\n */\n async ensureTemplateSize(b64Template, screenWidth, screenHeight) {\n let imgObj = await imageUtil.getJimpImage(b64Template);\n let {width: tplWidth, height: tplHeight} = imgObj.bitmap;\n\n log.info(\n `Template image is ${tplWidth}x${tplHeight}. Screen size is ${screenWidth}x${screenHeight}`\n );\n // if the template fits inside the screen dimensions, we're good\n if (tplWidth <= screenWidth && tplHeight <= screenHeight) {\n return b64Template;\n }\n\n log.info(\n `Scaling template image from ${tplWidth}x${tplHeight} to match ` +\n `screen at ${screenWidth}x${screenHeight}`\n );\n // otherwise, scale it to fit inside the screen dimensions\n imgObj = imgObj.scaleToFit(screenWidth, screenHeight);\n return (await imgObj.getBuffer(imageUtil.MIME_PNG)).toString('base64');\n }\n\n /**\n * Get the screenshot image that will be used for find by element, potentially\n * altering it in various ways based on user-requested settings\n *\n * @param {number} screenWidth - width of screen\n * @param {number} screenHeight - height of screen\n *\n * @returns {Promise<Screenshot & {scale?: ScreenshotScale}>} base64-encoded screenshot and ScreenshotScale\n */\n async getScreenshotForImageFind(screenWidth, screenHeight) {\n if (!this.driver.getScreenshot) {\n throw new Error(\"This driver does not support the required 'getScreenshot' command\");\n }\n const settings = Object.assign({}, DEFAULT_SETTINGS, this.driver.settings.getSettings());\n const {fixImageFindScreenshotDims} = settings;\n\n let b64Screenshot = await this.driver.getScreenshot();\n\n // if the user has requested not to correct for aspect or size differences\n // between the screenshot and the screen, just return the screenshot now\n if (!fixImageFindScreenshotDims) {\n log.info(`Not verifying screenshot dimensions match screen`);\n return {b64Screenshot};\n }\n\n if (screenWidth < 1 || screenHeight < 1) {\n log.warn(\n `The retrieved screen size ${screenWidth}x${screenHeight} does ` +\n `not seem to be valid. No changes will be applied to the screenshot`\n );\n return {b64Screenshot};\n }\n\n // otherwise, do some verification on the screenshot to make sure it matches\n // the screen size and aspect ratio\n log.info('Verifying screenshot size and aspect ratio');\n\n let imgObj = await imageUtil.getJimpImage(b64Screenshot);\n let {width: shotWidth, height: shotHeight} = imgObj.bitmap;\n\n if (shotWidth < 1 || shotHeight < 1) {\n log.warn(\n `The retrieved screenshot size ${shotWidth}x${shotHeight} does ` +\n `not seem to be valid. No changes will be applied to the screenshot`\n );\n return {b64Screenshot};\n }\n\n if (screenWidth === shotWidth && screenHeight === shotHeight) {\n // the height and width of the screenshot and the device screen match, which\n // means we should be safe when doing template matches\n log.info('Screenshot size matched screen size');\n return {b64Screenshot};\n }\n\n // otherwise, if they don't match, it could spell problems for the accuracy\n // of coordinates returned by the image match algorithm, since we match based\n // on the screenshot coordinates not the device coordinates themselves. There\n // are two potential types of mismatch: aspect ratio mismatch and scale\n // mismatch. We need to detect and fix both\n\n const scale = {xScale: 1.0, yScale: 1.0};\n\n const screenAR = screenWidth / screenHeight;\n const shotAR = shotWidth / shotHeight;\n if (Math.round(screenAR * FLOAT_PRECISION) === Math.round(shotAR * FLOAT_PRECISION)) {\n log.info(\n `Screenshot aspect ratio '${shotAR}' (${shotWidth}x${shotHeight}) matched ` +\n `screen aspect ratio '${screenAR}' (${screenWidth}x${screenHeight})`\n );\n } else {\n log.warn(\n `When trying to find an element, determined that the screen ` +\n `aspect ratio and screenshot aspect ratio are different. Screen ` +\n `is ${screenWidth}x${screenHeight} whereas screenshot is ` +\n `${shotWidth}x${shotHeight}.`\n );\n\n // In the case where the x-scale and y-scale are different, we need to decide\n // which one to respect, otherwise the screenshot and template will end up\n // being resized in a way that changes its aspect ratio (distorts it). For example, let's say:\n // this.getScreenshot(shotWidth, shotHeight) is 540x397,\n // this.getDeviceSize(screenWidth, screenHeight) is 1080x1920.\n // The ratio would then be {xScale: 0.5, yScale: 0.2}.\n // In this case, we must should `yScale: 0.2` as scaleFactor, because\n // if we select the xScale, the height will be bigger than real screenshot size\n // which is used to image comparison by OpenCV as a base image.\n // All of this is primarily useful when the screenshot is a horizontal slice taken out of the\n // screen (for example not including top/bottom nav bars)\n const xScale = (1.0 * shotWidth) / screenWidth;\n const yScale = (1.0 * shotHeight) / screenHeight;\n const scaleFactor = xScale >= yScale ? yScale : xScale;\n\n log.warn(\n `Resizing screenshot to ${shotWidth * scaleFactor}x${shotHeight * scaleFactor} to match ` +\n `screen aspect ratio so that image element coordinates have a ` +\n `greater chance of being correct.`\n );\n imgObj = imgObj.resize(shotWidth * scaleFactor, shotHeight * scaleFactor);\n\n scale.xScale *= scaleFactor;\n scale.yScale *= scaleFactor;\n\n shotWidth = imgObj.bitmap.width;\n shotHeight = imgObj.bitmap.height;\n }\n\n // Resize based on the screen dimensions only if both width and height are mismatched\n // since except for that, it might be a situation which is different window rect and\n // screenshot size like `@driver.window_rect #=>x=0, y=0, width=1080, height=1794` and\n // `\"deviceScreenSize\"=>\"1080x1920\"`\n if (screenWidth !== shotWidth && screenHeight !== shotHeight) {\n log.info(\n `Scaling screenshot from ${shotWidth}x${shotHeight} to match ` +\n `screen at ${screenWidth}x${screenHeight}`\n );\n imgObj = imgObj.resize(screenWidth, screenHeight);\n\n scale.xScale *= (1.0 * screenWidth) / shotWidth;\n scale.yScale *= (1.0 * screenHeight) / shotHeight;\n }\n\n b64Screenshot = (await imgObj.getBuffer(imageUtil.MIME_PNG)).toString('base64');\n return {b64Screenshot, scale};\n }\n\n /**\n * @typedef ImageTemplateSettings\n * @property {boolean} fixImageTemplateScale - fixImageTemplateScale in device-settings\n * @property {number} defaultImageTemplateScale - defaultImageTemplateScale in device-settings\n * @property {boolean} ignoreDefaultImageTemplateScale - Ignore defaultImageTemplateScale if it has true.\n * If b64Template has been scaled to defaultImageTemplateScale or should ignore the scale,\n * this parameter should be true. e.g. click in image-element module\n * @property {number} xScale - Scale ratio for width\n * @property {number} yScale - Scale ratio for height\n\n */\n /**\n * Get a image that will be used for template maching.\n * Returns scaled image if scale ratio is provided.\n *\n *\n * @param {string} b64Template - base64-encoded image used as a template to be\n * matched in the screenshot\n * @param {ImageTemplateSettings} opts - Image template scale related options\n *\n * @returns {Promise<string>} base64-encoded scaled template screenshot\n */\n async fixImageTemplateScale(b64Template, opts) {\n if (!opts) {\n return b64Template;\n }\n\n let {\n fixImageTemplateScale = false,\n defaultImageTemplateScale = DEFAULT_TEMPLATE_IMAGE_SCALE,\n ignoreDefaultImageTemplateScale = false,\n xScale = DEFAULT_FIX_IMAGE_TEMPLATE_SCALE,\n yScale = DEFAULT_FIX_IMAGE_TEMPLATE_SCALE,\n } = opts;\n\n if (ignoreDefaultImageTemplateScale) {\n defaultImageTemplateScale = DEFAULT_TEMPLATE_IMAGE_SCALE;\n }\n\n // Default\n if (defaultImageTemplateScale === DEFAULT_TEMPLATE_IMAGE_SCALE && !fixImageTemplateScale) {\n return b64Template;\n }\n\n // Calculate xScale and yScale Appium should scale\n if (fixImageTemplateScale) {\n xScale *= defaultImageTemplateScale;\n yScale *= defaultImageTemplateScale;\n } else {\n xScale = yScale = 1 * defaultImageTemplateScale;\n }\n\n // xScale and yScale can be NaN if defaultImageTemplateScale is string, for example\n if (!parseFloat(String(xScale)) || !parseFloat(String(yScale))) {\n return b64Template;\n }\n\n // Return if the scale is default, 1, value\n if (\n Math.round(xScale * FLOAT_PRECISION) ===\n Math.round(DEFAULT_FIX_IMAGE_TEMPLATE_SCALE * FLOAT_PRECISION) &&\n Math.round(\n Number(\n yScale * FLOAT_PRECISION ===\n Math.round(DEFAULT_FIX_IMAGE_TEMPLATE_SCALE * FLOAT_PRECISION)\n )\n )\n ) {\n return b64Template;\n }\n\n let imgTempObj = await imageUtil.getJimpImage(b64Template);\n let {width: baseTempWidth, height: baseTempHeigh} = imgTempObj.bitmap;\n\n const scaledWidth = baseTempWidth * xScale;\n const scaledHeight = baseTempHeigh * yScale;\n log.info(\n `Scaling template image from ${baseTempWidth}x${baseTempHeigh}` +\n ` to ${scaledWidth}x${scaledHeight}`\n );\n log.info(`The ratio is ${xScale} and ${yScale}`);\n imgTempObj = await imgTempObj.resize(scaledWidth, scaledHeight);\n return (await imgTempObj.getBuffer(imageUtil.MIME_PNG)).toString('base64');\n }\n}\n\nexport {W3C_ELEMENT_KEY, MJSONWP_ELEMENT_KEY, DEFAULT_SETTINGS, DEFAULT_FIX_IMAGE_TEMPLATE_SCALE};\n\n/**\n * @typedef {import('@appium/types').ExternalDriver} ExternalDriver\n * @typedef {import('@appium/types').Element} Element\n */\n\n/**\n * @typedef Screenshot\n * @property {string} b64Screenshot - base64 based screenshot string\n */\n\n/**\n * @typedef ScreenshotScale\n * @property {number} xScale - Scale ratio for width\n * @property {number} yScale - Scale ratio for height\n */\n"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAKA;;AACA;;;;AAEA,MAAMA,mBAAmB,GAAG,SAA5B;;AACA,MAAMC,eAAe,GAAGC,aAAA,CAAKC,0BAA7B;;AACA,MAAMC,gCAAgC,GAAG,CAAzC;;AAGA,MAAMC,eAAe,GAAG,MAAxB;AACA,MAAMC,eAAe,GAAG,GAAxB;AACA,MAAMC,oBAAoB,GAAG,OAAO,IAAP,GAAc,EAA3C;AAEA,MAAMC,gBAAgB,GAAG;EAGvBC,mBAAmB,EAAEC,gCAHE;EASvBC,gBAAgB,EAAE,EATK;EAavBC,0BAA0B,EAAE,IAbL;EAkBvBC,oBAAoB,EAAE,KAlBC;EA0BvBC,qBAAqB,EAAE,KA1BA;EAkCvBC,yBAAyB,EAAEC,0CAlCJ;EAsCvBC,6BAA6B,EAAE,IAtCR;EA0CvBC,8BAA8B,EAAE,KA1CT;EA8CvBC,uBAAuB,EAAEC,uCA9CF;EAkDvBC,qBAAqB,EAAE;AAlDA,CAAzB;;;AAqDe,MAAMC,kBAAN,CAAyB;EAEtCC,MAAM;EAGNC,UAAU;;EAOVC,WAAW,CAACF,MAAD,EAASG,OAAO,GAAGnB,oBAAnB,EAAyC;IAClD,KAAKgB,MAAL,GAAcA,MAAd;IACA,KAAKC,UAAL,GAAkB,IAAIG,iBAAJ,CAAQ;MACxBC,GAAG,EAAEtB,eADmB;MAExBoB,OAFwB;MAGxBG,eAAe,EAAGC,EAAD,IAAQA,EAAE,CAACC,QAAH,CAAYC;IAHb,CAAR,CAAlB;EAKD;;EAEDC,SAAS,CAACV,MAAD,EAAS;IAChB,KAAKA,MAAL,GAAcA,MAAd;EACD;;EAMDW,oBAAoB,CAACC,KAAD,EAAQ;IAC1B,KAAKX,UAAL,CAAgBY,GAAhB,CAAoBD,KAAK,CAACE,EAA1B,EAA8BF,KAA9B;IACA,MAAMG,QAAQ,GAAG,KAAKf,MAAL,CAAYgB,aAAZ,KAA8BtC,eAA9B,GAAgDD,mBAAjE;IACA,OAAOmC,KAAK,CAACK,SAAN,CAAgBF,QAAhB,CAAP;EACD;;EAuBgB,MAAXG,WAAW,CACfC,WADe,EAEf;IAACC,oBAAoB,GAAG,KAAxB;IAA+BC,QAAQ,GAAG,KAA1C;IAAiDC,+BAA+B,GAAG;EAAnF,CAFe,EAGf;IACA,IAAI,CAAC,KAAKtB,MAAV,EAAkB;MAChB,MAAM,IAAIuB,KAAJ,CAAW,8BAAX,CAAN;IACD;;IACD,MAAMC,QAAQ,GAAG,EAAC,GAAGvC,gBAAJ;MAAsB,GAAG,KAAKe,MAAL,CAAYwB,QAAZ,CAAqBC,WAArB;IAAzB,CAAjB;IACA,MAAM;MACJvC,mBAAmB,EAAEwC,SADjB;MAEJtC,gBAFI;MAGJE,oBAHI;MAIJC,qBAJI;MAKJC,yBALI;MAMJM,qBAAqB,EAAE6B;IANnB,IAOFH,QAPJ;;IASAI,eAAA,CAAIC,IAAJ,CAAU,8CAA6CH,SAAU,EAAjE;;IACA,IAAI,CAAC,KAAK1B,MAAL,CAAY8B,aAAjB,EAAgC;MAC9B,MAAM,IAAIP,KAAJ,CAAU,mEAAV,CAAN;IACD;;IACD,MAAM;MAACQ,KAAK,EAAEC,WAAR;MAAqBC,MAAM,EAAEC;IAA7B,IAA6C,MAAM,KAAKlC,MAAL,CAAY8B,aAAZ,EAAzD;;IAMA,IAAIxC,oBAAJ,EAA0B;MACxB6B,WAAW,GAAG,MAAM,KAAKgB,kBAAL,CAAwBhB,WAAxB,EAAqCa,WAArC,EAAkDE,YAAlD,CAApB;IACD;;IAED,MAAME,OAAO,GAAG,EAAhB;;IACA,MAAMC,SAAS,GAAG,YAAY;MAC5B,IAAI;QACF,MAAM;UAACC,aAAD;UAAgBC;QAAhB,IAAyB,MAAM,KAAKC,yBAAL,CACnCR,WADmC,EAEnCE,YAFmC,CAArC;QAKAf,WAAW,GAAG,MAAM,KAAK5B,qBAAL,CAA2B4B,WAA3B,EAAwC;UAC1D3B,yBAD0D;UAE1D8B,+BAF0D;UAG1D/B,qBAH0D;UAI1D,GAAGgD;QAJuD,CAAxC,CAApB;QAOA,MAAME,cAAc,GAAG;UACrBf,SADqB;UAErBC,SAFqB;UAGrBN;QAHqB,CAAvB;;QAKA,IAAIjC,gBAAJ,EAAsB;UACpBqD,cAAc,CAACC,MAAf,GAAwBtD,gBAAxB;QACD;;QACD,IAAIiC,QAAJ,EAAc;UACZe,OAAO,CAACO,IAAR,CACE,IAAI,MAAM,IAAAC,sBAAA,EACRC,4BADQ,EAERP,aAFQ,EAGRnB,WAHQ,EAIRsB,cAJQ,CAAV,CADF;QAQD,CATD,MASO;UACLL,OAAO,CAACO,IAAR,CACE,MAAM,IAAAC,sBAAA,EAAcC,4BAAd,EAAmCP,aAAnC,EAAkDnB,WAAlD,EAA+DsB,cAA/D,CADR;QAGD;;QACD,OAAO,IAAP;MACD,CApCD,CAoCE,OAAOK,GAAP,EAAY;QAKZ,IAAIA,GAAG,CAACC,OAAJ,CAAYC,KAAZ,CAAkB,6BAAlB,CAAJ,EAAsD;UACpD,OAAO,KAAP;QACD;;QACD,MAAMF,GAAN;MACD;IACF,CA/CD;;IAiDA,IAAI;MACF,MAAM,KAAK9C,MAAL,CAAYiD,wBAAZ,CAAqCZ,SAArC,CAAN;IACD,CAFD,CAEE,OAAOS,GAAP,EAAY;MAOZ,IAAI,CAACA,GAAG,CAACC,OAAJ,CAAYC,KAAZ,CAAkB,iBAAlB,CAAL,EAA2C;QACzC,MAAMF,GAAN;MACD;IACF;;IAED,IAAII,eAAA,CAAEC,OAAF,CAAUf,OAAV,CAAJ,EAAwB;MACtB,IAAIf,QAAJ,EAAc;QACZ,OAAO,EAAP;MACD;;MACD,MAAM,IAAI+B,cAAA,CAAOC,kBAAX,EAAN;IACD;;IAED,MAAMC,QAAQ,GAAGlB,OAAO,CAACmB,GAAR,CAAY,CAAC;MAACC,IAAD;MAAOC,KAAP;MAAcC;IAAd,CAAD,KAAkC;MAC7D9B,eAAA,CAAIC,IAAJ,CAAU,2BAA0B8B,IAAI,CAACC,SAAL,CAAeJ,IAAf,CAAqB,EAAzD;;MACA,OAAO,IAAIK,0BAAJ,CAAiB1C,WAAjB,EAA8BqC,IAA9B,EAAoCC,KAApC,EAA2CC,aAA3C,EAA0D,IAA1D,CAAP;IACD,CAHgB,CAAjB;;IAQA,IAAItC,oBAAJ,EAA0B;MACxB,OAAOkC,QAAQ,CAAC,CAAD,CAAf;IACD;;IAED,MAAMQ,kBAAkB,GAAGR,QAAQ,CAACC,GAAT,CAAc3C,KAAD,IAAW,KAAKD,oBAAL,CAA0BC,KAA1B,CAAxB,CAA3B;IAEA,OAAOS,QAAQ,GAAGyC,kBAAH,GAAwBA,kBAAkB,CAAC,CAAD,CAAzD;EACD;;EAWuB,MAAlB3B,kBAAkB,CAAChB,WAAD,EAAca,WAAd,EAA2BE,YAA3B,EAAyC;IAC/D,IAAI6B,MAAM,GAAG,MAAMC,kBAAA,CAAUC,YAAV,CAAuB9C,WAAvB,CAAnB;IACA,IAAI;MAACY,KAAK,EAAEmC,QAAR;MAAkBjC,MAAM,EAAEkC;IAA1B,IAAuCJ,MAAM,CAACK,MAAlD;;IAEAxC,eAAA,CAAIC,IAAJ,CACG,qBAAoBqC,QAAS,IAAGC,SAAU,oBAAmBnC,WAAY,IAAGE,YAAa,EAD5F;;IAIA,IAAIgC,QAAQ,IAAIlC,WAAZ,IAA2BmC,SAAS,IAAIjC,YAA5C,EAA0D;MACxD,OAAOf,WAAP;IACD;;IAEDS,eAAA,CAAIC,IAAJ,CACG,+BAA8BqC,QAAS,IAAGC,SAAU,YAArD,GACG,aAAYnC,WAAY,IAAGE,YAAa,EAF7C;;IAKA6B,MAAM,GAAGA,MAAM,CAACM,UAAP,CAAkBrC,WAAlB,EAA+BE,YAA/B,CAAT;IACA,OAAO,CAAC,MAAM6B,MAAM,CAACO,SAAP,CAAiBN,kBAAA,CAAUO,QAA3B,CAAP,EAA6CC,QAA7C,CAAsD,QAAtD,CAAP;EACD;;EAW8B,MAAzBhC,yBAAyB,CAACR,WAAD,EAAcE,YAAd,EAA4B;IACzD,IAAI,CAAC,KAAKlC,MAAL,CAAYyE,aAAjB,EAAgC;MAC9B,MAAM,IAAIlD,KAAJ,CAAU,mEAAV,CAAN;IACD;;IACD,MAAMC,QAAQ,GAAGkD,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkB1F,gBAAlB,EAAoC,KAAKe,MAAL,CAAYwB,QAAZ,CAAqBC,WAArB,EAApC,CAAjB;IACA,MAAM;MAACpC;IAAD,IAA+BmC,QAArC;IAEA,IAAIc,aAAa,GAAG,MAAM,KAAKtC,MAAL,CAAYyE,aAAZ,EAA1B;;IAIA,IAAI,CAACpF,0BAAL,EAAiC;MAC/BuC,eAAA,CAAIC,IAAJ,CAAU,kDAAV;;MACA,OAAO;QAACS;MAAD,CAAP;IACD;;IAED,IAAIN,WAAW,GAAG,CAAd,IAAmBE,YAAY,GAAG,CAAtC,EAAyC;MACvCN,eAAA,CAAIgD,IAAJ,CACG,6BAA4B5C,WAAY,IAAGE,YAAa,QAAzD,GACG,oEAFL;;MAIA,OAAO;QAACI;MAAD,CAAP;IACD;;IAIDV,eAAA,CAAIC,IAAJ,CAAS,4CAAT;;IAEA,IAAIkC,MAAM,GAAG,MAAMC,kBAAA,CAAUC,YAAV,CAAuB3B,aAAvB,CAAnB;IACA,IAAI;MAACP,KAAK,EAAE8C,SAAR;MAAmB5C,MAAM,EAAE6C;IAA3B,IAAyCf,MAAM,CAACK,MAApD;;IAEA,IAAIS,SAAS,GAAG,CAAZ,IAAiBC,UAAU,GAAG,CAAlC,EAAqC;MACnClD,eAAA,CAAIgD,IAAJ,CACG,iCAAgCC,SAAU,IAAGC,UAAW,QAAzD,GACG,oEAFL;;MAIA,OAAO;QAACxC;MAAD,CAAP;IACD;;IAED,IAAIN,WAAW,KAAK6C,SAAhB,IAA6B3C,YAAY,KAAK4C,UAAlD,EAA8D;MAG5DlD,eAAA,CAAIC,IAAJ,CAAS,qCAAT;;MACA,OAAO;QAACS;MAAD,CAAP;IACD;;IAQD,MAAMC,KAAK,GAAG;MAACwC,MAAM,EAAE,GAAT;MAAcC,MAAM,EAAE;IAAtB,CAAd;IAEA,MAAMC,QAAQ,GAAGjD,WAAW,GAAGE,YAA/B;IACA,MAAMgD,MAAM,GAAGL,SAAS,GAAGC,UAA3B;;IACA,IAAIK,IAAI,CAACC,KAAL,CAAWH,QAAQ,GAAGnG,eAAtB,MAA2CqG,IAAI,CAACC,KAAL,CAAWF,MAAM,GAAGpG,eAApB,CAA/C,EAAqF;MACnF8C,eAAA,CAAIC,IAAJ,CACG,4BAA2BqD,MAAO,MAAKL,SAAU,IAAGC,UAAW,YAAhE,GACG,wBAAuBG,QAAS,MAAKjD,WAAY,IAAGE,YAAa,GAFtE;IAID,CALD,MAKO;MACLN,eAAA,CAAIgD,IAAJ,CACG,6DAAD,GACG,iEADH,GAEG,MAAK5C,WAAY,IAAGE,YAAa,yBAFpC,GAGG,GAAE2C,SAAU,IAAGC,UAAW,GAJ/B;;MAkBA,MAAMC,MAAM,GAAI,MAAMF,SAAP,GAAoB7C,WAAnC;MACA,MAAMgD,MAAM,GAAI,MAAMF,UAAP,GAAqB5C,YAApC;MACA,MAAMmD,WAAW,GAAGN,MAAM,IAAIC,MAAV,GAAmBA,MAAnB,GAA4BD,MAAhD;;MAEAnD,eAAA,CAAIgD,IAAJ,CACG,0BAAyBC,SAAS,GAAGQ,WAAY,IAAGP,UAAU,GAAGO,WAAY,YAA9E,GACG,+DADH,GAEG,kCAHL;;MAKAtB,MAAM,GAAGA,MAAM,CAACuB,MAAP,CAAcT,SAAS,GAAGQ,WAA1B,EAAuCP,UAAU,GAAGO,WAApD,CAAT;MAEA9C,KAAK,CAACwC,MAAN,IAAgBM,WAAhB;MACA9C,KAAK,CAACyC,MAAN,IAAgBK,WAAhB;MAEAR,SAAS,GAAGd,MAAM,CAACK,MAAP,CAAcrC,KAA1B;MACA+C,UAAU,GAAGf,MAAM,CAACK,MAAP,CAAcnC,MAA3B;IACD;;IAMD,IAAID,WAAW,KAAK6C,SAAhB,IAA6B3C,YAAY,KAAK4C,UAAlD,EAA8D;MAC5DlD,eAAA,CAAIC,IAAJ,CACG,2BAA0BgD,SAAU,IAAGC,UAAW,YAAnD,GACG,aAAY9C,WAAY,IAAGE,YAAa,EAF7C;;MAIA6B,MAAM,GAAGA,MAAM,CAACuB,MAAP,CAActD,WAAd,EAA2BE,YAA3B,CAAT;MAEAK,KAAK,CAACwC,MAAN,IAAiB,MAAM/C,WAAP,GAAsB6C,SAAtC;MACAtC,KAAK,CAACyC,MAAN,IAAiB,MAAM9C,YAAP,GAAuB4C,UAAvC;IACD;;IAEDxC,aAAa,GAAG,CAAC,MAAMyB,MAAM,CAACO,SAAP,CAAiBN,kBAAA,CAAUO,QAA3B,CAAP,EAA6CC,QAA7C,CAAsD,QAAtD,CAAhB;IACA,OAAO;MAAClC,aAAD;MAAgBC;IAAhB,CAAP;EACD;;EAwB0B,MAArBhD,qBAAqB,CAAC4B,WAAD,EAAcoE,IAAd,EAAoB;IAC7C,IAAI,CAACA,IAAL,EAAW;MACT,OAAOpE,WAAP;IACD;;IAED,IAAI;MACF5B,qBAAqB,GAAG,KADtB;MAEFC,yBAAyB,GAAGC,0CAF1B;MAGF6B,+BAA+B,GAAG,KAHhC;MAIFyD,MAAM,GAAGlG,gCAJP;MAKFmG,MAAM,GAAGnG;IALP,IAMA0G,IANJ;;IAQA,IAAIjE,+BAAJ,EAAqC;MACnC9B,yBAAyB,GAAGC,0CAA5B;IACD;;IAGD,IAAID,yBAAyB,KAAKC,0CAA9B,IAA8D,CAACF,qBAAnE,EAA0F;MACxF,OAAO4B,WAAP;IACD;;IAGD,IAAI5B,qBAAJ,EAA2B;MACzBwF,MAAM,IAAIvF,yBAAV;MACAwF,MAAM,IAAIxF,yBAAV;IACD,CAHD,MAGO;MACLuF,MAAM,GAAGC,MAAM,GAAG,IAAIxF,yBAAtB;IACD;;IAGD,IAAI,CAACgG,UAAU,CAACC,MAAM,CAACV,MAAD,CAAP,CAAX,IAA+B,CAACS,UAAU,CAACC,MAAM,CAACT,MAAD,CAAP,CAA9C,EAAgE;MAC9D,OAAO7D,WAAP;IACD;;IAGD,IACEgE,IAAI,CAACC,KAAL,CAAWL,MAAM,GAAGjG,eAApB,MACEqG,IAAI,CAACC,KAAL,CAAWvG,gCAAgC,GAAGC,eAA9C,CADF,IAEAqG,IAAI,CAACC,KAAL,CACEM,MAAM,CACJV,MAAM,GAAGlG,eAAT,KACEqG,IAAI,CAACC,KAAL,CAAWvG,gCAAgC,GAAGC,eAA9C,CAFE,CADR,CAHF,EASE;MACA,OAAOqC,WAAP;IACD;;IAED,IAAIwE,UAAU,GAAG,MAAM3B,kBAAA,CAAUC,YAAV,CAAuB9C,WAAvB,CAAvB;IACA,IAAI;MAACY,KAAK,EAAE6D,aAAR;MAAuB3D,MAAM,EAAE4D;IAA/B,IAAgDF,UAAU,CAACvB,MAA/D;IAEA,MAAM0B,WAAW,GAAGF,aAAa,GAAGb,MAApC;IACA,MAAMgB,YAAY,GAAGF,aAAa,GAAGb,MAArC;;IACApD,eAAA,CAAIC,IAAJ,CACG,+BAA8B+D,aAAc,IAAGC,aAAc,EAA9D,GACG,OAAMC,WAAY,IAAGC,YAAa,EAFvC;;IAIAnE,eAAA,CAAIC,IAAJ,CAAU,gBAAekD,MAAO,QAAOC,MAAO,EAA9C;;IACAW,UAAU,GAAG,MAAMA,UAAU,CAACL,MAAX,CAAkBQ,WAAlB,EAA+BC,YAA/B,CAAnB;IACA,OAAO,CAAC,MAAMJ,UAAU,CAACrB,SAAX,CAAqBN,kBAAA,CAAUO,QAA/B,CAAP,EAAiDC,QAAjD,CAA0D,QAA1D,CAAP;EACD;;AA9ZqC"}
1
+ {"version":3,"file":"finder.js","sourceRoot":"","sources":["../../lib/finder.js"],"names":[],"mappings":"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"}
@@ -1,24 +1,14 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = exports.ImageElement = exports.IMAGE_EL_TAP_STRATEGY_W3C = exports.IMAGE_EL_TAP_STRATEGY_MJSONWP = exports.IMAGE_ELEMENT_PREFIX = exports.DEFAULT_TEMPLATE_IMAGE_SCALE = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var _lodash = _interopRequireDefault(require("lodash"));
11
-
12
- var _driver = require("appium/driver");
13
-
14
- var _support = require("appium/support");
15
-
16
- var _logger = _interopRequireDefault(require("./logger"));
17
-
18
- var _finder = require("./finder");
19
-
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.IMAGE_ELEMENT_PREFIX = exports.DEFAULT_TEMPLATE_IMAGE_SCALE = exports.IMAGE_EL_TAP_STRATEGY_W3C = exports.IMAGE_EL_TAP_STRATEGY_MJSONWP = exports.ImageElement = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const driver_1 = require("appium/driver");
9
+ const support_1 = require("appium/support");
10
+ const logger_1 = __importDefault(require("./logger"));
11
+ const finder_1 = require("./finder");
22
12
  const IMAGE_ELEMENT_PREFIX = 'appium-image-element-';
23
13
  exports.IMAGE_ELEMENT_PREFIX = IMAGE_ELEMENT_PREFIX;
24
14
  const TAP_DURATION_MS = 125;
@@ -29,183 +19,216 @@ exports.IMAGE_EL_TAP_STRATEGY_MJSONWP = IMAGE_EL_TAP_STRATEGY_MJSONWP;
29
19
  const IMAGE_TAP_STRATEGIES = [IMAGE_EL_TAP_STRATEGY_MJSONWP, IMAGE_EL_TAP_STRATEGY_W3C];
30
20
  const DEFAULT_TEMPLATE_IMAGE_SCALE = 1.0;
31
21
  exports.DEFAULT_TEMPLATE_IMAGE_SCALE = DEFAULT_TEMPLATE_IMAGE_SCALE;
32
-
22
+ /**
23
+ * @typedef Dimension
24
+ * @property {number} width - width of rect
25
+ * @property {number} height - height of rect
26
+ */
27
+ /**
28
+ * @typedef Position
29
+ * @property {number} x - x coordinate
30
+ * @property {number} y - y coordinate
31
+ */
32
+ /**
33
+ * Representation of an "image element", which is simply a set of coordinates
34
+ * and methods that can be used on that set of coordinates via the driver
35
+ */
33
36
  class ImageElement {
34
- constructor(b64Template, rect, score, b64Result = null, finder = null) {
35
- this.template = b64Template;
36
- this.rect = rect;
37
- this.id = `${IMAGE_ELEMENT_PREFIX}${_support.util.uuidV4()}`;
38
- this.b64MatchedImage = b64Result;
39
- this.score = score;
40
- this.finder = finder;
41
- }
42
-
43
- get size() {
44
- return {
45
- width: this.rect.width,
46
- height: this.rect.height
47
- };
48
- }
49
-
50
- get location() {
51
- return {
52
- x: this.rect.x,
53
- y: this.rect.y
54
- };
55
- }
56
-
57
- get center() {
58
- return {
59
- x: this.rect.x + this.rect.width / 2,
60
- y: this.rect.y + this.rect.height / 2
61
- };
62
- }
63
-
64
- get matchedImage() {
65
- return this.b64MatchedImage;
66
- }
67
-
68
- asElement(protocolKey) {
69
- return {
70
- [protocolKey]: this.id
71
- };
72
- }
73
-
74
- equals(other) {
75
- return this.rect.x === other.rect.x && this.rect.y === other.rect.y && this.rect.width === other.rect.width && this.rect.height === other.rect.height;
76
- }
77
-
78
- async click(driver) {
79
- let newImgEl;
80
- const settings = Object.assign({}, _finder.DEFAULT_SETTINGS, driver.settings.getSettings());
81
- const {
82
- autoUpdateImageElementPosition: updatePos,
83
- checkForImageElementStaleness,
84
- imageElementTapStrategy
85
- } = settings;
86
-
87
- if (!IMAGE_TAP_STRATEGIES.includes(imageElementTapStrategy)) {
88
- throw new Error(`Incorrect imageElementTapStrategy setting ` + `'${imageElementTapStrategy}'. Must be one of ` + JSON.stringify(IMAGE_TAP_STRATEGIES));
37
+ /**
38
+ * @param {string} b64Template - the base64-encoded image which was used to
39
+ * find this ImageElement
40
+ * @param {Rect} rect - bounds of matched image element
41
+ * @param {number} score The similarity score as a float number in range [0.0, 1.0].
42
+ * 1.0 is the highest score (means both images are totally equal).
43
+ * @param {string?} b64Result - the base64-encoded image which has matched marks.
44
+ * Defaults to null.
45
+ * @param {import('./finder').default?} finder - the finder we can use to re-check stale elements
46
+ */
47
+ constructor(b64Template, rect, score, b64Result = null, finder = null) {
48
+ this.template = b64Template;
49
+ this.rect = rect;
50
+ this.id = `${IMAGE_ELEMENT_PREFIX}${support_1.util.uuidV4()}`;
51
+ this.b64MatchedImage = b64Result;
52
+ this.score = score;
53
+ this.finder = finder;
89
54
  }
90
-
91
- if (checkForImageElementStaleness || updatePos) {
92
- _logger.default.info('Checking image element for staleness before clicking');
93
-
94
- try {
95
- newImgEl = await this.finder.findByImage(this.template, {
96
- shouldCheckStaleness: true,
97
- ignoreDefaultImageTemplateScale: true
98
- });
99
- } catch (err) {
100
- throw new _driver.errors.StaleElementReferenceError();
101
- }
102
-
103
- if (!this.equals(newImgEl)) {
104
- _logger.default.warn(`When trying to click on an image element, the image changed ` + `position from where it was originally found. It is now at ` + `${JSON.stringify(newImgEl.rect)} and was originally at ` + `${JSON.stringify(this.rect)}.`);
105
-
106
- if (updatePos) {
107
- _logger.default.warn('Click will proceed at new coordinates');
108
-
109
- this.rect = _lodash.default.clone(newImgEl.rect);
110
- } else {
111
- _logger.default.warn('Click will take place at original coordinates. If you ' + 'would like Appium to automatically click the new ' + "coordinates, set the 'autoUpdateImageElementPosition' " + 'setting to true');
112
- }
113
- }
55
+ /**
56
+ * @returns {Dimension} - dimension of element
57
+ */
58
+ get size() {
59
+ return { width: this.rect.width, height: this.rect.height };
60
+ }
61
+ /**
62
+ * @returns {Position} - coordinates of top-left corner of element
63
+ */
64
+ get location() {
65
+ return { x: this.rect.x, y: this.rect.y };
66
+ }
67
+ /**
68
+ * @returns {Position} - coordinates of center of element
69
+ */
70
+ get center() {
71
+ return {
72
+ x: this.rect.x + this.rect.width / 2,
73
+ y: this.rect.y + this.rect.height / 2,
74
+ };
75
+ }
76
+ /**
77
+ * @returns {?string} - the base64-encoded image which has matched marks
78
+ */
79
+ get matchedImage() {
80
+ return this.b64MatchedImage;
81
+ }
82
+ /**
83
+ * @param {string} protocolKey - the protocol-specific JSON key for
84
+ * a WebElement
85
+ *
86
+ * @returns {Element} - this image element as a WebElement
87
+ */
88
+ asElement(protocolKey) {
89
+ return { [protocolKey]: this.id };
114
90
  }
115
-
116
- const {
117
- x,
118
- y
119
- } = this.center;
120
-
121
- _logger.default.info(`Will tap on image element at coordinate [${x}, ${y}]`);
122
-
123
- if (imageElementTapStrategy === IMAGE_EL_TAP_STRATEGY_W3C) {
124
- _logger.default.info('Will tap using W3C actions');
125
-
126
- const action = {
127
- type: 'pointer',
128
- id: 'mouse',
129
- parameters: {
130
- pointerType: 'touch'
131
- },
132
- actions: [{
133
- type: 'pointerMove',
134
- x,
135
- y,
136
- duration: 0
137
- }, {
138
- type: 'pointerDown',
139
- button: 0
140
- }, {
141
- type: 'pause',
142
- duration: TAP_DURATION_MS
143
- }, {
144
- type: 'pointerUp',
145
- button: 0
146
- }]
147
- };
148
-
149
- if (driver.performActions) {
150
- return await driver.performActions([action]);
151
- }
152
-
153
- _logger.default.warn('Driver does not seem to implement W3C actions, falling back ' + 'to TouchActions');
91
+ /**
92
+ * @param {ImageElement} other - an ImageElement to compare with this one
93
+ *
94
+ * @returns {boolean} - whether the other element and this one have the same
95
+ * properties
96
+ */
97
+ equals(other) {
98
+ return (this.rect.x === other.rect.x &&
99
+ this.rect.y === other.rect.y &&
100
+ this.rect.width === other.rect.width &&
101
+ this.rect.height === other.rect.height);
154
102
  }
155
-
156
- _logger.default.info('Will tap using MJSONWP TouchActions');
157
-
158
- const action = {
159
- action: 'tap',
160
- options: {
161
- x,
162
- y
163
- }
164
- };
165
-
166
- if (driver.performTouch) {
167
- return await driver.performTouch([action]);
103
+ /**
104
+ * Use a driver to tap the screen at the center of this ImageElement's
105
+ * position
106
+ *
107
+ * @param {BaseDriver} driver - driver for calling actions with
108
+ */
109
+ async click(driver) {
110
+ // before we click we need to make sure the element is actually still there
111
+ // where we expect it to be
112
+ let newImgEl;
113
+ const settings = Object.assign({}, finder_1.DEFAULT_SETTINGS, driver.settings.getSettings());
114
+ const { autoUpdateImageElementPosition: updatePos, checkForImageElementStaleness, imageElementTapStrategy, } = settings;
115
+ // validate tap strategy
116
+ if (!IMAGE_TAP_STRATEGIES.includes(imageElementTapStrategy)) {
117
+ throw new Error(`Incorrect imageElementTapStrategy setting ` +
118
+ `'${imageElementTapStrategy}'. Must be one of ` +
119
+ JSON.stringify(IMAGE_TAP_STRATEGIES));
120
+ }
121
+ if (checkForImageElementStaleness || updatePos) {
122
+ logger_1.default.info('Checking image element for staleness before clicking');
123
+ try {
124
+ newImgEl = await this.finder.findByImage(this.template, {
125
+ shouldCheckStaleness: true,
126
+ // Set ignoreDefaultImageTemplateScale because this.template is device screenshot based image
127
+ // managed inside Appium after finidng image by template which managed by a user
128
+ ignoreDefaultImageTemplateScale: true,
129
+ });
130
+ }
131
+ catch (err) {
132
+ throw new driver_1.errors.StaleElementReferenceError();
133
+ }
134
+ if (!this.equals(newImgEl)) {
135
+ logger_1.default.warn(`When trying to click on an image element, the image changed ` +
136
+ `position from where it was originally found. It is now at ` +
137
+ `${JSON.stringify(newImgEl.rect)} and was originally at ` +
138
+ `${JSON.stringify(this.rect)}.`);
139
+ if (updatePos) {
140
+ logger_1.default.warn('Click will proceed at new coordinates');
141
+ this.rect = lodash_1.default.clone(newImgEl.rect);
142
+ }
143
+ else {
144
+ logger_1.default.warn('Click will take place at original coordinates. If you ' +
145
+ 'would like Appium to automatically click the new ' +
146
+ "coordinates, set the 'autoUpdateImageElementPosition' " +
147
+ 'setting to true');
148
+ }
149
+ }
150
+ }
151
+ const { x, y } = this.center;
152
+ logger_1.default.info(`Will tap on image element at coordinate [${x}, ${y}]`);
153
+ if (imageElementTapStrategy === IMAGE_EL_TAP_STRATEGY_W3C) {
154
+ // set up a W3C action to click on the image by position
155
+ logger_1.default.info('Will tap using W3C actions');
156
+ const action = {
157
+ type: 'pointer',
158
+ id: 'mouse',
159
+ parameters: { pointerType: 'touch' },
160
+ actions: [
161
+ { type: 'pointerMove', x, y, duration: 0 },
162
+ { type: 'pointerDown', button: 0 },
163
+ { type: 'pause', duration: TAP_DURATION_MS },
164
+ { type: 'pointerUp', button: 0 },
165
+ ],
166
+ };
167
+ // check if the driver has the appropriate performActions method
168
+ if (driver.performActions) {
169
+ return await driver.performActions([action]);
170
+ }
171
+ // if not, warn and fall back to the other method
172
+ logger_1.default.warn('Driver does not seem to implement W3C actions, falling back ' + 'to TouchActions');
173
+ }
174
+ // if the w3c strategy was not requested, do the only other option (mjsonwp
175
+ // touch actions)
176
+ logger_1.default.info('Will tap using MJSONWP TouchActions');
177
+ const action = {
178
+ action: 'tap',
179
+ options: { x, y },
180
+ };
181
+ if (driver.performTouch) {
182
+ return await driver.performTouch([action]);
183
+ }
184
+ throw new Error("Driver did not implement the 'performTouch' command. " +
185
+ 'For drivers to support finding image elements, they ' +
186
+ "should support 'performTouch' and 'performActions'");
168
187
  }
169
-
170
- throw new Error("Driver did not implement the 'performTouch' command. " + 'For drivers to support finding image elements, they ' + "should support 'performTouch' and 'performActions'");
171
- }
172
-
173
- static async execute(driver, imgEl, cmd, ...args) {
174
- switch (cmd) {
175
- case 'click':
176
- return await imgEl.click(driver);
177
-
178
- case 'elementDisplayed':
179
- return true;
180
-
181
- case 'getSize':
182
- return imgEl.size;
183
-
184
- case 'getLocation':
185
- case 'getLocationInView':
186
- return imgEl.location;
187
-
188
- case 'getElementRect':
189
- return imgEl.rect;
190
-
191
- case 'getAttribute':
192
- switch (args[0]) {
193
- case 'visual':
194
- return imgEl.matchedImage;
195
-
196
- case 'score':
197
- return imgEl.score;
198
-
199
- default:
200
- throw new _driver.errors.NotYetImplementedError();
188
+ /**
189
+ * Handle various Appium commands that involve an image element
190
+ *
191
+ * @param {import('appium/driver').BaseDriver} driver - the driver to use for commands
192
+ * @param {string} cmd - the name of the driver command
193
+ * @param {string} imgElId - the id of the ImageElement to work with
194
+ * @param {string[]} args - Rest of arguments for executeScripts
195
+ *
196
+ * @returns {object} - the result of running a command
197
+ */
198
+ static async execute(driver, imgEl, cmd, ...args) {
199
+ switch (cmd) {
200
+ case 'click':
201
+ return await imgEl.click(driver);
202
+ case 'elementDisplayed':
203
+ return true;
204
+ case 'getSize':
205
+ return imgEl.size;
206
+ case 'getLocation':
207
+ case 'getLocationInView':
208
+ return imgEl.location;
209
+ case 'getElementRect':
210
+ return imgEl.rect;
211
+ case 'getAttribute':
212
+ // /session/:sessionId/element/:elementId/attribute/:name
213
+ // /session/:sessionId/element/:elementId/attribute/visual should retun the visual data
214
+ // e.g. ["content-desc","appium-image-element-xxxxx","xxxxx"], ["visual","appium-image-element-xxxxx","xxxxx"]
215
+ switch (args[0]) {
216
+ case 'visual':
217
+ return imgEl.matchedImage;
218
+ case 'score':
219
+ return imgEl.score;
220
+ default:
221
+ throw new driver_1.errors.NotYetImplementedError();
222
+ }
223
+ default:
224
+ throw new driver_1.errors.NotYetImplementedError();
201
225
  }
202
-
203
- default:
204
- throw new _driver.errors.NotYetImplementedError();
205
226
  }
206
- }
207
-
208
227
  }
209
-
210
- exports.ImageElement = exports.default = ImageElement;
211
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJTUFHRV9FTEVNRU5UX1BSRUZJWCIsIlRBUF9EVVJBVElPTl9NUyIsIklNQUdFX0VMX1RBUF9TVFJBVEVHWV9XM0MiLCJJTUFHRV9FTF9UQVBfU1RSQVRFR1lfTUpTT05XUCIsIklNQUdFX1RBUF9TVFJBVEVHSUVTIiwiREVGQVVMVF9URU1QTEFURV9JTUFHRV9TQ0FMRSIsIkltYWdlRWxlbWVudCIsImNvbnN0cnVjdG9yIiwiYjY0VGVtcGxhdGUiLCJyZWN0Iiwic2NvcmUiLCJiNjRSZXN1bHQiLCJmaW5kZXIiLCJ0ZW1wbGF0ZSIsImlkIiwidXRpbCIsInV1aWRWNCIsImI2NE1hdGNoZWRJbWFnZSIsInNpemUiLCJ3aWR0aCIsImhlaWdodCIsImxvY2F0aW9uIiwieCIsInkiLCJjZW50ZXIiLCJtYXRjaGVkSW1hZ2UiLCJhc0VsZW1lbnQiLCJwcm90b2NvbEtleSIsImVxdWFscyIsIm90aGVyIiwiY2xpY2siLCJkcml2ZXIiLCJuZXdJbWdFbCIsInNldHRpbmdzIiwiT2JqZWN0IiwiYXNzaWduIiwiREVGQVVMVF9TRVRUSU5HUyIsImdldFNldHRpbmdzIiwiYXV0b1VwZGF0ZUltYWdlRWxlbWVudFBvc2l0aW9uIiwidXBkYXRlUG9zIiwiY2hlY2tGb3JJbWFnZUVsZW1lbnRTdGFsZW5lc3MiLCJpbWFnZUVsZW1lbnRUYXBTdHJhdGVneSIsImluY2x1ZGVzIiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwibG9nIiwiaW5mbyIsImZpbmRCeUltYWdlIiwic2hvdWxkQ2hlY2tTdGFsZW5lc3MiLCJpZ25vcmVEZWZhdWx0SW1hZ2VUZW1wbGF0ZVNjYWxlIiwiZXJyIiwiZXJyb3JzIiwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IiLCJ3YXJuIiwiXyIsImNsb25lIiwiYWN0aW9uIiwidHlwZSIsInBhcmFtZXRlcnMiLCJwb2ludGVyVHlwZSIsImFjdGlvbnMiLCJkdXJhdGlvbiIsImJ1dHRvbiIsInBlcmZvcm1BY3Rpb25zIiwib3B0aW9ucyIsInBlcmZvcm1Ub3VjaCIsImV4ZWN1dGUiLCJpbWdFbCIsImNtZCIsImFyZ3MiLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2ltYWdlLWVsZW1lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7ZXJyb3JzfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7dXRpbH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge0RFRkFVTFRfU0VUVElOR1N9IGZyb20gJy4vZmluZGVyJztcblxuY29uc3QgSU1BR0VfRUxFTUVOVF9QUkVGSVggPSAnYXBwaXVtLWltYWdlLWVsZW1lbnQtJztcbmNvbnN0IFRBUF9EVVJBVElPTl9NUyA9IDEyNTtcbmNvbnN0IElNQUdFX0VMX1RBUF9TVFJBVEVHWV9XM0MgPSAndzNjQWN0aW9ucyc7XG5jb25zdCBJTUFHRV9FTF9UQVBfU1RSQVRFR1lfTUpTT05XUCA9ICd0b3VjaEFjdGlvbnMnO1xuY29uc3QgSU1BR0VfVEFQX1NUUkFURUdJRVMgPSBbSU1BR0VfRUxfVEFQX1NUUkFURUdZX01KU09OV1AsIElNQUdFX0VMX1RBUF9TVFJBVEVHWV9XM0NdO1xuY29uc3QgREVGQVVMVF9URU1QTEFURV9JTUFHRV9TQ0FMRSA9IDEuMDtcblxuLyoqXG4gKiBAdHlwZWRlZiBEaW1lbnNpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCAtIHdpZHRoIG9mIHJlY3RcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBoZWlnaHQgb2YgcmVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB4IC0geCBjb29yZGluYXRlXG4gKiBAcHJvcGVydHkge251bWJlcn0geSAtIHkgY29vcmRpbmF0ZVxuICovXG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYW4gXCJpbWFnZSBlbGVtZW50XCIsIHdoaWNoIGlzIHNpbXBseSBhIHNldCBvZiBjb29yZGluYXRlc1xuICogYW5kIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCBvbiB0aGF0IHNldCBvZiBjb29yZGluYXRlcyB2aWEgdGhlIGRyaXZlclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZUVsZW1lbnQge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGI2NFRlbXBsYXRlIC0gdGhlIGJhc2U2NC1lbmNvZGVkIGltYWdlIHdoaWNoIHdhcyB1c2VkIHRvXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmQgdGhpcyBJbWFnZUVsZW1lbnRcbiAgICogQHBhcmFtIHtSZWN0fSByZWN0IC0gYm91bmRzIG9mIG1hdGNoZWQgaW1hZ2UgZWxlbWVudFxuICAgKiBAcGFyYW0ge251bWJlcn0gc2NvcmUgVGhlIHNpbWlsYXJpdHkgc2NvcmUgYXMgYSBmbG9hdCBudW1iZXIgaW4gcmFuZ2UgWzAuMCwgMS4wXS5cbiAgICogMS4wIGlzIHRoZSBoaWdoZXN0IHNjb3JlIChtZWFucyBib3RoIGltYWdlcyBhcmUgdG90YWxseSBlcXVhbCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nP30gYjY0UmVzdWx0IC0gdGhlIGJhc2U2NC1lbmNvZGVkIGltYWdlIHdoaWNoIGhhcyBtYXRjaGVkIG1hcmtzLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIG51bGwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuL2ZpbmRlcicpLmRlZmF1bHQ/fSBmaW5kZXIgLSB0aGUgZmluZGVyIHdlIGNhbiB1c2UgdG8gcmUtY2hlY2sgc3RhbGUgZWxlbWVudHNcbiAgICovXG4gIGNvbnN0cnVjdG9yKGI2NFRlbXBsYXRlLCByZWN0LCBzY29yZSwgYjY0UmVzdWx0ID0gbnVsbCwgZmluZGVyID0gbnVsbCkge1xuICAgIHRoaXMudGVtcGxhdGUgPSBiNjRUZW1wbGF0ZTtcbiAgICB0aGlzLnJlY3QgPSByZWN0O1xuICAgIHRoaXMuaWQgPSBgJHtJTUFHRV9FTEVNRU5UX1BSRUZJWH0ke3V0aWwudXVpZFY0KCl9YDtcbiAgICB0aGlzLmI2NE1hdGNoZWRJbWFnZSA9IGI2NFJlc3VsdDtcbiAgICB0aGlzLnNjb3JlID0gc2NvcmU7XG4gICAgdGhpcy5maW5kZXIgPSBmaW5kZXI7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RpbWVuc2lvbn0gLSBkaW1lbnNpb24gb2YgZWxlbWVudFxuICAgKi9cbiAgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHt3aWR0aDogdGhpcy5yZWN0LndpZHRoLCBoZWlnaHQ6IHRoaXMucmVjdC5oZWlnaHR9O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQb3NpdGlvbn0gLSBjb29yZGluYXRlcyBvZiB0b3AtbGVmdCBjb3JuZXIgb2YgZWxlbWVudFxuICAgKi9cbiAgZ2V0IGxvY2F0aW9uKCkge1xuICAgIHJldHVybiB7eDogdGhpcy5yZWN0LngsIHk6IHRoaXMucmVjdC55fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UG9zaXRpb259IC0gY29vcmRpbmF0ZXMgb2YgY2VudGVyIG9mIGVsZW1lbnRcbiAgICovXG4gIGdldCBjZW50ZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHRoaXMucmVjdC54ICsgdGhpcy5yZWN0LndpZHRoIC8gMixcbiAgICAgIHk6IHRoaXMucmVjdC55ICsgdGhpcy5yZWN0LmhlaWdodCAvIDIsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7P3N0cmluZ30gLSB0aGUgYmFzZTY0LWVuY29kZWQgaW1hZ2Ugd2hpY2ggaGFzIG1hdGNoZWQgbWFya3NcbiAgICovXG4gIGdldCBtYXRjaGVkSW1hZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuYjY0TWF0Y2hlZEltYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm90b2NvbEtleSAtIHRoZSBwcm90b2NvbC1zcGVjaWZpYyBKU09OIGtleSBmb3JcbiAgICogYSBXZWJFbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIHRoaXMgaW1hZ2UgZWxlbWVudCBhcyBhIFdlYkVsZW1lbnRcbiAgICovXG4gIGFzRWxlbWVudChwcm90b2NvbEtleSkge1xuICAgIHJldHVybiB7W3Byb3RvY29sS2V5XTogdGhpcy5pZH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtJbWFnZUVsZW1lbnR9IG90aGVyIC0gYW4gSW1hZ2VFbGVtZW50IHRvIGNvbXBhcmUgd2l0aCB0aGlzIG9uZVxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB3aGV0aGVyIHRoZSBvdGhlciBlbGVtZW50IGFuZCB0aGlzIG9uZSBoYXZlIHRoZSBzYW1lXG4gICAqIHByb3BlcnRpZXNcbiAgICovXG4gIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnJlY3QueCA9PT0gb3RoZXIucmVjdC54ICYmXG4gICAgICB0aGlzLnJlY3QueSA9PT0gb3RoZXIucmVjdC55ICYmXG4gICAgICB0aGlzLnJlY3Qud2lkdGggPT09IG90aGVyLnJlY3Qud2lkdGggJiZcbiAgICAgIHRoaXMucmVjdC5oZWlnaHQgPT09IG90aGVyLnJlY3QuaGVpZ2h0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgYSBkcml2ZXIgdG8gdGFwIHRoZSBzY3JlZW4gYXQgdGhlIGNlbnRlciBvZiB0aGlzIEltYWdlRWxlbWVudCdzXG4gICAqIHBvc2l0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7QmFzZURyaXZlcn0gZHJpdmVyIC0gZHJpdmVyIGZvciBjYWxsaW5nIGFjdGlvbnMgd2l0aFxuICAgKi9cbiAgYXN5bmMgY2xpY2soZHJpdmVyKSB7XG4gICAgLy8gYmVmb3JlIHdlIGNsaWNrIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIGFjdHVhbGx5IHN0aWxsIHRoZXJlXG4gICAgLy8gd2hlcmUgd2UgZXhwZWN0IGl0IHRvIGJlXG4gICAgbGV0IG5ld0ltZ0VsO1xuICAgIGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgZHJpdmVyLnNldHRpbmdzLmdldFNldHRpbmdzKCkpO1xuICAgIGNvbnN0IHtcbiAgICAgIGF1dG9VcGRhdGVJbWFnZUVsZW1lbnRQb3NpdGlvbjogdXBkYXRlUG9zLFxuICAgICAgY2hlY2tGb3JJbWFnZUVsZW1lbnRTdGFsZW5lc3MsXG4gICAgICBpbWFnZUVsZW1lbnRUYXBTdHJhdGVneSxcbiAgICB9ID0gc2V0dGluZ3M7XG5cbiAgICAvLyB2YWxpZGF0ZSB0YXAgc3RyYXRlZ3lcbiAgICBpZiAoIUlNQUdFX1RBUF9TVFJBVEVHSUVTLmluY2x1ZGVzKGltYWdlRWxlbWVudFRhcFN0cmF0ZWd5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW5jb3JyZWN0IGltYWdlRWxlbWVudFRhcFN0cmF0ZWd5IHNldHRpbmcgYCArXG4gICAgICAgICAgYCcke2ltYWdlRWxlbWVudFRhcFN0cmF0ZWd5fScuIE11c3QgYmUgb25lIG9mIGAgK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KElNQUdFX1RBUF9TVFJBVEVHSUVTKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tGb3JJbWFnZUVsZW1lbnRTdGFsZW5lc3MgfHwgdXBkYXRlUG9zKSB7XG4gICAgICBsb2cuaW5mbygnQ2hlY2tpbmcgaW1hZ2UgZWxlbWVudCBmb3Igc3RhbGVuZXNzIGJlZm9yZSBjbGlja2luZycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3SW1nRWwgPSBhd2FpdCB0aGlzLmZpbmRlci5maW5kQnlJbWFnZSh0aGlzLnRlbXBsYXRlLCB7XG4gICAgICAgICAgc2hvdWxkQ2hlY2tTdGFsZW5lc3M6IHRydWUsXG4gICAgICAgICAgLy8gU2V0IGlnbm9yZURlZmF1bHRJbWFnZVRlbXBsYXRlU2NhbGUgYmVjYXVzZSB0aGlzLnRlbXBsYXRlIGlzIGRldmljZSBzY3JlZW5zaG90IGJhc2VkIGltYWdlXG4gICAgICAgICAgLy8gbWFuYWdlZCBpbnNpZGUgQXBwaXVtIGFmdGVyIGZpbmlkbmcgaW1hZ2UgYnkgdGVtcGxhdGUgd2hpY2ggbWFuYWdlZCBieSBhIHVzZXJcbiAgICAgICAgICBpZ25vcmVEZWZhdWx0SW1hZ2VUZW1wbGF0ZVNjYWxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5lcXVhbHMobmV3SW1nRWwpKSB7XG4gICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgIGBXaGVuIHRyeWluZyB0byBjbGljayBvbiBhbiBpbWFnZSBlbGVtZW50LCB0aGUgaW1hZ2UgY2hhbmdlZCBgICtcbiAgICAgICAgICAgIGBwb3NpdGlvbiBmcm9tIHdoZXJlIGl0IHdhcyBvcmlnaW5hbGx5IGZvdW5kLiBJdCBpcyBub3cgYXQgYCArXG4gICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShuZXdJbWdFbC5yZWN0KX0gYW5kIHdhcyBvcmlnaW5hbGx5IGF0IGAgK1xuICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5yZWN0KX0uYFxuICAgICAgICApO1xuICAgICAgICBpZiAodXBkYXRlUG9zKSB7XG4gICAgICAgICAgbG9nLndhcm4oJ0NsaWNrIHdpbGwgcHJvY2VlZCBhdCBuZXcgY29vcmRpbmF0ZXMnKTtcbiAgICAgICAgICB0aGlzLnJlY3QgPSBfLmNsb25lKG5ld0ltZ0VsLnJlY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy53YXJuKFxuICAgICAgICAgICAgJ0NsaWNrIHdpbGwgdGFrZSBwbGFjZSBhdCBvcmlnaW5hbCBjb29yZGluYXRlcy4gSWYgeW91ICcgK1xuICAgICAgICAgICAgICAnd291bGQgbGlrZSBBcHBpdW0gdG8gYXV0b21hdGljYWxseSBjbGljayB0aGUgbmV3ICcgK1xuICAgICAgICAgICAgICBcImNvb3JkaW5hdGVzLCBzZXQgdGhlICdhdXRvVXBkYXRlSW1hZ2VFbGVtZW50UG9zaXRpb24nIFwiICtcbiAgICAgICAgICAgICAgJ3NldHRpbmcgdG8gdHJ1ZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qge3gsIHl9ID0gdGhpcy5jZW50ZXI7XG4gICAgbG9nLmluZm8oYFdpbGwgdGFwIG9uIGltYWdlIGVsZW1lbnQgYXQgY29vcmRpbmF0ZSBbJHt4fSwgJHt5fV1gKTtcblxuICAgIGlmIChpbWFnZUVsZW1lbnRUYXBTdHJhdGVneSA9PT0gSU1BR0VfRUxfVEFQX1NUUkFURUdZX1czQykge1xuICAgICAgLy8gc2V0IHVwIGEgVzNDIGFjdGlvbiB0byBjbGljayBvbiB0aGUgaW1hZ2UgYnkgcG9zaXRpb25cbiAgICAgIGxvZy5pbmZvKCdXaWxsIHRhcCB1c2luZyBXM0MgYWN0aW9ucycpO1xuICAgICAgY29uc3QgYWN0aW9uID0ge1xuICAgICAgICB0eXBlOiAncG9pbnRlcicsXG4gICAgICAgIGlkOiAnbW91c2UnLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7cG9pbnRlclR5cGU6ICd0b3VjaCd9LFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAge3R5cGU6ICdwb2ludGVyTW92ZScsIHgsIHksIGR1cmF0aW9uOiAwfSxcbiAgICAgICAgICB7dHlwZTogJ3BvaW50ZXJEb3duJywgYnV0dG9uOiAwfSxcbiAgICAgICAgICB7dHlwZTogJ3BhdXNlJywgZHVyYXRpb246IFRBUF9EVVJBVElPTl9NU30sXG4gICAgICAgICAge3R5cGU6ICdwb2ludGVyVXAnLCBidXR0b246IDB9LFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgLy8gY2hlY2sgaWYgdGhlIGRyaXZlciBoYXMgdGhlIGFwcHJvcHJpYXRlIHBlcmZvcm1BY3Rpb25zIG1ldGhvZFxuICAgICAgaWYgKGRyaXZlci5wZXJmb3JtQWN0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgZHJpdmVyLnBlcmZvcm1BY3Rpb25zKFthY3Rpb25dKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgbm90LCB3YXJuIGFuZCBmYWxsIGJhY2sgdG8gdGhlIG90aGVyIG1ldGhvZFxuICAgICAgbG9nLndhcm4oJ0RyaXZlciBkb2VzIG5vdCBzZWVtIHRvIGltcGxlbWVudCBXM0MgYWN0aW9ucywgZmFsbGluZyBiYWNrICcgKyAndG8gVG91Y2hBY3Rpb25zJyk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIHczYyBzdHJhdGVneSB3YXMgbm90IHJlcXVlc3RlZCwgZG8gdGhlIG9ubHkgb3RoZXIgb3B0aW9uIChtanNvbndwXG4gICAgLy8gdG91Y2ggYWN0aW9ucylcbiAgICBsb2cuaW5mbygnV2lsbCB0YXAgdXNpbmcgTUpTT05XUCBUb3VjaEFjdGlvbnMnKTtcbiAgICBjb25zdCBhY3Rpb24gPSB7XG4gICAgICBhY3Rpb246ICd0YXAnLFxuICAgICAgb3B0aW9uczoge3gsIHl9LFxuICAgIH07XG5cbiAgICBpZiAoZHJpdmVyLnBlcmZvcm1Ub3VjaCkge1xuICAgICAgcmV0dXJuIGF3YWl0IGRyaXZlci5wZXJmb3JtVG91Y2goW2FjdGlvbl0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiRHJpdmVyIGRpZCBub3QgaW1wbGVtZW50IHRoZSAncGVyZm9ybVRvdWNoJyBjb21tYW5kLiBcIiArXG4gICAgICAgICdGb3IgZHJpdmVycyB0byBzdXBwb3J0IGZpbmRpbmcgaW1hZ2UgZWxlbWVudHMsIHRoZXkgJyArXG4gICAgICAgIFwic2hvdWxkIHN1cHBvcnQgJ3BlcmZvcm1Ub3VjaCcgYW5kICdwZXJmb3JtQWN0aW9ucydcIlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHZhcmlvdXMgQXBwaXVtIGNvbW1hbmRzIHRoYXQgaW52b2x2ZSBhbiBpbWFnZSBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdhcHBpdW0vZHJpdmVyJykuQmFzZURyaXZlcn0gZHJpdmVyIC0gdGhlIGRyaXZlciB0byB1c2UgZm9yIGNvbW1hbmRzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWQgLSB0aGUgbmFtZSBvZiB0aGUgZHJpdmVyIGNvbW1hbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGltZ0VsSWQgLSB0aGUgaWQgb2YgdGhlIEltYWdlRWxlbWVudCB0byB3b3JrIHdpdGhcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncyAtIFJlc3Qgb2YgYXJndW1lbnRzIGZvciBleGVjdXRlU2NyaXB0c1xuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSAtIHRoZSByZXN1bHQgb2YgcnVubmluZyBhIGNvbW1hbmRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBleGVjdXRlKGRyaXZlciwgaW1nRWwsIGNtZCwgLi4uYXJncykge1xuICAgIHN3aXRjaCAoY21kKSB7XG4gICAgICBjYXNlICdjbGljayc6XG4gICAgICAgIHJldHVybiBhd2FpdCBpbWdFbC5jbGljayhkcml2ZXIpO1xuICAgICAgY2FzZSAnZWxlbWVudERpc3BsYXllZCc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnZ2V0U2l6ZSc6XG4gICAgICAgIHJldHVybiBpbWdFbC5zaXplO1xuICAgICAgY2FzZSAnZ2V0TG9jYXRpb24nOlxuICAgICAgY2FzZSAnZ2V0TG9jYXRpb25JblZpZXcnOlxuICAgICAgICByZXR1cm4gaW1nRWwubG9jYXRpb247XG4gICAgICBjYXNlICdnZXRFbGVtZW50UmVjdCc6XG4gICAgICAgIHJldHVybiBpbWdFbC5yZWN0O1xuICAgICAgY2FzZSAnZ2V0QXR0cmlidXRlJzpcbiAgICAgICAgLy8gL3Nlc3Npb24vOnNlc3Npb25JZC9lbGVtZW50LzplbGVtZW50SWQvYXR0cmlidXRlLzpuYW1lXG4gICAgICAgIC8vIC9zZXNzaW9uLzpzZXNzaW9uSWQvZWxlbWVudC86ZWxlbWVudElkL2F0dHJpYnV0ZS92aXN1YWwgc2hvdWxkIHJldHVuIHRoZSB2aXN1YWwgZGF0YVxuICAgICAgICAvLyBlLmcuIFtcImNvbnRlbnQtZGVzY1wiLFwiYXBwaXVtLWltYWdlLWVsZW1lbnQteHh4eHhcIixcInh4eHh4XCJdLCBbXCJ2aXN1YWxcIixcImFwcGl1bS1pbWFnZS1lbGVtZW50LXh4eHh4XCIsXCJ4eHh4eFwiXVxuICAgICAgICBzd2l0Y2ggKGFyZ3NbMF0pIHtcbiAgICAgICAgICBjYXNlICd2aXN1YWwnOlxuICAgICAgICAgICAgcmV0dXJuIGltZ0VsLm1hdGNoZWRJbWFnZTtcbiAgICAgICAgICBjYXNlICdzY29yZSc6XG4gICAgICAgICAgICByZXR1cm4gaW1nRWwuc2NvcmU7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgSW1hZ2VFbGVtZW50LFxuICBJTUFHRV9FTF9UQVBfU1RSQVRFR1lfTUpTT05XUCxcbiAgSU1BR0VfRUxfVEFQX1NUUkFURUdZX1czQyxcbiAgREVGQVVMVF9URU1QTEFURV9JTUFHRV9TQ0FMRSxcbiAgSU1BR0VfRUxFTUVOVF9QUkVGSVgsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5SZWN0fSBSZWN0XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRWxlbWVudH0gRWxlbWVudFxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsb0JBQW9CLEdBQUcsdUJBQTdCOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxHQUF4QjtBQUNB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
228
+ exports.default = ImageElement;
229
+ exports.ImageElement = ImageElement;
230
+ /**
231
+ * @typedef {import('@appium/types').Rect} Rect
232
+ * @typedef {import('@appium/types').Element} Element
233
+ */
234
+ //# sourceMappingURL=image-element.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-element.js","names":["IMAGE_ELEMENT_PREFIX","TAP_DURATION_MS","IMAGE_EL_TAP_STRATEGY_W3C","IMAGE_EL_TAP_STRATEGY_MJSONWP","IMAGE_TAP_STRATEGIES","DEFAULT_TEMPLATE_IMAGE_SCALE","ImageElement","constructor","b64Template","rect","score","b64Result","finder","template","id","util","uuidV4","b64MatchedImage","size","width","height","location","x","y","center","matchedImage","asElement","protocolKey","equals","other","click","driver","newImgEl","settings","Object","assign","DEFAULT_SETTINGS","getSettings","autoUpdateImageElementPosition","updatePos","checkForImageElementStaleness","imageElementTapStrategy","includes","Error","JSON","stringify","log","info","findByImage","shouldCheckStaleness","ignoreDefaultImageTemplateScale","err","errors","StaleElementReferenceError","warn","_","clone","action","type","parameters","pointerType","actions","duration","button","performActions","options","performTouch","execute","imgEl","cmd","args","NotYetImplementedError"],"sources":["../../lib/image-element.js"],"sourcesContent":["import _ from 'lodash';\nimport {errors} from 'appium/driver';\nimport {util} from 'appium/support';\nimport log from './logger';\nimport {DEFAULT_SETTINGS} from './finder';\n\nconst IMAGE_ELEMENT_PREFIX = 'appium-image-element-';\nconst TAP_DURATION_MS = 125;\nconst IMAGE_EL_TAP_STRATEGY_W3C = 'w3cActions';\nconst IMAGE_EL_TAP_STRATEGY_MJSONWP = 'touchActions';\nconst IMAGE_TAP_STRATEGIES = [IMAGE_EL_TAP_STRATEGY_MJSONWP, IMAGE_EL_TAP_STRATEGY_W3C];\nconst DEFAULT_TEMPLATE_IMAGE_SCALE = 1.0;\n\n/**\n * @typedef Dimension\n * @property {number} width - width of rect\n * @property {number} height - height of rect\n */\n\n/**\n * @typedef Position\n * @property {number} x - x coordinate\n * @property {number} y - y coordinate\n */\n\n/**\n * Representation of an \"image element\", which is simply a set of coordinates\n * and methods that can be used on that set of coordinates via the driver\n */\nexport default class ImageElement {\n /**\n * @param {string} b64Template - the base64-encoded image which was used to\n * find this ImageElement\n * @param {Rect} rect - bounds of matched image element\n * @param {number} score The similarity score as a float number in range [0.0, 1.0].\n * 1.0 is the highest score (means both images are totally equal).\n * @param {string?} b64Result - the base64-encoded image which has matched marks.\n * Defaults to null.\n * @param {import('./finder').default?} finder - the finder we can use to re-check stale elements\n */\n constructor(b64Template, rect, score, b64Result = null, finder = null) {\n this.template = b64Template;\n this.rect = rect;\n this.id = `${IMAGE_ELEMENT_PREFIX}${util.uuidV4()}`;\n this.b64MatchedImage = b64Result;\n this.score = score;\n this.finder = finder;\n }\n\n /**\n * @returns {Dimension} - dimension of element\n */\n get size() {\n return {width: this.rect.width, height: this.rect.height};\n }\n\n /**\n * @returns {Position} - coordinates of top-left corner of element\n */\n get location() {\n return {x: this.rect.x, y: this.rect.y};\n }\n\n /**\n * @returns {Position} - coordinates of center of element\n */\n get center() {\n return {\n x: this.rect.x + this.rect.width / 2,\n y: this.rect.y + this.rect.height / 2,\n };\n }\n\n /**\n * @returns {?string} - the base64-encoded image which has matched marks\n */\n get matchedImage() {\n return this.b64MatchedImage;\n }\n\n /**\n * @param {string} protocolKey - the protocol-specific JSON key for\n * a WebElement\n *\n * @returns {Element} - this image element as a WebElement\n */\n asElement(protocolKey) {\n return {[protocolKey]: this.id};\n }\n\n /**\n * @param {ImageElement} other - an ImageElement to compare with this one\n *\n * @returns {boolean} - whether the other element and this one have the same\n * properties\n */\n equals(other) {\n return (\n this.rect.x === other.rect.x &&\n this.rect.y === other.rect.y &&\n this.rect.width === other.rect.width &&\n this.rect.height === other.rect.height\n );\n }\n\n /**\n * Use a driver to tap the screen at the center of this ImageElement's\n * position\n *\n * @param {BaseDriver} driver - driver for calling actions with\n */\n async click(driver) {\n // before we click we need to make sure the element is actually still there\n // where we expect it to be\n let newImgEl;\n const settings = Object.assign({}, DEFAULT_SETTINGS, driver.settings.getSettings());\n const {\n autoUpdateImageElementPosition: updatePos,\n checkForImageElementStaleness,\n imageElementTapStrategy,\n } = settings;\n\n // validate tap strategy\n if (!IMAGE_TAP_STRATEGIES.includes(imageElementTapStrategy)) {\n throw new Error(\n `Incorrect imageElementTapStrategy setting ` +\n `'${imageElementTapStrategy}'. Must be one of ` +\n JSON.stringify(IMAGE_TAP_STRATEGIES)\n );\n }\n\n if (checkForImageElementStaleness || updatePos) {\n log.info('Checking image element for staleness before clicking');\n try {\n newImgEl = await this.finder.findByImage(this.template, {\n shouldCheckStaleness: true,\n // Set ignoreDefaultImageTemplateScale because this.template is device screenshot based image\n // managed inside Appium after finidng image by template which managed by a user\n ignoreDefaultImageTemplateScale: true,\n });\n } catch (err) {\n throw new errors.StaleElementReferenceError();\n }\n\n if (!this.equals(newImgEl)) {\n log.warn(\n `When trying to click on an image element, the image changed ` +\n `position from where it was originally found. It is now at ` +\n `${JSON.stringify(newImgEl.rect)} and was originally at ` +\n `${JSON.stringify(this.rect)}.`\n );\n if (updatePos) {\n log.warn('Click will proceed at new coordinates');\n this.rect = _.clone(newImgEl.rect);\n } else {\n log.warn(\n 'Click will take place at original coordinates. If you ' +\n 'would like Appium to automatically click the new ' +\n \"coordinates, set the 'autoUpdateImageElementPosition' \" +\n 'setting to true'\n );\n }\n }\n }\n\n const {x, y} = this.center;\n log.info(`Will tap on image element at coordinate [${x}, ${y}]`);\n\n if (imageElementTapStrategy === IMAGE_EL_TAP_STRATEGY_W3C) {\n // set up a W3C action to click on the image by position\n log.info('Will tap using W3C actions');\n const action = {\n type: 'pointer',\n id: 'mouse',\n parameters: {pointerType: 'touch'},\n actions: [\n {type: 'pointerMove', x, y, duration: 0},\n {type: 'pointerDown', button: 0},\n {type: 'pause', duration: TAP_DURATION_MS},\n {type: 'pointerUp', button: 0},\n ],\n };\n\n // check if the driver has the appropriate performActions method\n if (driver.performActions) {\n return await driver.performActions([action]);\n }\n\n // if not, warn and fall back to the other method\n log.warn('Driver does not seem to implement W3C actions, falling back ' + 'to TouchActions');\n }\n\n // if the w3c strategy was not requested, do the only other option (mjsonwp\n // touch actions)\n log.info('Will tap using MJSONWP TouchActions');\n const action = {\n action: 'tap',\n options: {x, y},\n };\n\n if (driver.performTouch) {\n return await driver.performTouch([action]);\n }\n\n throw new Error(\n \"Driver did not implement the 'performTouch' command. \" +\n 'For drivers to support finding image elements, they ' +\n \"should support 'performTouch' and 'performActions'\"\n );\n }\n\n /**\n * Handle various Appium commands that involve an image element\n *\n * @param {import('appium/driver').BaseDriver} driver - the driver to use for commands\n * @param {string} cmd - the name of the driver command\n * @param {string} imgElId - the id of the ImageElement to work with\n * @param {string[]} args - Rest of arguments for executeScripts\n *\n * @returns {object} - the result of running a command\n */\n static async execute(driver, imgEl, cmd, ...args) {\n switch (cmd) {\n case 'click':\n return await imgEl.click(driver);\n case 'elementDisplayed':\n return true;\n case 'getSize':\n return imgEl.size;\n case 'getLocation':\n case 'getLocationInView':\n return imgEl.location;\n case 'getElementRect':\n return imgEl.rect;\n case 'getAttribute':\n // /session/:sessionId/element/:elementId/attribute/:name\n // /session/:sessionId/element/:elementId/attribute/visual should retun the visual data\n // e.g. [\"content-desc\",\"appium-image-element-xxxxx\",\"xxxxx\"], [\"visual\",\"appium-image-element-xxxxx\",\"xxxxx\"]\n switch (args[0]) {\n case 'visual':\n return imgEl.matchedImage;\n case 'score':\n return imgEl.score;\n default:\n throw new errors.NotYetImplementedError();\n }\n default:\n throw new errors.NotYetImplementedError();\n }\n }\n}\n\nexport {\n ImageElement,\n IMAGE_EL_TAP_STRATEGY_MJSONWP,\n IMAGE_EL_TAP_STRATEGY_W3C,\n DEFAULT_TEMPLATE_IMAGE_SCALE,\n IMAGE_ELEMENT_PREFIX,\n};\n\n/**\n * @typedef {import('@appium/types').Rect} Rect\n * @typedef {import('@appium/types').Element} Element\n */\n"],"mappings":"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"}
1
+ {"version":3,"file":"image-element.js","sourceRoot":"","sources":["../../lib/image-element.js"],"names":[],"mappings":"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"}
@@ -1,16 +1,6 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var _support = require("appium/support");
11
-
12
- const log = _support.logger.getLogger('ImageElementPlugin');
13
-
14
- var _default = log;
15
- exports.default = _default;
16
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiXSwic291cmNlcyI6WyIuLi8uLi9saWIvbG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bG9nZ2VyfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0ltYWdlRWxlbWVudFBsdWdpbicpO1xuXG5leHBvcnQgZGVmYXVsdCBsb2c7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUVBLE1BQU1BLEdBQUcsR0FBR0MsZUFBQSxDQUFPQyxTQUFQLENBQWlCLG9CQUFqQixDQUFaOztlQUVlRixHIn0=
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const support_1 = require("appium/support");
4
+ const log = support_1.logger.getLogger('ImageElementPlugin');
5
+ exports.default = log;
6
+ //# sourceMappingURL=logger.js.map