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

 

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

GetName

package io.appium.android.bootstrap.handler;

import com.android.uiautomator.core.UiObjectNotFoundException;

import io.appium.android.bootstrap.*;

import org.json.JSONException;

/**

* This handler is used to get the text of elements that support it.

*/

public class GetName 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 {

if (!command.isElementCommand()) {

return getErrorResult("Unable to get name without an element.");

}

try {

final AndroidElement el = command.getElement();

return getSuccessResult(el.getContentDesc());

} catch (final UiObjectNotFoundException e) {

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

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

return getErrorResult("Unknown error");

}

}

}

最终会调用UiObject.getContentDescription()方法获得控件当描述信息

GetAttribute

package io.appium.android.bootstrap.handler;

import com.android.uiautomator.core.UiObjectNotFoundException;

import io.appium.android.bootstrap.*;

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

import org.json.JSONException;

import java.util.Hashtable;

/**

* This handler is used to get an attribute of an element.

*

*/

public class GetAttribute 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 {

if (command.isElementCommand()) {

// only makes sense on an element

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

try {

final AndroidElement el = command.getElement();

final String attr = params.get("attribute").toString();

if (attr.equals("name") || attr.equals("text")

|| attr.equals("className")) {

return getSuccessResult(el.getStringAttribute(attr));

} else {

return getSuccessResult(String.valueOf(el.getBoolAttribute(attr)));

}

} catch (final NoAttributeFoundException e) {

return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT,

e.getMessage());

} catch (final UiObjectNotFoundException e) {

return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT,

e.getMessage());

} catch (final Exception e) { // el is null

return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT,

e.getMessage());

}

} else {

return getErrorResult("Unable to get attribute without an element.");

}

}

}

该事件是为获取控件相关信息设置的,来看看可以获取哪些信息,其实就是uiautomatorviewer里的信息。

public String getStringAttribute(final String attr)

throws UiObjectNotFoundException, NoAttributeFoundException {

String res;

if (attr.equals("name")) {

res = getContentDesc();

if (res.equals("")) {

res = getText();

}

} else if (attr.equals("text")) {

res = getText();

} else if (attr.equals("className")) {

res = getClassName();

} else {

throw new NoAttributeFoundException(attr);

}

return res;

}

文本值:content-desc、text、className.

public boolean getBoolAttribute(final String attr)

throws UiObjectNotFoundException, NoAttributeFoundException {

boolean res;

if (attr.equals("enabled")) {

res = el.isEnabled();

} else if (attr.equals("checkable")) {

res = el.isCheckable();

} else if (attr.equals("checked")) {

res = el.isChecked();

} else if (attr.equals("clickable")) {

res = el.isClickable();

} else if (attr.equals("focusable")) {

res = el.isFocusable();

} else if (attr.equals("focused")) {

res = el.isFocused();

} else if (attr.equals("longClickable")) {

res = el.isLongClickable();

} else if (attr.equals("scrollable")) {

res = el.isScrollable();

} else if (attr.equals("selected")) {

res = el.isSelected();

} else if (attr.equals("displayed")) {

res = el.exists();

} else {

throw new NoAttributeFoundException(attr);

}

return res;

}

boolean类型的值:如上等等。

GetDeviceSize

package io.appium.android.bootstrap.handler;

import com.android.uiautomator.core.UiDevice;

import io.appium.android.bootstrap.AndroidCommand;

import io.appium.android.bootstrap.AndroidCommandResult;

import io.appium.android.bootstrap.CommandHandler;

import org.json.JSONException;

import org.json.JSONObject;

/**

* This handler is used to get the size of the screen.

*

*/

public class GetDeviceSize 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) {

if (!command.isElementCommand()) {

// only makes sense on a device

final UiDevice d = UiDevice.getInstance();

final JSONObject res = new JSONObject();

try {

res.put("height", d.getDisplayHeight());

res.put("width", d.getDisplayWidth());

} catch (final JSONException e) {

getErrorResult("Error serializing height/width data into JSON");

}

return getSuccessResult(res);

} else {

return getErrorResult("Unable to get device size on an element.");

}

}

}

获取屏幕的长和宽,调用的是UiDevice的方法:getDisplayHeight()和getDisplayWidth()

GetSize

package io.appium.android.bootstrap.handler;

import android.graphics.Rect;

import com.android.uiautomator.core.UiObjectNotFoundException;

