C#使用uiautomator

C#使用uiautomator

开发背景

uiautomator是Android平台上用于UI自动化测试的框架,可模拟用户对设备屏幕的各种操作,如点击、输入、滑动等。

Python中有相对成熟的解决方案,普遍应用于自动化测试中。 项目地址:

然而,近期在C#项目的开发进程中,我始终未能找到合适的解决方案。基于此状况,我计划借鉴该项目,着手打造一个C#版本的项目。

原理研究

首先先了解一下,该项目实现UIAutomator的原理。

实现原理
实现原理

简单来说,其实现原理是:在手机内开启一个rpc服务,然后PC端借助adb forward(adb转发)将该服务在手机中的端口转发至本地。随后,PC端向此服务发送诸如点击、输入之类的请求,手机中的该服务便会执行相应操作来完成这些请求。

尝试一下

通过以下指令,将U2.jar导入到设备中并启动一个端口固定为9008的服务端

bash
adb push u2.jar /data/local/tmp
adb shell "CLASSPATH=/data/local/tmp/u2.jar app_process / com.wetest.uia2.Main"

通过adb的端口转发功能,随机一个端口与9008形成映射

bash
adb forward tcp:1234 tcp:9008

此时python给本地的1234端口发送信息, 设备中的服务端也能同时接收到。

但是,还需要了解发送的是什么信息。通过修改python的uiautomator2源码(如下图所示),打印相关信息。

修改源码
修改源码

执行下面的代码

python
import uiautomator2 as u2
d = u2.connect()
d.press("home")

打印出

text
method: GET
url: http://127.0.0.1:1234/ping
data: None
return: b'pong'
=================
method: POST
url: http://127.0.0.1:1234/jsonrpc/0
data: {'jsonrpc': '2.0', 'id': 1, 'method': 'pressKey', 'params': ('home',)}
return: b'{"jsonrpc":"2.0","id":1,"result":true}\n'
=================

可以推测Get请求只是用来获取服务端的状态,具体的执行是需要发送Post请求的。关键则在于post请求中的data数据。

因此,只要C#也发送相同的请求,理论上也可以实现同样的效果。

代码实现

提醒

目前只实现了部分常用的功能

部分依赖

C#资源释放管理
adb相关功能封装

评论区

评论加载中...