Python uiautomator 源码学习(一)

来源:互联网 发布:backbone.js 教程 编辑:程序博客网 时间:2024/06/04 18:15

python uiautomator wrapper 源码学习

首先感谢xiaocong,让python的developer可以轻松的操控android automation。
利用jsonRPCServer实现python与 android uiautomator的沟通的确是最易懂最方便的方法。

本文主要是对python uiautomator wrapper的学习。 JsonRPCServer 在下章再讲。

安装及使用

请参考官网: https://github.com/xiaocong/uiautomator
安装

$git clone https://github.com/xiaocong/uiautomator.git$cd uiautomator$sudo python setup.py install   

or

$sudo pip install uiautomator

使用

import uiautomator as uid = ui.Device("<serial>")d = ui.device

源码解析:

我的源码位置: /usr/local/lib/python2.7/dist-packages/uiautomator/init.py

Start:

import uiautomator as uid = ui.Device("xxxxxx")  --> d = AutomatorDevice("xxxxx")  # 创建指定serial 的device objectd = ui.device --> d = AutomatorDevice() #创建未指定device serial 的object

接下来我们就看看源码中的工作流程
最主要的8个类及他们的关系是:
Uiautomator
Selector(dict): 负责数据存取修改,与jsonprcserver 一起完成控件动作的交互

  • 继承dict
  • 初始化数据 __fields
  • 重写功能 __setitem__/__delitem__
  • 增加功能 clone/child/sibling 等。

Adb(object): adb 工具封装类,不做过多介绍
AutomatorServer(object): 主要用于RPC server的操作, start/stop/communicate with JsonRPCClient()

  • self.adb = Adb(serial)
  • 定义self.device_port
  • self.jsonrpc @property

AutomatorDevice(object): Device 对象类,这里是uiautomator的入口

  • 提供device对象基本功能,如press、screenshot、等
  • __call__(self) --> return AutomatorDeviceObject(self, Selector(**kwargs)) #寻访控件的时候(callable)用到,如uiautomator.device(packageName = "com.google.android.googlequicksearchbox")

AutomatorDeviceUiObject(object): UiObject 父类

  • 基本控件操作

AutomatorDeviceNamedUiObject(AutomatorDeviceUiObject): 基于text、instance、description的UiObject

  • 在AutomatorDeviceObject() 接到child_by_text/child_by_description/child_by_instance 等时被调用。
  • return self

AutomatorDeviceObject(AutomatorDeviceUiObject): UiObject 默认类,在device对象被call的时候就会被实例化。

  • 控件基本操作

流程:

d = uiautomator.deviced.click(x,y) ==> AutomatorDevice().click(x,y) ==> AutomatorDevice().jsonrpc.click(x, y) ==> JsonRPCClient(*args,**kwargs) ==> DUT
Created with Raphaël 2.1.2d = uiautomator.deviced.click(x,y)AutomatorDevice().click(x,y)AutomatorDevice().jsonrpc.click(x, y)JsonRPCClient(*args,**kwargs)DUT
d = uiautomator.deviced(className="android.widget.ListView").child(text="Bluetooth")
Created with Raphaël 2.1.2d = uiautomator.deviced(className="android.widget.ListView").child(text="Bluetooth")AutomatorDevice().__call__(**kwargs)AutomatorDeviceObject(device,selector).child(args)Selector().child() and return AutomatorDeviceObject结束
d = uiautomator.deviced(className="android.widget.ListView").child_by_text("Bluetooth")
Created with Raphaël 2.1.2d = uiautomator.deviced(className="android.widget.ListView").child_by_text("Bluetooth")AutomatorDevice().__call__(**kwargs)AutomatorDeviceObject(device,selector).child_by_text(args)AutomatorDeviceNamedUiObject(device,name)结束

结语:
python uiautomator 代码简洁方便开发。 但它依赖于android.Uiautomator/ josonrpcserver. 因此,在稳定性、performance部分难免会有瓶颈。
期待着xiaocong的uiautomator有更好地突破。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 订了产品一直收不到货怎么办 微信零钱提现忘记密码怎么办 微信里面的零钱忘记密码怎么办 微信的零钱密码丢了怎么办 微信公众号被屏蔽了所有功能怎么办 刚开淘宝店没信誉要怎么办 如果发现货品有问题商家不换怎么办 文件夹里面的图片怎么拖不动怎么办 网赌系统维护审核就不给提款怎么办 客户说我卖的东西是假货怎么办 微信小程序第三方平台倒闭了怎么办 金立手机锁屏密码忘了怎么办 不知道微信账号的公众号密码怎么办 微信公众号充话费充错号码怎么办 蜻蜓商城三天免流业务退不了怎么办 日上免税店提货日期写错了怎么办 微信公众平台账号名密码忘了怎么办 有人扬言要搞垮我的店铺怎么办 招行信用卡签到积分未领取怎么办 怎么办照片发送到邮微信箱里去 苹果手机备忘录没刪除就没了怎么办 因恶意刷公众号而被微信封号怎么办 禁停路段发生剐蹭怎么办办 新三板公司退市了 小股东怎么办? 爱用商城发货没有物流信息怎么办 拼多多的快递的运单号发错了怎么办 追光娱乐账号被别人盗用了怎么办啊 用鲁大师检测硬盘出现损坏怎么办 客户拖款迟迟不给给怎么办 百度云盘文件密码忘记了怎么办 用来注册亚马逊的公司注销了怎么办 亚马逊中国卖家太多美国卖家怎么办 付款了!卖家不想卖了怎么办? 手机通讯录同步助手密码忘了怎么办 毕业生学位信息照片上传错了怎么办 报名计算机二级照片上传很慢怎么办 网上报名时照片上传错了怎么办 特岗教师报名时照片上传模糊怎么办 百家号申请过新手被拒绝三次怎么办 6岁儿童个子高不长肉体形瘦怎么办 网页游戏加载完毕卡了不动怎么办