Skip to content
Mingyuan Xia edited this page Jan 8, 2019 · 5 revisions

常见问题

Testerhome讨论帖

提示502错误

尝试手机连接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

提示Connection Error

可能是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

在Android 8以上,黑屏后atxagent连不上

  • 例如华为等设备上,测试时建议保持屏幕常量(开发者选项)保证后台的atx-agent不被系统放入深度睡眠,同时建议将atx相关组件在设置->电池中不进行电池优化(防止睡眠):https://github.com/openatx/uiautomator2/issues/284

点击坐标出现偏移

为了提高uiautomator2再有播放器界面不卡死,代码中将默认3000ms中的waitForIdleTimeout改成了0,不过有可能会造成坐标偏移,虽然概率不大。 如果出现这种情况,可以将其调大一点 d.jsonrpc.setConfigurator({"waitForIdleTimeout": 100})

如何停用UiAutomator的守护程序 How to stop UiAutomator process keeper

因为有atx-agent的存在,Uiautomator会被一直守护着,如果退出了就会被重新启动起来。但是Uiautomator又是霸道的,一旦它在运行,手机上的辅助功能、电脑上的uiautomatorviewer 就都不能用了,除非关掉该框架本身的uiautomator。下面就说下两种关闭方法

方法1:

直接打开uiautomator app(init成功后,就会安装上的),点击关闭UIAutomator

方法2:

d.service("uiautomator").stop()
# d.service("uiautomator").start()

ATX与Maxim共存AccessibilityService的方法

Uiautomator started failed.

Reason 1:

app-uiautomator.apk or app-uiautomator-test.apk not installed.

Reason 2:

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

出现SSLError

尝试安装下面的依赖

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 记录测试过程的测试报告

诊断uiautomator2方法

$ 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

Plugin

为了方便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(设备的实例), argskwargs是可选参数

通过d.ext_加上注册插件是的名字,如果插件名是png_save则通过d.ext_png_save调用。

image_save这个函数只有在最初调用d.ext_png_save的时候会调用,之后都只使用第一次生成的实例。

PS: 插件的调用没有自动补全,有点不太方便

Hooks

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

Clone this wiki locally