UIAutomator的介绍

UIAutomator是google提供的用来做安卓自动化测试的一个java库

UIAutomator的缺陷

  • 测试脚本只能用Java语言开发
  • 测试脚本要打包成jar包或者apk包上传到设备上才能实现

UIAutomato2的优势

  • UI自动化编写采用Python,学习成本低
  • UI控件识别有专门的工具 weditor
  • 环境搭建简单
  • UI自动化脚本运行稳定

项目地址https://github.com/openatx/uiautomator2

UIAutomator2的执行流程

  • 在移动设备上安装atx-agent(守护进程),随后atx-agent启动ui2服务(默认7912端口)进行监听
  • 在PC端来编写脚本(相当于发送HTTP请求到移动设备的server端)
  • 移动设备通过wifi或usb接收到了PC上发来的HTTP请求,执行定制的操作

adb

adb的安装与使用

Adb又称Android调试桥,用于通过电脑端与模拟器或者是设备之间的交互的一个工具

Adb client 命令行程序‘adb’用于从shell或脚本中运行adb命令

Adb server adb server 是运行在PC的的一个后台程序

Adbd 程序adbd作为一个后台进程在Android设备或模拟器系统中运行

adb有什么作用?

  • 安装卸载apk文件
  • 移动设备和PC之间拷贝文件
  • 查看设备上安装的应用信息
  • 文件管理
  • 按键操作

adb如何使用?

把adb的bin目录添加到环境变量当中

image.png

1
2
3
4
5
adb devices 查看链接的移动设备
adb kill-server 关闭链接的移动设备
adb install apk文件路径 安装app应用
adb shell pm list packages 查看应用包名
adb uninstall 应用包名 卸载应用

UIAutomator2快速入门

1
python -m uiautomator2 init  初始化移动设备

Uiautomator-server: 就是谷歌原声的 uiautomator

Atx-agent: uiautomator的守护进程

minicap和minitouch 中2个包是atx-agent增加远程控制功能的依赖

UIAutomator2控制移动设备

1
2
3
4
5
import uiautomator2 as u2

d = u2.connect_wifi('172.17.100.15') 通过wifi
d = u2.connect_usb('127.0.0.1:62025') 通过usb(手机序列号)
d = u2.connect_adb_wifi('172.17.100.15:5555') 通过adb wifi

UIAutomato2启动手机app

1
2
3
4
5
6
7
8
使用aapt工具进入这个路径输入
aapt dump badging apk的文件名

找到包名
d.app_start('包名')

停止
d.app_stop('包名')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
d.service('uiautomator').running() uiautomator运行状态

d.service('uiautomator').start() 启动uiautomator

d.service('uiautomator').stop() 停止uiautomator

d.app_install(data='apk地址') 安装app

d.app_current() 获取当前前台app的信息

d.app_stop('包名') 停止当前app

d.app_clear('包名') 清除缓存

d.app_uninstall('包名') 卸载app

d.app_list() 获取所有app的信息

weditor

什么是Activity?

Activity是Android系统中的四大组件之一,可以用于显示View。Activity是一个与用户交互的系统模块

Activity的控件

  • TextView 显示文字
  • EditText 输入框
  • ImageView 显示图片
  • Button 按钮
  • CheckBox 复选框
  • RadioButton 单选按钮

weditor安装

1
2
pip install weditor -i https://pypi.douban.com/simple
在命令行输入 weditor

weditor的界面包括

  • 移动设备选择区
  • 控件属性区域
  • 代码展示区
  • 层级关系和结果展示区域

UiSelector和控件定位

  • UiSelector

  • Xpath

index int 索引 0
instance int 实例 5
class Sting 类名 android.widget.TextView
package Sting 包名 com.tl.kaoyan
check boolean 控件勾选状态 false/true
enable/clickable boolean 控件可点击 false/true
focused/focusable boolean 焦点 false/true
Scrollable boolean 滚动条 false/true
Long-clickable boolean 长按 false/true
selected boolean 选择状态 false/true

