# uiautomator2 [![Build Status](https://travis-ci.org/openatx/uiautomator2.svg?branch=master)](https://travis-ci.org/openatx/uiautomator2) [![PyPI](https://img.shields.io/pypi/v/uiautomator2.svg)](https://pypi.python.org/pypi/uiautomator2) ![PyPI](https://img.shields.io/pypi/pyversions/uiautomator2.svg)
**该项目正在火热的开发中**
uiautomator2 是一个可以使用Python对Android设备进行UI自动化的库。其底层基于Google uiautomator,Google提供的[uiautomator](https://developer.android.com/training/testing/ui-automator.html)库可以获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作,但有两个缺点:1. 测试脚本只能使用Java语言 2. 测试脚本必须每次被上传到设备上运行。
我们希望测试能够用一个更脚本化的语言,例如Python编写,同时可以每次所见即所得地修改测试、运行测试。这里要非常感谢 Xiaocong He ([@xiaocong][]),他将这个想法实现了出来(见[xiaocong/uiautomator](https://github.com/xiaocong/uiautomator)),原理是在手机上运行了一个http服务器,将uiautomator中的功能开放出来,然后再将这些http接口,封装成Python库。
我们的uiautomator2项目是对[xiaocong/uiautomator](https://github.com/xiaocong/uiautomator)的增强,主要有以下部分:
* 设备和开发机可以脱离数据线,通过WiFi互联(基于[atx-agent](https://github.com/openatx/atx-agent))
* 集成了[openstf/minicap](https://github.com/openstf/minicap)加快截图速度
* 集成了[openstf/minitouch](https://github.com/openstf/minitouch)达到精确实时控制设备
* 修复了xiaocong/uiautomator经常性退出的问题
* 代码进行了重构和精简,方便维护
虽然我说的很简单,但是实现起来用到了很多的技术和技巧,功能非常强,唯独文档有点少。哈哈
QQ群号: *499563266*
![QQ QRCode](docs/img/qqgroup.png)
# Table of contents
- **[Installation](#installation)**
- **[Usage](#usage)**
- **[Command line](#command-line)**
- **[Quick start](#quick-start)**
- **[API Documents](#api-documents)**
# Installation
1. Install uiautomator2
```bash
# Since uiautomator2 is still under development, you have to add --pre to install the development version
pip install --upgrade --pre uiautomator2
# Or you can install directly from github source
git clone https://github.com/openatx/uiautomator2
pip install -e uiautomator2
```
Optionally, `pillow` is needed to process screenshot data.
```bash
pip install pillow
```
2. Deploy associated daemons to a device
电脑连接上一个手机或多个手机, 确保adb已经添加到环境变量中,执行下面的命令会自动安装本库所需要的设备端程序:[uiautomator-server](https://github.com/openatx/android-uiautomator-server/releases) 、[atx-agent](https://github.com/openatx/atx-agent)、[openstf/minicap](https://github.com/openstf/minicap)、[openstf/minitouch](https://github.com/openstf/minitouch)
```bash
# init 所有的已经连接到电脑的设备
python -m uiautomator2 init
```
因为中国的网络限制,访问Github的资源速度会比较慢,执行上面的命令可能很费时间,所以我们专门制作了一个国内的[Github镜像网站](https://github-mirror.open.netease.com),网站采用的是请求时缓存的策略,所以全网第一次请求需要等待一会。
使用国内镜像只要增加一个参数`--mirror`
```bash
python -m uiautomator2 init --mirror
```
也可以使用`--serial`可以指定单个设备
```
python -m uiautomator2 init --mirror --serial $SERIAL
```
安装提示`success`即可
3. Install weditor(UI Inspector)
因为uiautomator是独占资源,所以当atx运行的时候uiautomatorviewer是不能用的,为了减少atx频繁的启停,我们开发了基于浏览器技术的weditor UI查看器。<https://github.com/openatx/weditor>
安装方法
```bash
pip install --pre -U weditor
```
> Windows系统可以使用命令在桌面创建一个快捷方式 `python -m weditor --shortcut`
命令行启动 `python -m weditor` 会自动打开浏览器,输入设备的ip或者序列号,点击Connect即可。
具体参考文章:[浅谈自动化测试工具python-uiautomator2](https://testerhome.com/topics/11357)
# Usage
部署 `atx-agent`之后,设备可以和电脑通过WiFi链接,设备上的`atx-agent`安装完成后会自动提示手机的IP是多少(模拟器另说)。下文中我们用`device_ip`这个变量来表示手机的IP,这个IP唯一标示一个设备。
如果手机的WiFi跟电脑不是一个网段的,不能使用WiFi互联功能,需要通过数据线将手机连接到电脑上,使用命令`adb forward tcp:7912 tcp:7912` 将手机上的服务端口7912转发到电脑上,然后使用`device_ip=127.0.0.1`连接该手机。
## Command line
- init: 为设备安装所需要的程序
- install: 安装apk,apk通过URL给出
```bash
$ python -m uiautomator2 install $device_ip https://example.org/some.apk
MainThread: 15:37:55,731 downloading 80.4 kB / 770.6 kB
MainThread: 15:37:56,763 installing 770.6 kB / 770.6 kB
MainThread: 15:37:58,780 success installed 770.6 kB / 770.6 kB
```
- clear-cache: 清空缓存
```bash
$ python -m uiautomator2 clear-cache
```
- `app-stop-all`: 停止所有应用
```bash
$ python -m uiautomator2 app-stop-all $device_ip
```
- screenshot: 截图
```bash
$ python -m uiautomator2 screenshot $device_ip screenshot.jpg
```
- healthcheck: 健康检查
```bash
$ python -m uiautomator2 healthcheck $device_ip
```
## QUICK START
There are two ways to connect to the device. Run the following Python code in a Python 2.7/3+ interpreter:
1. Through WiFi (recommended)
Suppose device IP is `10.0.0.1` and your PC is in the same network.
```python
import uiautomator2 as u2
d = u2.connect('10.0.0.1') # alias for u2.connect_wifi('10.0.0.1')
print(d.info)
```
2. Through USB
Suppose the device serial is `123456f` (seen from `adb devices`)
```python
import uiautomator2 as u2
d = u2.connect('123456f') # alias for u2.connect_usb('123456f')
print(d.info)
```
Calling `u2.connect()` with no argument, `uiautomator2` will obtain device IP from the environment variable `ANDROID_DEVICE_IP`.
If this environment variable is empty, uiautomator will fall back to `connect_usb` and you need to make sure that there is only one device connected to the computer.
## 一些常用但是不知道归到什么类里的函数
先中文写着了,国外大佬们先用Google Translate顶着
### 感觉肯定用得着的资料链接
- [Question and Answers (FAQ)](https://testerhome.com/topics/12025)
- [浅谈自动化测试工具python-uiautomator2](https://testerhome.com/topics/11357)
- [weditor](https://github.com/openatx/weditor) 用于查看UI层次结构,方便写脚本用。
- [htmlreport](uiautomator2/ext/htmlreport) 记录测试过程的测试报告(实验性质)
### 检查并维持设备端守护进程处于运行状态
```python
d.healthcheck()
```
### 点击坐标出现偏移
为了提高uiautomator2再有播放器界面不卡死,代码中将默认3000ms中的waitForIdleTimeout改成了0,不过有可能会造成坐标偏移,虽然概率不大。
如果出现这种情况,可以将其调大一点 `d.jsonrpc.setConfigurator({"waitForIdleTimeout": 100})`
### 连接本地USB设备
需要设备曾经使用`python -m uiautomator2 init`初始化过
```python
d = u2.connect_usb("{Your-Device-Serial}")
```
### 如何停用UiAutomator的守护程序 How to stop UiAutomator process keeper
因为有`atx-agent`的存在,Uiautomator会被一直守护着,如果退出了就会被重新启动起来。但是Uiautomator又是霸道的,一旦它在运行,手机上