import io.appium.android.bootstrap.*;

import org.json.JSONException;

import org.json.JSONObject;

/**

* This handler is used to get the size of elements that support it.

*

*/

public class GetSize 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 {

if (command.isElementCommand()) {

// Only makes sense on an element

final JSONObject res = new JSONObject();

try {

final AndroidElement el = command.getElement();

final Rect rect = el.getBounds();

res.put("width", rect.width());

res.put("height", rect.height());

} catch (final UiObjectNotFoundException e) {

return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT,

e.getMessage());

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

return getErrorResult("Unknown error");

}

return getSuccessResult(res);

} else {

return getErrorResult("Unable to get text without an element.");

}

}

}

获取控件的宽和高,调用的是UiObject的getBounds()。得到一个矩形,然后获得其宽和高。

GetLocation

package io.appium.android.bootstrap.handler;

import android.graphics.Rect;

import io.appium.android.bootstrap.*;

import org.json.JSONException;

import org.json.JSONObject;

/**

* This handler is used to get the text of elements that support it.

*

*/

public class GetLocation 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 {

if (!command.isElementCommand()) {

return getErrorResult("Unable to get location without an element.");

}

try {

final JSONObject res = new JSONObject();

final AndroidElement el = command.getElement();

final Rect bounds = el.getBounds();

res.put("x", bounds.left);

res.put("y", bounds.top);

return getSuccessResult(res);

} catch (final Exception e) {

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

}

}

}

获取控件的起始点坐标。调用的也是getBounds,然后得到其起始点的x,y 坐标

GetDataDir

package io.appium.android.bootstrap.handler;

import android.os.Environment;

import io.appium.android.bootstrap.AndroidCommand;

import io.appium.android.bootstrap.AndroidCommandResult;

import io.appium.android.bootstrap.CommandHandler;

/**

* This handler is used to get the data dir.

*

*/

public class GetDataDir 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) {

return getSuccessResult(Environment.getDataDirectory());

}

}

获取data的根目录。调用的是android的api:Environment.getDataDirectory()

手机自动化测试: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. [故障公告]博客站点遭遇超过20G的流量攻击被阿里云屏蔽

    2017年2月21日17:34,突然收到阿里云的通知: 您的IP受到攻击流量已超过云盾DDoS基础防护的带宽峰值,服务器的所有访问已被屏蔽,如果35分钟后攻击停止将自动解除否则会延期解除... 紧接着 ...

  2. android学习11——Handler,Looper,MessageQueue工作原理

    Message是Handler接收和处理的消息对象. 每个线程只能拥有一个Looper.它的loop方法读取MessageQueue中的消息,读到消息之后就把消息交给发送该消息的Handler进行处理 ...

  3. 从CMOS到触发器(一)

    作为一个学微电子专业的IC learner,这个学期也有一门课:<微电子器件>,今天我就来聊聊基本的器件:CMOS器件及其电路.在后面会聊聊锁存器和触发器. 今天的主要内容如下所示: ·M ...

  4. Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用

    前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WH 一.JDBC是什么? Java Data Base Connectivity,java数据库连接,在 ...

  5. 每天一个linux命令(28)--gzip命令

    减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip 是在Linux 系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用.gzip 不仅 ...

  6. 关于Android App开发技术分类的一个小总结

     前言 本文从热更新.异步并发.性能优化.网络请求等多个方面对Android App开发的技术进行了一个分类总结.欢迎大家沟通交流. 热更新 [原]热更新开源项目Tinker源码解析之Dex热更新 [ ...

  7. jQuery的基本操作

    jQuery就是一个js的库· 主要分为两部分:            1·寻找元素         (选择器,筛选器)            2·操作元素          (CSS的操作,属性的操 ...

  8. PHP数据访问批量删除(10261101)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 使用Nginx+CppCMS构建高效Web应用服务器

    使用Nginx+CppCMS构建高效Web应用服务器 1:Why当前,越来越多的网站使用了各种框架,大部分框架使用了脚本语言.半编译语言等.比如Java.Python.Php.C#.NET等.这些框架 ...

  10. Asp.Net 常用工具类---Config操作(7)

    近期工作比较忙,忙到忘记写博客(自己的借口,主要加班下班后不想动). 月初的时候,打算每两天写一篇博文,分享自己的一些心得和开发体验,无奈现在只写到第六篇,然而时间已经是20号,岁月不饶人! 总想写点 ...