手机自动化测试:appium源码分析之bootstrap十七

 

poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478。

MultiPointerGesture

package io.appium.android.bootstrap.handler;

import android.view.MotionEvent.PointerCoords;

import com.android.uiautomator.common.ReflectionUtils;

import io.appium.android.bootstrap.*;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import java.lang.reflect.Method;

import static io.appium.android.bootstrap.utils.API.API_18;

public class MultiPointerGesture extends CommandHandler {

private double computeLongestTime(final JSONArray actions)

throws JSONException {

double max = 0.0;

for (int i = 0; i < actions.length(); i++) {

final JSONArray gestures = actions.getJSONArray(i);

final double endTime = gestures.getJSONObject(gestures.length() - 1)

.getDouble("time");

if (endTime > max) {

max = endTime;

}

}

return max;

}

private PointerCoords createPointerCoords(final JSONObject obj)

throws JSONException {

final JSONObject o = obj.getJSONObject("touch");

final int x = o.getInt("x");

final int y = o.getInt("y");

final PointerCoords p = new PointerCoords();

p.size = 1;

p.pressure = 1;

p.x = x;

p.y = y;

return p;

}

@Override

public AndroidCommandResult execute(final AndroidCommand command)

throws JSONException {

try {

final PointerCoords[][] pcs = parsePointerCoords(command);

if (command.isElementCommand()) {

final AndroidElement el = command.getElement();

if (el.performMultiPointerGesture(pcs)) {

return getSuccessResult("OK");

} else {

return getErrorResult("Unable to perform multi pointer gesture");

}

} else {

if (API_18) {

final ReflectionUtils utils = new ReflectionUtils();

final Method pmpg = utils.getControllerMethod("performMultiPointerGesture",

PointerCoords[][].class);

final Boolean rt = (Boolean) pmpg.invoke(utils.getController(),

(Object) pcs);

if (rt) {

return getSuccessResult("OK");

} else {

return getErrorResult("Unable to perform multi pointer gesture");

}

} else {

Logger.error("Device does not support API < 18!");

return new AndroidCommandResult(WDStatus.UNKNOWN_ERROR,

"Cannot perform multi pointer gesture on device below API level 18");

}

}

} catch (final Exception e) {

Logger.debug("Exception: " + e);

e.printStackTrace();

return new AndroidCommandResult(WDStatus.UNKNOWN_ERROR, e.getMessage());

}

}

private PointerCoords[] gesturesToPointerCoords(final double maxTime,

final JSONArray gestures) throws JSONException {

// gestures, e.g.:

// [

// {"touch":{"y":529.5,"x":120},"time":0.2},

// {"touch":{"y":529.5,"x":130},"time":0.4},

// {"touch":{"y":454.5,"x":140},"time":0.6},

// {"touch":{"y":304.5,"x":150},"time":0.8}

// ]

// From the docs:

// "Steps are injected about 5 milliseconds apart, so 100 steps may take

// around 0.5 seconds to complete."

final int steps = (int) (maxTime * 200) + 2;

final PointerCoords[] pc = new PointerCoords[steps];

int i = 1;

JSONObject current = gestures.getJSONObject(0);

double currentTime = current.getDouble("time");

double runningTime = 0.0;

final int gesturesLength = gestures.length();

for (int j = 0; j < steps; j++) {

if (runningTime > currentTime && i < gesturesLength) {

current = gestures.getJSONObject(i++);

currentTime = current.getDouble("time");

}

pc[j] = createPointerCoords(current);

runningTime += 0.005;

}

return pc;

}

private PointerCoords[][] parsePointerCoords(final AndroidCommand command)

throws JSONException {

final JSONArray actions = (org.json.JSONArray) command.params().get(

"actions");

final double time = computeLongestTime(actions);

final PointerCoords[][] pcs = new PointerCoords[actions.length()][];

for (int i = 0; i < actions.length(); i++) {

final JSONArray gestures = actions.getJSONArray(i);

pcs[i] = gesturesToPointerCoords(time, gestures);

}

return pcs;

}

}

多点触控根据你传递过来的参数决定,如果参数是一个控件元素,那么就要调用performMultiPointerGesture方法,如果参数是一系列的点,那么就要调用反射。那么具体来看看2个方法细节。

控件

performMultiPointerGesture

public boolean performMultiPointerGesture(PointerCoords[] ...touches) {

try {

if (API_18) {

// The compile-time SDK expects the wrong arguments, but the runtime

// version in the emulator is correct. So we cannot do:

//   `return el.performMultiPointerGesture(touches);`

// Instead we need to use Reflection to do it all at runtime.

Method method = this.el.getClass().getMethod("performMultiPointerGesture", PointerCoords[][].class);

Boolean rt = (Boolean)method.invoke(this.el, (Object)touches);

return rt;

} else {

Logger.error("Device does not support API < 18!");

return false;

}

} catch (final Exception e) {

Logger.error("Exception: " + e + " (" + e.getMessage() + ")");

return false;

}

}

