import _ from 'lodash';
import { errors } from 'appium-base-driver';
import { FakeElement } from '../fake-element';
let commands = {}, helpers = {}, extensions = {};
helpers.getExistingElementForNode = function getExistingElementForNode (node) {
for (let [id, el] of _.toPairs(this.elMap)) {
if (el.node === node) {
return id;
}
}
return null;
};
helpers.wrapNewEl = function wrapNewEl (obj) {
// first check and see if we already have a ref to this element
let existingElId = this.getExistingElementForNode(obj);
if (existingElId) {
return {ELEMENT: existingElId};
}
// otherwise add the element to the map
this.maxElId++;
this.elMap[this.maxElId.toString()] = new FakeElement(obj, this.appModel);
return {ELEMENT: this.maxElId.toString()};
};
helpers.findElOrEls = async function findElOrEls (strategy, selector, mult, ctx) {
let qMap = {
'xpath': 'xpathQuery',
'id': 'idQuery',
'accessibility id': 'idQuery',
'class name': 'classQuery',
'tag name': 'classQuery'
};
// TODO this error checking should probably be part of MJSONWP?
if (!_.includes(_.keys(qMap), strategy)) {
throw new errors.UnknownCommandError();
}
if (selector === 'badsel') {
throw new errors.InvalidSelectorError();
}
let els = this.appModel[qMap[strategy]](selector, ctx);
if (els.length) {
if (mult) {
let allEls = [];
for (let el of els) {
allEls.push(this.wrapNewEl(el));
}
return allEls;
} else {
return this.wrapNewEl(els[0]);
}
} else if (mult) {
return [];
} else {
throw new errors.NoSuchElementError();
}
};
commands.findElement = async function findElement (strategy, selector) {
return this.findElOrEls(strategy, selector, false);
};
commands.findElements = async function findElements (strategy, selector) {
return this.findElOrEls(strategy, selector, true);
};
commands.findElementFromElement = async function findElementFromElement (strategy, selector, elementId) {
let el = this.getElement(elementId);
return this.findElOrEls(strategy, selector, false, el.xmlFragment);
};
commands.findElementsFromElement = async function findElementsFromElement (strategy, selector, elementId) {
let el = this.getElement(elementId);
return this.findElOrEls(strategy, selector, true, el.xmlFragment);
};
Object.assign(extensions, commands, helpers);
export { commands, helpers};
export default extensions;
import { errors } from 'appium-base-driver';
import strategies from './strategies';
import log from '../logger';
let commands = {};
let extensions = {};
commands.getAttribute = async function getAttribute (elementId, attribute) {
const element = await this.findElOrEls(strategies.ELEMENT_ID, elementId);
return element.attributes[attribute];
};
commands.getName = async function getName (elementId) {
const element = await this.findElOrEls(strategies.ELEMENT_ID, elementId);
return element.tag;
};
commands.elementDisplayed = async function elementDisplayed (elementId) {
const element = await this.findElOrEls(strategies.ELEMENT_ID, elementId);
return element.isDisplayed;
};
commands.elementEnabled = async function elementEnabled (elementId) {
return await this.elementDisplayed(elementId);
};
commands.elementSelected = async function elementSelected (elementId) {
const element = await this.findElOrEls(strategies.ELEMENT_ID, elementId);
return element.isFocused;
};
commands.setValue = async function setValue (keys, elementId) {
const element = await this.findElOrEls(strategies.ELEMENT_ID, elementId);
await element.append(keys);
};
commands.replaceValue = async function replaceValue (keys, elementId) {
const element = await this.findElOrEls(strategies.ELEMENT_ID, elementId);
await element.type(keys);
};
commands.setValueImmediate = async function setValueImmediate (keys, elementId) {
await this.replaceValue(keys, elementId);
};
commands.getText = async function getText (elementId) {
const element = await this.findElOrEls(strategies.ELEMENT_ID, elementId);
return element.text;
};
commands.getSize = async function getSize (elementId) {
const element = await this.findElOrEls(strategies.ELEMENT_ID, elementId);
if (!element.bounds) {
return log.errorAndThrow(new errors.ElementNotVisibleError());
}
return { width: element.bounds.width, height: element.bounds.height };
};
commands.getLocation = async function getLocation (elementId) {
const node = await this.findElOrEls(strategies.ELEMENT_ID, elementId);
if (!node) {
return log.errorAndThrow(new errors.ElementNotVisibleError());
}
return { x: node.bounds.x, y: node.bounds.y };
};
commands.getElementRect = async function getElementRect (elementId) {
const element = await this.findElOrEls(strategies.ELEMENT_ID, elementId);
if (!element.bounds) {
return log.errorAndThrow(new errors.ElementNotVisibleError());
}
return element.bounds;
};
commands.click = async function click (elementId) {
const element = await this.findElOrEls(strategies.ELEMENT_ID, elementId);
await element.select(this.ecp);
};
commands.clear = async function clear (elementId) {
await this.replaceValue('', elementId);
};
commands.active = async function active () {
return await this.findElOrEls(strategies.CSS_SELECTOR, '[focused="true"]:not(:has([focused="true"]))');
};
Object.assign(extensions, commands);
export {commands};
export default extensions;