Skip to content
This repository has been archived by the owner on Oct 25, 2023. It is now read-only.

Fix template scale in find element by image #307

Merged
merged 17 commits into from
Mar 20, 2019
Merged
Prev Previous commit
Next Next commit
fix typo, default value, docstring
  • Loading branch information
KazuCocoa committed Mar 1, 2019
commit 4ae5e249709252e90c7edb8524edf08c0281ef07
46 changes: 22 additions & 24 deletions lib/basedriver/commands/find.js
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ commands.findByCustom = async function (selector, multiple) {
* @property {boolean} [multiple=false] - Whether we are finding one element or
* multiple
* @property {boolean} [ignoreDefaultImageTemplateScale=false] - Whether we
* ignore defaultImageTemplateScale. It can be used when you would noe like to
* ignore defaultImageTemplateScale. It can be used when you would like to
* scale b64Template with defaultImageTemplateScale setting.
*/

Expand Down Expand Up @@ -389,6 +389,9 @@ helpers.getScreenshotForImageFind = async function (screenWidth, screenHeight) {
* @property {boolean} ignoreDefaultImageTemplateScale - Ignore defaultImageTemplateScale if it has true.
mykola-mokhnach marked this conversation as resolved.
Show resolved Hide resolved
* If b64Template has been scaled to defaultImageTemplateScale or should ignore the scale,
* this parameter should be true. e.g. click in image-element module
* @property {float} xScale - Scale ratio for width
* @property {float} yScale - Scale ratio for height

*/
/**
* Get a image that will be used for template maching.
Expand All @@ -397,54 +400,49 @@ helpers.getScreenshotForImageFind = async function (screenWidth, screenHeight) {
*
* @param {string} b64Template - base64-encoded image used as a template to be
* matched in the screenshot
* @param {ScreenshotScale, ImageTemplateSettings} opts - Image template scale related options
* @param {ImageTemplateSettings} opts - Image template scale related options
*
* @returns {string} base64-encoded scaled template screenshot
*/
const DEFAULT_FIX_IMAGE_TEMPLATE_SCALE = 1.0;
helpers.fixImageTemplateScale = async function (b64Template, opts = {}) {
if (!opts) {
return b64Template;
}

const defaultScale = 1.0; // To initialise xScale and yScale
const defaultOpts = {
fixImageTemplateScale: false,
defaultImageTemplateScale: DEFAULT_TEMPLATE_IMAGE_SCALE,
ignoreDefaultImageTemplateScale: false,
xScale: defaultScale,
yScale: defaultScale
};
_.defaults(opts, defaultOpts);
let {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

fixImageTemplateScale = false,
defaultImageTemplateScale = DEFAULT_TEMPLATE_IMAGE_SCALE,
ignoreDefaultImageTemplateScale = false,
xScale = DEFAULT_FIX_IMAGE_TEMPLATE_SCALE,
yScale = DEFAULT_FIX_IMAGE_TEMPLATE_SCALE
} = opts;

let defaultImageTemplateScale;
if (opts.ignoreDefaultImageTemplateScale) {
if (ignoreDefaultImageTemplateScale) {
defaultImageTemplateScale = DEFAULT_TEMPLATE_IMAGE_SCALE;
} else {
defaultImageTemplateScale = opts.defaultImageTemplateScale;
}

let {xScale, yScale} = opts;
// Default
if (defaultImageTemplateScale === DEFAULT_TEMPLATE_IMAGE_SCALE && !opts.fixImageTemplateScale) {
if (defaultImageTemplateScale === DEFAULT_TEMPLATE_IMAGE_SCALE && !fixImageTemplateScale) {
return b64Template;
}

// Calculate xScale and yScale Appium should scale
if (opts.fixImageTemplateScale) {
xScale = xScale * defaultImageTemplateScale;
yScale = yScale * defaultImageTemplateScale;
if (fixImageTemplateScale) {
xScale *= defaultImageTemplateScale;
yScale *= defaultImageTemplateScale;
} else {
// `1.0 *` makes NaN if defaultImageTemplateScale is no number
// `1.0 *` makes NaN if defaultImageTemplateScale is not a number
xScale = yScale = 1.0 * defaultImageTemplateScale;
}

// xScale and yScale can be NaN if opts.defaultImageTemplateScale is string, for example
// xScale and yScale can be NaN if defaultImageTemplateScale is string, for example
if (!xScale || !yScale) {
return b64Template;
}

// Return if the scale is deatul (1.0) value
if (xScale === defaultScale && yScale === defaultScale) {
// Return if the scale is default (1.0) value
if (xScale === DEFAULT_FIX_IMAGE_TEMPLATE_SCALE && yScale === DEFAULT_FIX_IMAGE_TEMPLATE_SCALE) {
return b64Template;
}

Expand Down