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

 

poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。poptest测试开发工程师就业培训请大家咨询qq:908821478)移动端自动化测试是未来的测试工程师的技术要求,我们需要打好基础。

Flick

package io.appium.android.bootstrap.handler;

import com.android.uiautomator.core.UiDevice;

import io.appium.android.bootstrap.*;

import io.appium.android.bootstrap.exceptions.InvalidCoordinatesException;

import io.appium.android.bootstrap.utils.Point;

import org.json.JSONException;

import java.util.Hashtable;

/**

* This handler is used to flick elements in the Android UI.

*

* Based on the element Id, flick that element.

*

*/

public class Flick extends CommandHandler {

private Point calculateEndPoint(final Point start, final Integer xSpeed,

final Integer ySpeed) {

final UiDevice d = UiDevice.getInstance();

final Point end = new Point();

final double speedRatio = (double) xSpeed / ySpeed;

double xOff;

double yOff;

final double value = Math.min(d.getDisplayHeight(), d.getDisplayWidth());

if (speedRatio < 1) {

yOff = value / 4;

xOff = value / 4 * speedRatio;

} else {

xOff = value / 4;

yOff = value / 4 / speedRatio;

}

xOff = Integer.signum(xSpeed) * xOff;

yOff = Integer.signum(ySpeed) * yOff;

end.x = start.x + xOff;

end.y = start.y + yOff;

return end;

}

/*

* @param command The {@link AndroidCommand} used for this handler.

*

* @return {@link AndroidCommandResult}

*

* @throws JSONException

*

* @see io.appium.android.bootstrap.CommandHandler#execute(io.appium.android.

* bootstrap.AndroidCommand)

*/

@Override

public AndroidCommandResult execute(final AndroidCommand command)

throws JSONException {

Point start = new Point(0.5, 0.5);

Point end = new Point();

Double steps;

final Hashtable<String, Object> params = command.params();

final UiDevice d = UiDevice.getInstance();

if (command.isElementCommand()) {

AndroidElement el;

try {

el = command.getElement();

start = el.getAbsolutePosition(start);

final Integer xoffset = (Integer) params.get("xoffset");

final Integer yoffset = (Integer) params.get("yoffset");

final Integer speed = (Integer) params.get("speed");

steps = 1250.0 / speed + 1;

end.x = start.x + xoffset;

end.y = start.y + yoffset;

} catch (final Exception e) {

return getErrorResult(e.getMessage());

}

} else {

try {

final Integer xSpeed = (Integer) params.get("xSpeed");

final Integer ySpeed = (Integer) params.get("ySpeed");

final Double speed = Math.min(1250.0,

Math.sqrt(xSpeed * xSpeed + ySpeed * ySpeed));

steps = 1250.0 / speed + 1;

start = getDeviceAbsPos(start);

end = calculateEndPoint(start, xSpeed, ySpeed);

} catch (final InvalidCoordinatesException e) {

return getErrorResult(e.getMessage());

}

}

steps = Math.abs(steps);

Logger.debug("Flicking from " + start.toString() + " to " + end.toString()

+ " with steps: " + steps.intValue());

final boolean res = d.swipe(start.x.intValue(), start.y.intValue(),

end.x.intValue(), end.y.intValue(), steps.intValue());

if (res) {

return getSuccessResult(res);

} else {

return getErrorResult("Flick did not complete successfully");

}

}

}

代码的步骤和swipe类似,而且最终调用的也是UiDevice.swipe方法,那么我们来看看到底区别在什么地方。首先它也分控件和坐标,分别分析:

控件

首先将控件的中心点作为起始坐标,然后根据提供的参数xoffset和yoffset来获取位移数据,speed参数用来计算步骤。

steps = 1250.0 / speed + 1;
end.x = start.x + xoffset;
end.y = start.y + yoffset;

起始坐标加上位移就是结束坐标,这个steps的设置还是有点让人摸不着头脑的,我这个1250我且认为是最大位移吧,speed代表每一步走的路程。用1250/speed得到使用多少步到结束点,再加上初始值的那个点就得到steps的值啦。至此起始点坐标、结束点坐标、步骤的值都设置完毕。

