时间:2014-11-04 来源:

AppiumAndroidBootstrap源码分析之命令解析执行 【数据库】

通过上一篇文章《Appium Android Bootstrap源码分析之控件AndroidElement》我们知道了Appium从pc端发送过来的命令如果是控件相关的话承接网页制作,最终目标控件在bootstrap中是以AndroidElement对象的方式呈现出来的,承接网页制作并且该控件对象会在AndroidElementHash维护的控件哈希表中保存起来.但是appium触发一个命令除了需要提供是否与控件相关这个信息外,html静态页面制作还需要其他的一些信息,网站div+css比如符合w3c标准,

真正执行的是传进来的AndroidCommand对应UiObject的getText方法

}

action()

public AndroidElement getElement() throws JSONException { String elId = (String) params(). get("elementId"); return AndroidElementsHash.getInstance(). getElement(elId); }

下面我们还是先看一下从pc端发过来的json的格式是怎么样的:

CommandHand

void

Description

Hashtable

Method

mandType 

ACTION,SHUTDOWN

安卓命令的类型,网页外包接活只有两种web前端制作,shutdown的处理方式和普通的action会不一样

返回

action/getElement

AndroidComma

action这个项并

JSONObject json;

ndType

HashMap<

CommandHan

从用户发过来的json命令信息得到真正的命令

中params项的子

可以看到里面除了params指定的是哪一个控件之外,div+css制作还指定了另外两个信息:

后从控件哈希表

execute

明是个控件相关的

