python-uiautomator2
简单介绍
python-uiautomator2是一个自动化测试开源工具,仅支持Android平台的原生应用测试。
支持平台及语言
python-uiautomator2封装了谷歌自带的uiautomator2测试框架,提供便利的python接口。他允许测试人员直接在PC上编写Python的测试代码,操作手机应用,完成自动化,大大提高了自动化代码编写的效率。
工作原理
以下图片使用Windows画图软件

如图所示,python-uiautomator2主要分为两个部分,python客户端,移动设备
- python端: 运行脚本,并向移动设备发送HTTP请求
- 移动设备:移动设备上运行了封装了uiautomator2的HTTP服务,解析收到的请求,并转化成uiautomator2的代码。
整个过程
- 在移动设备上安装
atx-agent(守护进程), 随后atx-agent启动uiautomator2服务(默认7912端口)进行监听 - 在PC上编写测试脚本并执行(相当于发送HTTP请求到移动设备的server端)
- 移动设备通过WIFI或USB接收到PC上发来的HTTP请求,执行制定的操作
安装工具
- Python2或者Python3均可。(也可以尝试使用Android上Python客户端:QPython)
- 移动设备
环境搭建
安装adb
如命令行可以执行adb devices,则跳过此步骤
从谷歌官网下载Android Platform Tools https://developer.android.com/studio/releases/platform-tools.html,解压,并加包含adb.exe的目录加入到系统的PATH中。
安装python-uiautomator2
pip install --pre -U uiautomator2
设备安装atx-agent
首先设备连接到PC,并能够adb devices发现该设备。
# 从github下载atx-agent文件,并推送到手机。在手机上安装包名为`com.github.uiautomator`的apk
$ python -m uiautomator2 init
success
最后提示success,代表atx-agent初始化成功。
应用及操作
调用uiautomator2的过程
- 配置手机设备参数,设置具体操作的是哪一台手机
- 抓取手机上应用的控件,制定对应的控件来进行操作
- 对抓取到的控件进行操作,比如点击、填写参数等。
配置手机设备参数
python-uiautomator2连接手机的方式有两种,一种是通过WIFI,另外一种是通过USB。两种方法各有优缺点。
WIFI最便利的地方要数可以不用连接数据线,USB则可以用在PC和手机网络不在一个网段用不了的情况。
使用WIFI连接
手机获取到手机的IP,并确保电脑可以PING通手机。手机的IP可以在设置-WIFI设置里面获取到。
比如手机的IP是192.168.0.100,连接设备的代码为import uiautomator2 as u2
d = u2.connect('192.168.0.100')使用USB连接
手机的序列号可以通过
adb devices获取到,假设序列号是123456f,连接代码为import uiautomator2 as u2
d = u2.connect_usb('123456f')
抓取手机上应用的控件
虽然很想用Android SDK内置工具uiautomatorviewer.bat,但是运行uiautomator2的时候,uiautomatorviewer.bat运行不起来,两者之间冲突太严重。
于是参考着uiautomatorviewer的界面,我又写了一个weditor,调用python-uiautomator2的两个接口screenshot和dump_hierarchy这样就不会有冲突问题了
注:weditor依然处于开发期,功能可能会跟文中描述的有所不同
安装方法: pip install --pre weditor
使用方法:
首先运行python -m weditor,之后浏览器会自动打开一个网页 http://atx.open.netease.com (注:这个网址仅提供一个前端,而python -mweditor这个命令则本地开放了HTTP的接口,前端去跟本地的服务去通信)
下图为网页的截图

重点说下这个部分

先忽略iOS和Neco这两个,直接选择Android。输入框中可以写设备的IP或者设备的Serial(序列号),跟上面提到的配置手机设备参数用法一致。之后点击Connect,如果一切正常就会出现一个绿色的叶子。

页面刷新时,点击蓝色的Reload按钮重新刷新。

