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

 

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

Swipe代码:

package io.appium.android.bootstrap.handler;

import com.android.uiautomator.core.UiDevice;

import com.android.uiautomator.core.UiObjectNotFoundException;

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 swipe.

*

*/

public class Swipe extends CommandHandler {

/*

* @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 {

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

final Point start = new Point(params.get("startX"), params.get("startY"));

final Point end = new Point(params.get("endX"), params.get("endY"));

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

final UiDevice device = UiDevice.getInstance();

Point absStartPos = new Point();

Point absEndPos = new Point();

if (command.isElementCommand()) {

try {

final AndroidElement el = command.getElement();

absStartPos = el.getAbsolutePosition(start);

absEndPos = el.getAbsolutePosition(end, false);

} catch (final UiObjectNotFoundException e) {

return getErrorResult(e.getMessage());

} catch (final InvalidCoordinatesException e) {

return getErrorResult(e.getMessage());

} catch (final Exception e) { // handle NullPointerException

return getErrorResult("Unknown error");

}

} else {

try {

absStartPos = getDeviceAbsPos(start);

absEndPos = getDeviceAbsPos(end);

} catch (final InvalidCoordinatesException e) {

return getErrorResult(e.getMessage());

}

}

Logger.debug("Swiping from " + absStartPos.toString() + " to "

+ absEndPos.toString() + " with steps: " + steps.toString());

final boolean rv = device.swipe(absStartPos.x.intValue(),

absStartPos.y.intValue(), absEndPos.x.intValue(),

absEndPos.y.intValue(), steps);

if (!rv) {

return getErrorResult("The swipe did not complete successfully");

}

return getSuccessResult(rv);

}

}

先分析源码:

final Hashtable<String, Object> params = command.params();
final Point start = new Point(params.get("startX"), params.get("startY"));
final Point end = new Point(params.get("endX"), params.get("endY"));
final Integer steps = (Integer) params.get("steps");
final UiDevice device = UiDevice.getInstance();

Point absStartPos = new Point();
    Point absEndPos = new Point();

首先从命令里获取参数,后解析出3个变量:起始点start、终点end、步骤steps。然后获得设备对象,定义2个私有Point对象,以备后用。
然后分条件处理,处理控件还是处理坐标。

控件:

final AndroidElement el = command.getElement();
absStartPos = el.getAbsolutePosition(start);
absEndPos = el.getAbsolutePosition(end, false);

首先获取控件对象,再通过getAbsolutePosition传入不同的参数获得在该控件上点击的起始点和结束点。

public Point getAbsolutePosition(final Point point,

final boolean boundsChecking) throws UiObjectNotFoundException,

InvalidCoordinatesException {

final Rect rect = el.getBounds();

final Point pos = new Point();

Logger.debug("Element bounds: " + rect.toShortString());

if (point.x == 0) {

pos.x = rect.width() * 0.5 + rect.left;

} else if (point.x <= 1) {

pos.x = rect.width() * point.x + rect.left;

} else {

pos.x = rect.left + point.x;

}

if (boundsChecking) {

if (pos.x > rect.right || pos.x < rect.left) {

throw new InvalidCoordinatesException("X coordinate ("

+ pos.x.toString() + " is outside of element rect: "

+ rect.toShortString());

}

}

if (point.y == 0) {

pos.y = rect.height() * 0.5 + rect.top;

} else if (point.y <= 1) {

pos.y = rect.height() * point.y + rect.top;

} else {

pos.y = rect.left + point.y;

}

if (boundsChecking) {

if (pos.y > rect.bottom || pos.y < rect.top) {

throw new InvalidCoordinatesException("Y coordinate ("

+ pos.y.toString() + " is outside of element rect: "

+ rect.toShortString());

}

}

return pos;

}

上面的代码首先分析x坐标然后分析y坐标。x和y坐标的判断和处理时一样的

首先判断x坐标是否为0,如果为0,定义初始点的x坐标为控件的中心点的横坐标。如果x的坐标小于1,说明坐标为相对坐标,用百分比来求值,此时就要与宽度做乘积运算得到具体值。如果上面2种情况都不符合,那就是具体坐标值,那就直接元素的x坐标值加上控件的边框左坐标值。
最后根据传入的boolean值来判断是否做一个超出边界的验证。如果超出边界就跑出异常。y坐标的获取方式类似。最后得到坐标值并返回,回到execute方法中。

坐标

absStartPos = getDeviceAbsPos(start);
absEndPos = getDeviceAbsPos(end);

通过调用getDeviceAbsPos()方法得到坐标值来初始化之前声明的私有Point对象.

protected static Point getDeviceAbsPos(final Point point)

throws InvalidCoordinatesException {

final UiDevice d = UiDevice.getInstance();

final Point retPos = new Point(point); // copy inputed point

final Double width = (double) d.getDisplayWidth();

if (point.x < 1) {

retPos.x = width * point.x;

}

if (retPos.x > width || retPos.x < 0) {

throw new InvalidCoordinatesException("X coordinate ("

+ retPos.x.toString() + " is outside of screen width: "

+ width.toString());

}

final Double height = (double) d.getDisplayHeight();

if (point.y < 1) {

retPos.y = height * point.y;

}

if (retPos.y > height || retPos.y < 0) {

throw new InvalidCoordinatesException("Y coordinate ("

+ retPos.y.toString() + " is outside of screen height: "

+ height.toString());

}

return retPos;

}

类似于上面的方法,也是要先判断传过来的坐标值是否小于1,如果小于1,当作百分比来球坐标值。如果超出屏幕的范围抛出异常,最后返回坐标值回到execute方法。

final boolean rv = device.swipe(absStartPos.x.intValue(),
absStartPos.y.intValue(), absEndPos.x.intValue(),
absEndPos.y.intValue(), steps);

最后调用UiDevice.swipe方法来执行命令,判断是否执行成功。

总结
执行swipe命令有2中命令格式
a.控件
b.坐标
坐标又分为相对坐标百分比和绝对坐标两种方法。

手机自动化测试: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. HTML学习三

    今天主要学习的为JS和HTML标签的一起使用: 一.重定向: <html> <head> <title>JavaScript1</title> < ...

  2. web及H5 的链接测试

    1:先下载一个Xenu工具 2:安装完成之后,进入页面(将弹出框关闭) 3:进行设置(一般不用修改设置) 4:修改完成之后点击工具栏中的file按钮,并输入想要测试的URL地址 5:点击OK测试完成之 ...

  3. MySQL学习分享-->查询-->查询的分类

    MySQL的查询可以分为交叉联接.内联接.外联接.自然联接.straight_join 下面对于查询的学习,会用到以下四张表: create table t_commodity_type( `id` ...

  4. 多线程爬坑之路--并发,并行,synchonrized同步的用法

    一.多线程的并发与并行: 并发:多个线程同时都处在运行中的状态.线程之间相互干扰,存在竞争,(CPU,缓冲区),每个线程轮流使用CPU,当一个线程占有CPU时,其他线程处于挂起状态,各线程断续推进. ...

  5. HAproxy健康检查的三种方式

    1.通过监听端口进行健康检测 .这种检测方式,haproxy只会去检查后端server的端口,并不能保证服务的真正可用. 配置示例: listen http_proxy mode http cooki ...

  6. ajax三级联动下拉菜单

    ajax写三级联动,先写一个文件类吧,以后用的时候直接调用即可: 来找一张表: 实现: 中国地域的三级联动:省.市.区: 图: 说一下思路: (1)当用户选择省份的时候触发事件,把当前的省份的id通过 ...

  7. 作为一名JAVA程序员应该有怎样的就业思维

    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,在面试之前到底需要准备哪些东西呢?面试时面试官想了解你的什么专业技能,以下都是一个合格JAVA软件工程师所要具备的. 一.专业技能 1.熟 ...

  8. 万人迷”微信小程序似乎开始掉粉 为什么呢?

    "万人迷"微信小程序最近似乎开始掉粉. 距离1月9日小程序上线已有一周,相比浓烈的讨论气氛,用户的使用热情逐步降低,而部分公司开始撤离小程序. 其中,逻辑思维旗下产品"得 ...

  9. Ext JS 6学习文档–第1章–ExtJS入门指南

    Ext JS 入门指南 前言 本来我是打算自己写一个系列的 ExtJS 6 学习笔记的,因为 ExtJS 6 目前的中文学习资料还很少.google 搜索资料时找到了一本国外牛人写的关于 ExtJS ...

  10. spdlog源码阅读 (3): log_msg和BasicWriter

    4. log_msg和它的打手BasicWriter 在spdlog源码阅读 (2): sinks的创建和使用中,提到log_msg提供了存储日志的功能.那么到底在spdlog中它是怎么 起到这个作用 ...