click源代码
public AndroidCommandResult execute(final AndroidCommand command)
throws JSONException {
if (command.isElementCommand()) {
try {
final AndroidElement el = command.getElement();
el.click();
return getSuccessResult(true);
} catch (final UiObjectNotFoundException e) {
return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT,
e.getMessage());
} catch (final Exception e) { // handle NullPointerException
return getErrorResult("Unknown error");
}
} else {
final Hashtable<String, Object> params = command.params();
Point coords = new Point(Double.parseDouble(params.get("x").toString()),
Double.parseDouble(params.get("y").toString()) );
try {
coords = PositionHelper.getDeviceAbsPos(coords);
} catch (final UiObjectNotFoundException e) {
return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT,
e.getMessage());
} catch (final InvalidCoordinatesException e) {
return new AndroidCommandResult(WDStatus.INVALID_ELEMENT_COORDINATES,
e.getMessage());
}
final boolean res = UiDevice.getInstance().click(coords.x.intValue(), coords.y.intValue());
return getSuccessResult(res);
}
}
首先我们先看前面两句句吧
final AndroidElement el = command.getElement();
el.click();
通过command的方法 getElement获取到一个AndroidElement的对象。再调用该对象的click方法。其实在最开始的时候应该就说过,在API>18的系统下,appium采用的是UiAutomator的框架,那么的话在不看AndroidElement的情况下,我们应该也能够猜测出来,它里面肯定实际还是调用的是UiObject的click方法的,首先我们得先看看command.getElement里面做了啥。
public AndroidElement getElement() throws JSONException {
String elId = (String) params().get("elementId");
return AndroidElementsHash.getInstance().getElement(elId);
}
根据我们 appium源码分析(六)-find(下)的分析,这里上面的代码应该就很容易懂了,返回的是AndroidElement对象,里面就包含了UiObject el的元素,所以才可以调用el.click()方法。
再来就是剩余的如果参数中不包含elementId,说明点击的操作是针对于坐标来进行的。这里还是一样,进行了一些坐标的转换后,再调用uidevice的click方法。