定位方式
- ResourceId定位:
d(resourceId="com.smartisanos.clock:id/text_stopwatch").click() - Text定位
d(text="秒表").click() - Description定位
d(description="..").click() - ClassName定位
d(className="android.widget.TextView").click()
xpath定位并不支持,一开始打算做支持的,但是发现不用也能搞定。就是代码写的长一点而已。
操作控件
# click
d(text="Settings").click()
# long click
d(text="Settings").long_click()
# 等待元素的出现
d(text="Settings").wait(timeout=10.0)
九宫格解锁:以前文章写过 https://testerhome.com/topics/11034
中文字符的输入
如果可以定位到元素,直接通过set_text就可以输入中文
d(text="Settings").set_text("你好")
如果定位不到元素需要使用send_keys方法,以及切换输入法
d.set_fastinput_ime(True)
d.send_keys("你好 Hello")
d.set_fastinput_ime(False) # 输入法用完关掉
截图:d.screenshot("home.jpg")
获取图层信息:xml = d.dump_hierarchy()
python-uiautomator2的更多相关文章
- python uiautomator2 watcher的使用方法
该方是基于uiautomator2如下版本进行验证的: PS C:\windows\system32> pip show uiautomator2 Name: uiautomator2 Vers ...
- Appium python Uiautomator2 多进程问题
appium更新uiautomator后可以获取tost了,大家都尝试,课程中也讲解了,但是这些跑的时候都在单机上,当我们多机并发的时候会出现一个端口问题,因为我们appium最后会调用uiautom ...
- python uiautomator2 新版本2.4.6之watcher的玩法
最近将uiautomator2升级到最新版本了,运行之前的脚本发现涉及watcher部分的全部报错,大家来看看新版本的watcher如何玩 用法举例 注册监控 # 常用写法,注册匿名监控 d.watc ...
- 【Python + ATX基于uiautomator2】之编写unittest自动化测试脚本
不说废话上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/08/31 09:43 # @Author : zc # @ ...
- 【学习ATX基于uiautomator2】之API操作Android方法
具体API可参考:<uiautomator2>以及参考github官方文档 感谢:Ricky_Frog <Python+uiautomator2手机UI自动化测试实战 -- 2. 用 ...
- uiautomator2 使用Python测试 Android应用
GitHub地址:https://github.com/openatx/uiautomator2 介绍 uiautomator2 是一个可以使用Python对Android设备进行UI自动化的库.其底 ...
- 【ATX学习大纲】【ATX基于uiautomator2+Python学习】之Android自动化
github学习地址:https://github.com/openatx/uiautomator2 <_io.TextIOWrapper name='<stderr>' mode= ...
- uiautomator2 +Python进行Android原生应用UI测试
uiautomator2封装了google的uiautomator(只能用java),uiautomator2可以使用脚本语言python进行编写,更简单直观地修改.运行自动化测试代码: 不足为:仅支 ...
- uiautomator2+python自动化测试1-环境准备
前言 uiautomator是Google提供的用来做安卓自动化测试的一个Java库.功能很强,可以对第三方App进行测试,获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作,但有两个缺点 ...
- appium+python自动化64-使用Uiautomator2执行driver.keyevent()方法报错解决
前言 未加'automationName': 'Uiautomator2'参数使用Uiautomator可以正常使用driver.keyevent()方法,使用Uiautomator2时driver. ...
随机推荐
- 使用Ajax (put delete ) django原生CBV 出现csrf token解决办法
原因 django原生CBV中对于 Ajax put 或 delete 请求进行封装时,会把请求数据放在 request.body里, 所以获取不到csrf token 方式一: 关闭csrf 中间件 ...
- JAVA读写CSV文件
最近工作需要,需要读写CSV文件的数据,简单封装了一下 依赖读写CSV文件只需引用`javacsv`这个依赖就可以了 <dependency> <groupId>net.sou ...
- 前端与算法 leetcode 344. 反转字符串
目录 # 前端与算法 leetcode 344. 反转字符串 题目描述 概要 提示 解析 解法一:双指针 解法二:递归 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 lee ...
- ES6中的关键字 - let
let关键字 1.let关键字声明的变量仅仅在自己的块级作用域内起作用,出了块级作用域就不起作用了: var arr2 = []; for (let index = 0; index < 10; ...
- 027 ElasticSearch----全文检索技术02---快速入门
1.基本概念 Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的. 注意:6.0之前的版本有type(类型)概念,type相当于关系数据库的表,E ...
- DataTable 删除行 UpdateTable 方法
.不要使用DataTable.Rows.Remove(row) 而要使用 DataTable.Rows[i].Delete() .DataTable.Rows.Remove(row)相当于DataTa ...
- day58——模板继承、组件、自定义标签和过滤器、inclusion_tag、静态文件配置、url别名和反向解析、url命名空间
day58 模板相关 模板继承(母版继承) 1. 创建一个xx.html页面(作为母版,其他页面来继承它使用) 2. 在母版中定义block块(可以定义多个,整个页面任意位置) {% block co ...
- Firefox 无法播放 youtube
今天 firefox (目前是 67,之前刚装了 62 的时候也是这个问题..)升级之后,莫名其妙没法使用 youbube 了. 尝试了很多方法,我觉得可能是这条起作用了: 1. 关闭所有网页. 2. ...
- ASP.NET Core中如何显示[PII is hidden]的隐藏信息
有时候我们在ASP.NET Core项目运行时,发生在后台程序中的错误会将关键信息隐藏为[PII is hidden]这种占位符,如下所示: 而知道这些关键信息,有时候对我们调试程序是非常重要的.所以 ...
- GitLab CI/CD的官译【原】
CI / CD方法简介 软件开发的持续集成基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性.从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预. 它涉及在每次小迭代中不断 ...