星屿浅奈 ✧ Saneko

Back

CSharp使用uiautomatorBlur image

开发背景#

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

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

openatx / uiautomator2

Waiting for api.github.com...

???
???
???
?????

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

原理研究#

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

实现原理

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

尝试一下#

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

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

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

adb forward tcp:1234 tcp:9008
bash

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

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

修改源码

执行下面的代码

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

打印出

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'
=================
bash

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

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

代码实现#

CSharp使用uiautomator
https://saneko.me/blog/61a998371702
Author Saneko
Published at February 7, 2025
Buy me a cup of coffee ☕.
Comment seems to stuck. Try to refresh?✨