坐标

严格来说,不能说成坐标,应该算坐标位移,因为才传入的参数其实坐标系的速度xSpeed和ySpeed。x轴移动xSpeed距离,y轴移动ySpeed坐标。然后获取坐标值和steps值。
其中它用1250和位移的平方做了一次比较,取出最小值来计算steps。起始坐标点定位屏幕的中心点坐标。然后再调用end = calculateEndPoint(start, xSpeed, ySpeed);方法获取结束点坐标。

private Point calculateEndPoint(final Point start, final Integer xSpeed,

final Integer ySpeed) {

final UiDevice d = UiDevice.getInstance();

final Point end = new Point();

final double speedRatio = (double) xSpeed / ySpeed;

double xOff;

double yOff;

final double value = Math.min(d.getDisplayHeight(), d.getDisplayWidth());

if (speedRatio < 1) {

yOff = value / 4;

xOff = value / 4 * speedRatio;

} else {

xOff = value / 4;

yOff = value / 4 / speedRatio;

}

xOff = Integer.signum(xSpeed) * xOff;

yOff = Integer.signum(ySpeed) * yOff;

end.x = start.x + xOff;

end.y = start.y + yOff;

return end;

}

首先计算位移比speedRatio(x的位移/y的位移),然后获取屏幕宽和高中最小的一个数复制给value.如果speedRatio<1,x的移动距离为value的值的1/4.y坐标为和x移动的距离是一样的。所以经过上面的计算得到的结束点的坐标和起始点组成的应该是正方型的对角线。

最后调用UiDevice.swipe和Swipe中是一样的啦。没什么特别的

手机自动化测试: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是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

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

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

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

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

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

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

随机推荐

  1. 丘吉尔,最后一次演讲-Never Give Up

    丘吉尔一生最精彩的演讲,也是他最后一次演讲.在剑桥大学的一次毕业典礼上,整个会堂有上万个学生,他们正在等待丘吉尔的出现.正在这时,丘吉尔在他的随从陪同下走进了会场并慢慢走向讲台,他脱下他的大衣交给随从 ...

  2. 2011 Multi-University Training Contest 1 - Host by HNU

    A.A + B problem(待填坑) B.Cat VS Dog(二分图匹配) 喜欢cat和喜欢dog的人构成了二分图,如果两个人有冲突则连一条边,则问题转化为二分图最大点独立集问题.ans=n-最 ...

  3. erlang erl文件编译的三种脚本

    方案1:命令行 #!/bin/sh #file name: erl.sh #author: stars #time:2015.06.05 #eg: ./erl.sh hello.erl start 2 ...

  4. 存储过程与SQL语句如何选择

    58到家数据库30条军规,有一条是“禁止使用存储过程.视图.触发器.Event”, 高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”, 并发量大的情况下,这些功能很可能 ...

  5. ETL kettle 数据调取防止意外停止处理

    pentaho kettle是目前使用比较广泛的一种etl工具 但是在使用的时候如做定时任务 会存在如果任务异常停止会发生数据不准或者丢失数据的情况 这种情况在<Pentho Kettle So ...

  6. iOS 访问URL转码

    访问URL时,需要对字符串进行转码: urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; ...

  7. samba服务搭建

    文件传输 smb主配置文件 /etc/samba/smb.conf? yum install samba samba-client 要启动smb和nmb服务 修改安全级别 security = sha ...

  8. Android性能测试工具Emmagee

    下面介绍一个简单实用的Android性能软件 ~~欢迎加入测试群574875837一起讨论研究 一.Emmagee 简介 Emmagee主要用于监控单个App的CPU,内存,流量,启动耗时,电量,电流 ...

  9. Git基础教程(二)

    继续上篇Git基础教程(一),在开篇之前,先回顾一下上篇中的基本命令. 配置命令:git config --global * 版本库初始化:git init 向版本库添加文件:git add * 提交 ...

  10. iOS集成友盟推送

    之前有写过利用Python自己写一个推送服务器, 今天说下如果集成友盟的推送服务 在这之前我们需要做一些准备动作 #1. 注册一个App ID #2. Enable Push Notification ...