python uiautomator 源码学习(二) JosonRPCServer-Host Side

来源:互联网 发布:开淘宝店成本 编辑:程序博客网 时间:2024/05/17 07:19

python uiautomator 源码学习(二) josonRPCServer-Host Side

简介:

python uiautomator 与device 的沟通是通过jsonRPCServer 实现的,
Host 端用uiautomator启用 JsonRPCClient, DUT 用 JsonRPCServer。 如图:
JsonRPCServer
源码中跟JsonRPCServer 直接关系的有三个类:
uiautomator/init.py:

class JsonRPCError(Exception) #异常类class JsonRPCMethod(object) # JsonRPCServer 沟通实现方法class JsonRPCClient(object) # Client 类,JsonRPCMethod 封装

具体实现过程,可以参考上篇博客:
Python uiautomator 源码学习(一)

流程

让我们先看看简单方法实现过程(host端):

d.info => AutomatorDevice().info return self.jsonrpc.objInfo(self.selector) =>AutomatorServer().jsonrpc.objInfo(self.selector) =>JsonRPCClient(self.rpc_uri,timeout=int(os.environ.get("JSONRPC_TIMEOUT", 90)),method_class=_JsonRPCMethod).__getattr__(objInfo) return self.method_class(self.url, method, timeout=self.timeout)=> JsonRPCMethod(url, objInfo, timeout)()req = urllib2.Request(self.url,json.dumps(data).encode("utf-8"),{"Content-type": "application/json"}) result = urllib2.urlopen(req, timeout=self.timeout)jsonresult = json.loads(result.read().decode("utf-8")) return jsonresult["result"]

总结起来如图:
JsonRPCServer Host 实现过程

所以很明白了,都是通过json和urllib2来实现的, host 端只需要发reqs 到server等待。 那么可以手动去实现,如下:

d.info

Python 2.7.3 (default, Sep 26 2013, 20:03:06)[GCC 4.6.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import json,urllib2>>> url = "http://localhost:9008/jsonrpc/0">>> data = {'jsonrpc': '2.0', 'method': 'deviceInfo', 'id': '3da0f15ed14e1b374f85a697b6f3beab'}>>> req = urllib2.Request(url, json.dumps(data).encode("utf-8"), {"Content-type": "application/json"})>>> result = urllib2.urlopen(req, timeout=90)>>> jsonresult = json.loads(result.read().decode("utf-8"))>>> jsonresult{u'jsonrpc': u'2.0', u'id': u'3da0f15ed14e1b374f85a697b6f3beab', u'result': {u'displayRotation': 0, u'displaySizeDpY': 962, u'displaySizeDpX': 601, u'displayWidth': 800, u'productName': u'malata8', u'currentPackageName': u'com.google.android.googlequicksearchbox', u'sdkInt': 22, u'displayHeight': 1216, u'naturalOrientation': True}}

d.(packageName = “com.google.android.googlequicksearchbox”).click()

Python 2.7.3 (default, Sep 26 2013, 20:03:06)[GCC 4.6.3] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import json,urllib2>>> url = "http://localhost:9008/jsonrpc/0">>> data = {'params': ({'childOrSiblingSelector': [], u'packageName': u'com.google.android.googlequicksearchbox', 'mask': 524288, 'childOrSibling': []},), 'jsonrpc': '2.0', 'method': 'click', 'id': '6b9e56084acb39b78a75fced64f43da0'}>>> req = urllib2.Request(url, json.dumps(data).encode("utf-8"), {"Content-type": "application/json"})>>> result = urllib2.urlopen(req, timeout=90)>>> jsonresult = json.loads(result.read().decode("utf-8"))

补充

uiautomator-stub.jar 是base on nanohttpd 和 jsonrpc4j, 所以可以直接用jsonrpclib.
$pip install jsonrpclib

import jsonrpclibserver = jsonrpclib.Server('http://localhost:9008/jsonrpc/0')server.wakeUp()server.pressKey("home")server.pressKey("back")

JsonRPCServer Host 端我们算是大概了解了,下一篇将会继续学习DUT端JsonRPCServer

0 0
原创粉丝点击