命令承接网页制作, Object> params() throws JSONException { final JSONObject paramsObj = json.getJSONObject("params"); final Hashtable<String, Object>(); final Iterator<?> keys = paramsObj.keys(); while (keys.hasNext()) { final String param = (String) keys.next(); newParams.put(param,如果是以’element:’

CommandHandler

其成员函数execute就是通过字串命令找到map对应的handler然后执行的

AndroidCom

据json字串的

public String action() throws JSONException { if (isElementCommand()) { return json.getString("action"). substring(8); } return json.getString("action"); }

中params项的子

execute

getText

其他click,drag,然后

AndroidElement

Comment

从控件哈希表中

设置好cmdType

getElement

nd

Key Method

项elementId,然

’cmd’这个项的值

Type

来设置的AndroidCommand

虚拟类,div前端切图其他真实CommandHandler如click的父类

map是所有的命令字串和真实的CommandHandler的一个映射.

AndroidCommand

从表中的这些方法可以看出来web切图报价

令保存起来并根

构造函数构造函数符合w3c标准,把客户端过

json字串中的params项解析器

AndroidElement

1. Appium命令解析器AndroidCommand AndroidCommand这个类真实的作用其实就是去把Appium从pc端发送过来的那串json命令解析出来,手机html制作它拥有两个成员变量: JSONObject json; AndroidCommandType cmdType;json就是pc过来的json格式的那串命令网页外包接活,其实就是用来把这个类伪装成更像个命令类而已web前端制作,然后把这个类的名字改成AndroidCommandParser得了. 那么我们往下看下AndroidCommand究竟是怎么对客户端命令进行解析的承接网页制作,它的方法都很短,承接网页制作所以我把它做成一个表web切图报价, CommandTypeException { json = new JSONObject(jsonStr); setType(json.getString("cmd")); }

中找到目标

cmd: 这是一个action还是一个shutdownaction:如果是一个action的话符合w3c标准,那么是什么action 开始前我们先简要描述下我们需要涉及到几个关键类:

2. Action与CommandHandler的映射关系 从上面描述可以知道,手机html制作一个action就是一个代表该命令的字串网页外包接活,比如‘click’.但是一个字串是不能去执行的啊,网页外包接活所以我们需要有一种方式把它转换成可以执行的代码web前端制作, CommandHandler> map = new HashMap<String, new WaitForIdle()); map.put("clear", new Orientation()); map.put("swipe", new Flick()); map.put("drag", new Pinch()); map.put("click", new TouchLongClick()); map.put("touchDown", new TouchUp()); map.put("touchMove", new GetText()); map.put("setText", new GetName()); map.put("getAttribute", new GetDeviceSize()); map.put("scrollTo", new Find()); map.put("getLocation", new GetSize()); map.put("wake", new PressBack()); map.put("pressKeyCode", new LongPressKeyCode()); map.put("takeScreenshot", new UpdateStrings()); map.put("getDataDir", new MultiPointerGesture()); map.put("openNotification", new Source()); map.put("compressedLayoutHierarchy",以及对应的处理该action的类的实例符合w3c标准,其实这些类都是CommandHandler的子类基本上就只有一个:去实现CommandHandler的虚拟方法execute!要做的事情就大概就这几类: 控件相关的action:调用AndroidElement控件的成员变量UiObject el对应的方法来执行真实的操作UiDevice相关的action:调用UiDevice提供的方法UiScrollable相关的action:调用UiScrollable提供的方法UiAutomator那5个对象都没有的action:该调用InteractionController的就反射调用,html切图制作该调用QueryController的就反射调用.注意这两个类UiAutomator是没有提供直接调用的方法的网页外包接活, "Unknown command: " + command.action()); } } catch (final JSONException e) { Logger.error("Could not decode action/params of command"); return new AndroidCommandResult(WDStatus.JSON_DECODER_ERROR, please check format!"); } } 它首先叫上面的AndroidCommand解析器把json字串的action给解析出来然后通过刚提到的map把这个action对应的CommandHandler的实现类给实例化然后调用这个命令处理类的execute方法开始执行命令 3. 命令处理示例 我们这里就示例性的看下getText这个action对应的CommandHandler是怎么去通过AndroidElement控件进行设置文本的处理的: public class GetText 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 try { final AndroidElement el = command.getElement(); return getSuccessResult(el.getText()); } catch (final UiObjectNotFoundException e) { return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT, e.getMessage()); } catch (final Exception e) { // handle NullPointerException return getErrorResult("Unknown error"); } } else { return getErrorResult("Unable to get text without an element."); } } }关键代码就是里面通过AndroidCommand的getElement方法: 解析传进来的AndroidCommand实例保存的pc端过来的json字串,div前端切图找到’params‘项的子项’elementId'通过这个获得的id去控件哈希表(请查看《Appium Android Bootstrap源码分析之控件AndroidElement》)中找到目标AndroidElement控件对象 然后调用获得的AndroidElement控件对象的getText方法: 最终通过调用AndroidElement控件成员UiObject控件对象的getText方法取得控件文本信息 4. 小结 bootstrap接收到appium从pc端发送过来的json格式的键值对字串有多个项: cmd: 这是一个action还是一个shutdownaction:如果是一个action的话web切图报价,比如clickparams:拥有其他的一些子项符合w3c标准,比如指定操作控件在AndroidElementHash维护的控件哈希表的控件键值的'elementId' 在收到这个json格式命令字串后: AndroidCommandExecutor会调用AndroidCommand去解析出对应的action然后把action去map到对应的真实命令处理方法CommandHandler的实现子类对象中然后调用对应的对象的execute方法来执行命令

点击次数:10021
作者:
web前端行业资讯
Web new NewsList
微软发布WindowsServerBuild17074更新 ,,2018年01月18日凭借一个AI小功能,这款Google应用冲上苹果AppStore榜首 ,,2018年01月18日百度数据可视化实验室正式成立,发布深度学习可视化平台VisualDL ,,2018年01月18日OpenAI开源最新工具包,模型增大10倍只需额外增加20%计算时间 ,,2018年01月18日百度手机输入法8.0正式发布:支持多人语音速记 ,,2018年01月18日CSDN宣布收购TinyMind团队并升级为AI社区 ,,2018年01月18日甲骨文发布补丁修复英特尔芯片漏洞造成的问题 ,,2018年01月18日权威!官方发布CPU熔断和幽灵漏洞防范指引:附补丁下载 ,,2018年01月18日Oracle宣布新的JavaChampions ,,2018年01月18日腾讯加码区块链项目已悄然注册“以太锁”商标 ,,2018年01月18日Fedora28壁纸征集活动现已开幕:将持续至2月13日 ,,2018年01月18日苹果WebKit团队发布Speedometer2.0网页响应测试工具 ,,2018年01月18日百度输入法8.0后天发布:全感官AI输入 ,,2018年01月18日腾讯和乐高合作:共同研发智能玩具、游戏 ,,2018年01月18日HomePod上市日益临近智能音箱市场吸引力越来越大 ,,2018年01月18日3D打印脑组织?科学家正在向这一目标正在前进 ,,2018年01月18日英特尔公布修补漏洞后PC性能数据:8代CPU影响最小 ,,2018年01月18日云存储公司Dropbox秘密提交IPO申请估值超百亿美元 ,,2018年01月18日iPod之父:防手机上瘾无技术难度苹果谷歌应承担责任 ,,2018年01月18日芯片不安全英特尔云客户考虑转用AMD等对手处理器 ,,2018年01月18日2018年Java展望 ,,2018年01月18日区块链有多火?快播流量矿石遭20多万人疯抢 ,,2018年01月18日Intel搞定神经拟态芯片:模拟人类大脑、自主学习 ,,2018年01月18日阿里巴巴发布IoTConnect开放连接协议,盼推动语音互动入口普及 ,,2018年01月18日区块链火了,全球大佬们怎么看? ,,2018年01月18日Facebook正测试新功能主推本地新闻资讯 ,,2018年01月18日在GooglePlay中发现使用Kotlin开发的安卓恶意软件 ,,2018年01月18日VisualStudio201715.6预览版本2,增加新功能 ,,2018年01月18日百度陆奇:AI是5G最好的加速器 ,,2018年01月18日PinterestCEO:不同于谷歌和Facebook,我们走了第三条路 ,,2018年01月18日InternetOpenUrl()在DllMain中卡死的问题2015年04月28日Android5.0网络之多网络共存与应用 【系统运维】2015年07月16日HDU_2579_Datingwithgirls(2)(DFS) 【移动开发】2015年04月03日Tomcat启动异常java.lang.IllegalStateException:Unabletocompletethescanforannotations... 【系统运维】2015年08月27日PHP获取MSN好友列表的代码(2009-05-14测试通过)2014年01月29日jquery获取json数据实现代码2014年01月29日POP3IMAP邮件服务器Dovecot2.0.15发布 ,,2016年06月23日修改活动目录默认建立对象的容器位置! 【编程语言】2015年09月01日【独立开发者erCocos2d-x实战004】使用Cocos2dx加载plist文件 【综合】2015年07月16日Python科学计算的瑞士军刀——Anaconda安装与配置 【综合】2015年07月22日Json和其序列化和反序列化 【综合】2015年03月26日MFC学习之多对话框及列表控件 【综合】2014年12月19日ZOJ2770BurntheLinkedCamp差分约束 【编程语言】2015年07月16日考试系统之“实战判分” 【编程语言】2015年02月02日ListView下拉刷新【移动开发】2015年06月11日学习笔记6-Android查看应用输出的错误信息如何部署应用到真实手机发布软件【Web前端】2015年02月09日atitit.产品console日志的aticonsole方案处理总结【云计算】2015年04月01日shell学习笔记之六(测试和判断)【移动开发】2015年05月05日FFmpeg编程学习笔记一 【编程语言】2015年04月08日腾翼网为您提供100M免费空间服务2014年01月29日CSS+DIV网页样式与布局——滤镜【Web前端】2015年02月25日理解Android系统(一)【编程语言】2015年01月07日ios----UIScrollview循环滑动【移动开发】2015年03月17日JS旋转的彩色文字轮转特效2014年01月29日linuxshell编程之bash多命令顺序执行与管道符【数据库】2014年12月09日二级菜单关联 【Web前端】2015年07月01日hashCode方法的使用讲解2014年01月30日求解决!!!SystemVerilog在ModelSim中的编译与运行 【编程语言】2015年06月17日Hibernate-----16、事务控制 【编程语言】2015年05月25日【bzoj2818】【GCD】【数论】【编程语言】2015年08月31日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)