UiObject中有直接可以调用的performMultiPointerGesture方法,为什么还要用反射呢。上面的方法里的注释是这样解释的:编译的时候sdk会认为参数是错误的,但是运行时却认为是正确的,所以只有在运行时调用才能保证正确性。反射调用的就是运行时的环境,所以它使用了反射调用了performMultiPointerGesture。

点组

在api18以上的版本中才有传点组的方法可调用,所以先判断sdk的版本。如果api在18以上,那么就要调用InteractionController..performMultiPointerGesture的方法来执行

手机自动化测试:appium源码分析之bootstrap十七的更多相关文章

  1. 手机自动化测试:appium源码分析之bootstrap三

    手机自动化测试:appium源码分析之bootstrap三   研究bootstrap源码,我们可以通过代码的结构,可以看出来appium的扩展思路和实现方式,从中可以添加我们自己要的功能,针对app ...

  2. 手机自动化测试:appium源码分析之bootstrap二

    手机自动化测试:appium源码分析之bootstrap二   在bootstrap项目中的io.appium.android.bootstrap.handler包中的类都是对应的指令类, priva ...

  3. 手机自动化测试:appium源码分析之bootstrap一

    手机自动化测试:appium源码分析之bootstrap一   前言: poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.popte ...

  4. 手机自动化测试:appium源码分析之bootstrap十六

    手机自动化测试:appium源码分析之bootstrap十六   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

  5. 手机自动化测试:appium源码分析之bootstrap十五

    手机自动化测试:appium源码分析之bootstrap十五   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

  6. 手机自动化测试:appium源码分析之bootstrap十四

    手机自动化测试:appium源码分析之bootstrap十四   poptest(www.poptest.cn)是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开 ...

  7. 手机自动化测试:appium源码分析之bootstrap十三

    手机自动化测试:appium源码分析之bootstrap十三   poptest(www.poptest.cn)是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开 ...

  8. 手机自动化测试:appium源码分析之bootstrap十一

    手机自动化测试:appium源码分析之bootstrap十一   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

  9. 手机自动化测试:appium源码分析之bootstrap十二

    手机自动化测试:appium源码分析之bootstrap十二   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

随机推荐

  1. 纪中集训 Day 7

    今天超级不爽啊啊啊啊 尼玛我三道题都想出来了就是没对一道,第一题没理负数尼玛题目没告诉我,第二题尼玛题目也没说最近的点是第(l+r)/2而不是距离为(a[l]+a[r])/2啊啊啊啊,第三题没打GCD ...

  2. C++_运算符重载

    什么是运算符的重载? 运算符与类结合,产生新的含义. 为什么要引入运算符重载? 作用:为了实现类的多态性(多态是指一个函数名有多种含义) 怎么实现运算符的重载? 方式:类的成员函数 或 友元函数(类外 ...

  3. web前端的发展态势 浅识

    以前 作为一个java程序员写的代码主要还是后台的代码,虽然开始的时候前后端都写,但是也是用别人造好的轮子来用,学学html,css,js,jquery,再找一个前端ui框架学学,上手之后我们就可以写 ...

  4. Spark集群搭建_Standalone

    2017年3月1日, 星期三 Spark集群搭建_Standalone Driver:    node1    Worker:  node2    Worker:  node3 1.下载安装 下载地址 ...

  5. 一个基于Behave框架的http接口测试实例

    前言:本人没怎么做过http接口测试,只是最近学习了一下,Behave框架也是最近学习的,如果有不对的请各位大神指点,感谢! 1.1       接口准备 本次get请求的接口用的是百度接口:wd=搜 ...

  6. 使用Visual Studio 2017作为Linux C++开发工具

    Visual Studio 2017 微软的宇宙第一IDE Visual Studio 2017正式版出来了,地址是:https://www.visualstudio.com/vs/whatsnew/ ...

  7. loadrunner入门篇-Analysis 分析器

    analysis简介 分析器就是对测试结果数据进行分析的组件,它是LR三大组件之一,保存着大量用来分析性能测试结果的数据图,但并不一定要对每个视图进行分析,可以根据实际情况选择相关的数据视图进行分析, ...

  8. 出现java.lang.reflect.UndeclaredThrowableException异常

    解决方案:1.看导进来的项目是否有中文路径.2.看是否有get.set方法没写.3.和部署的环境有关.比如,是否写了构造函数.EJB需要.

  9. wemall app商城源码Fragment中监听onKey事件

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发Fragment中监听onK ...

  10. Yii2 Pjax 与 ActionForm ,不刷新提交数据

    <?php yii\widgets\Pjax::begin(['id'=>'phoneDetail']);?> <?php $form = ActiveForm::begin( ...