文本定位的方式

  • Text 全文本匹配
1
2
3
4
5
6
7
8
import uiautomator2 as u2
import time
d = u2.connect_usb('127.0.0.1:62001') #连接根据自己情况设置 cmd中adb.devices可以显示
d.app_start('com.tal.kaoyan')

time.sleep(1)
# 全文本匹配
d(text='密码登录').click()
  • textContains 文本包含
1
2
3
4
5
6
7
import uiautomator2 as u2
import time
d = u2.connect_usb('127.0.0.1:62001')
d.app_start('com.tal.kaoyan')
time.sleep(1)
# 文本包含
d(textContains='密码').click()
  • textMatches 正则表达式
1
2
3
4
5
6
7
import uiautomator2 as u2
import time
d = u2.connect_usb('127.0.0.1:62001')
d.app_start('com.tal.kaoyan')
time.sleep(1)
# 正则表达式
d(textMatches='.{2}登录').click()
  • textStartsWith 起始文本
1
2
3
4
5
6
7
8
import uiautomator2 as u2
import time
d = u2.connect_usb('127.0.0.1:62001')
d.app_start('com.tal.kaoyan')
time.sleep(1)
# 起始文本
d(textStartsWith='密码登').click()
# d(textStartsWith='密').click()

ClassName定位的方式

  • className classNmae的值
1
2
3
4
5
6
7
import uiautomator2 as u2
import time
d = u2.connect_usb('127.0.0.1:62001')
d.app_start('com.tal.kaoyan')
time.sleep(1)
# 通过classname来控件控件 需要注意层级关系
d(className='android.widget.TextView')[5].click()
  • classNameMatches 正则表达式匹配 classNmae的值
1
2
3
4
5
6
7
import uiautomator2 as u2
import time
d = u2.connect_usb('127.0.0.1:62001')
d.app_start('com.tal.kaoyan')
time.sleep(1)
# 通过实例来控制控件
d(className='android.widget.TextView',instance=5).click()

资源id进行定位

  • resourcdId 资源id
1
2
3
4
5
6
7
import uiautomator2 as u2
import time
d = u2.connect_usb('127.0.0.1:62001')
d.app_start('com.tal.kaoyan')
time.sleep(1)
# 通过正则表达式来控制
d(classNameMatches='android\.widget\.\w{8}',text='密码登录').click()

混合定位的方式

  • 文本定位 资源id ClassName等可以配合使用来进行定位
1
2
3
4
5
6
import uiautomator2 as u2
import time
d = u2.connect_usb('127.0.0.1:62001')
d.app_start('com.tal.kaoyan')
time.sleep(1)
d(className='android.support.v7.widget.RecyclerView').child(text='设备').click()

坐标点定位法

  • 坐标点定位法分为2种方式 一种是通过原始的坐标点来呈现。一种是通过%号的方式来呈现
1
2
3
4
5
6
7
8
# 坐标定位
import uiautomator2 as u2
import time
d = u2.connect_usb('127.0.0.1:62001')
d.app_start('com.tal.kaoyan')
time.sleep(1)
# d.click(0.055, 0.781) 49, 1124 110, 1124 0.123, 0.781
d.click(0.585, 0.072)

xpath定位的方式

  • d.xpath(‘xpath语句’)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import uiautomator2 as u2
import time
d = u2.connect_usb('127.0.0.1:62001')
# with open('phone.file','w',encoding='utf-8') as file_obj:
# file_obj.write(d.dump_hierarchy())

# d.app_start('com.google.android.gms')
#
# time.sleep(1)
# d.xpath('//*[@text="设备"]').click()
d.app_start('com.tal.kaoyan')

time.sleep(1)
d.xpath('//*[@resource-id="com.tal.kaoyan:id/login_code_touname"]').click()
time.sleep(2)
d(resourceId='com.tal.kaoyan:id/login_email_edittext').set_text('123456')