-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Home
尝试手机连接PC,然后运行下面的命令
```
adb shell am instrument -w -r -e debug false -e class com.github.uiautomator.stub.Stub \
com.github.uiautomator.test/android.support.test.runner.AndroidJUnitRunner
```
如果运行正常,启动测试之前增加一行代码`d.healthcheck()`
如果报错,可能是缺少某个设备组件没有安装,使用下面的命令重新初始化 python -m uiautomator2 init --reinstall
可能是atx-agent没有在运行。
```bash
# 检查是否运行的方法
> adb shell
$ ps | grep atx # 如果看到atx-agent则表示正在运行
# 启动atx-agent
$ /data/local/tmp/atx-agent -d
# 停止atx-agent
$ /data/local/tmp/atx-agent -stop
```
Other: https://github.com/openatx/uiautomator2/wiki/Common-issues
- 例如华为等设备上,测试时建议保持屏幕常量(开发者选项)保证后台的atx-agent不被系统放入深度睡眠,同时建议将atx相关组件在设置->电池中不进行电池优化(防止睡眠):https://github.com/openatx/uiautomator2/issues/284
为了提高uiautomator2再有播放器界面不卡死,代码中将默认3000ms中的waitForIdleTimeout改成了0,不过有可能会造成坐标偏移,虽然概率不大。
如果出现这种情况,可以将其调大一点 d.jsonrpc.setConfigurator({"waitForIdleTimeout": 100})
因为有atx-agent
的存在,Uiautomator会被一直守护着,如果退出了就会被重新启动起来。但是Uiautomator又是霸道的,一旦它在运行,手机上的辅助功能、电脑上的uiautomatorviewer 就都不能用了,除非关掉该框架本身的uiautomator。下面就说下两种关闭方法
方法1:
直接打开uiautomator
app(init成功后,就会安装上的),点击关闭UIAutomator
方法2:
d.service("uiautomator").stop()
# d.service("uiautomator").start()
ATX与Maxim共存AccessibilityService的方法
app-uiautomator.apk
or app-uiautomator-test.apk
not installed.
app-uiautomator.apk
and app-uiautomator-test.apk
signature not match.
The following command is to run uiautomator manually. You will see details about what's is wrong.
$ adb shell am instrument -w -r -e debug false -e class com.github.uiautomator.stub.Stub \
com.github.uiautomator.test/android.support.test.runner.AndroidJUnitRunner
Normal output is
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=
com.github.uiautomator.stub.Stub:
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: test=testUIAutomatorStub
INSTRUMENTATION_STATUS: class=com.github.uiautomator.stub.Stub
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 1
尝试安装下面的依赖
pip install pyOpenSSL>=0.13
pip install ndg-httpsclient>=0.3.2
相关issue:https://github.com/openatx/uiautomator2/issues/49
原因,minicap不支持模拟器
删除minicap,会自动切换到使用uiautomator中接口截图。
adb shell rm /data/local/tmp/minicap
- 远程查看: 手机
python -m uiautomator2 init
之后,浏览器输入 <device_ip:7912>,会发现一个远程控制功能,延迟非常低噢。^_^ - 手机USB连接后,自动调用init命令 adbkit-init
- htmlreport 记录测试过程的测试报告
$ adb forward tcp:9008 tcp:9008
$ curl 127.0.0.1:9008/ping
# expect: pong
$ curl -d '{"jsonrpc":"2.0","method":"deviceInfo","id":1}' 127.0.0.1:9008/jsonrpc/0
# expect JSON output
为了方便uiautomator2跟其他项目集成,所以开发了这套插件机制。参考了一些过去flask的插件机制。 使用示例
import uiautomator2 as u2
def image_save(d, fileext='.jpg'):
""" save screenshot plugin """
def inner(filename):
d.screenshot().save(filename+fileext)
return inner
u2.plugin_register('png_save', image_save, '.png')
d = u2.connect()
d.ext_png_save("screen") # screenshot will save screen.png
这里引入了一个函数plugin_register
def plugin_register(name, func_or_class, *args, **kwargs)
name代表插件的名字,func_or_class
可以是函数,也可以是类,其第一个参数一定是d
(设备的实例), args
和kwargs
是可选参数
通过d.ext_
加上注册插件是的名字,如果插件名是png_save
则通过d.ext_png_save
调用。
image_save
这个函数只有在最初调用d.ext_png_save
的时候会调用,之后都只使用第一次生成的实例。
PS: 插件的调用没有自动补全,有点不太方便
d = u2.connect()
def callback(stage, func_name, args, kwargs, ret):
print("stage", stage)
print("call", func_name, args, kwargs)
print("return", ret)
d.hooks_register(callback)
d.click(0.5, 0.5)
# expect output
# stage: before
# call: click (540, 960) {}
# return: None
# stage: after
# call: click (540, 960) {}
# return: None
Use hooks, you can capture screenshot before or after click
, long_click
, double_click
, swipe
使用方法
import uiautomator2 as u2
u2.set_fail_prompt(True) # 填写False可以关闭这个功能
d = u2.connect()
d(text="Search").click(timeout=2)
如果Search
这个按钮没有找到,会弹出一个tkinter的提示框。
包含 Retry
, Skip
, Abort
按钮,如果没有任何操作30s后自动Abort,也就是抛出异常
目前只有click
这一个操作会有提示框。欢迎使用该功能,并提供反馈意见。
Introduced in 2018-12-13 23:17