Android⾃动化测试框架uiautomator2详解
1 uiautomator
2 简介
uiautomator2 是 ⼀种 Android ⾃动化测试框架,提供了点击、长按、输⼊⽂本、滑动、拖拽、截屏等⽅法,能够模拟⽤户的各种动作。⽤户可以通过控件的 id 或 text 等属性,定位到控件,从⽽对控件实施上述操作。
2 环境搭建
1)python 环境变量配置
安装好 python3.7 后,将【D:\Program Files\Python 3.7】和【D:\Program Files\Python 3.7\Scripts】添加到系统环境变量中的path 中,可以通过在 cmd 界⾯输⼊ python 命令检验 python 环境变量是否配好。
2)pycharm 编码设置
安装好 pycharm 后,需要设置编码格式,避免乱码,主要设置以下3项:
【File】→【Settings】→【Editor】→【File Encodings】→【Global Encoding】、【Project Encoding】、【Default
encoding for properties files】都设置为 UTF-8
⼯作区域右下⾓设置编码格式为 UTF-8,如右图:
【Appearance & Behavior】→【Appearance】→选中【Override default fonts by (not recommended)】复选框,【Name】设置为 Microsoft Yahei
3)uiautomator2 安装
打开 pycharm,运⾏以下代码。
install.py
import os
# pypi.douban/simple # ⾖瓣镜像
# pypi.tuna.tsinghua.edu/simple # 清华镜像
mirror = " -i pypi.douban/simple"
os.system("python -m pip install --upgrade pip" + mirror) # 更新 pip
os.system("pip install --pre -U uiautomator2" + mirror) # 安装 uiautomator2
os.system("pip install --pre weditor" + mirror) # 安装 weditor
os.system("python -m uiautomator2 init") #安装 atx-agent ⾄⼿机
注意事项及说明:
1. 若内⽹⽆法下载,请使⽤⼿机给 PC 开个热点;
2. weditor 是⼀种页⾯信息查看⼯具,可以查看页⾯包名、运⾏的Activity,页⾯布局、控件等信息;
3. 若执⾏【python -m uiautomator2 init】命令失败(此命令需要⽤ USB 线连接⼿机),可能是 5037 端⼝已被其他进程占⽤,可以在 cmd 界⾯使⽤ 【netstate -ano | findstr "5037"】命令查看占⽤该端⼝的进程,然后使⽤【adb shell kill -9 pid】命令 kill 掉占⽤ 5037 端⼝的进程,其中 pid 为查询出的占⽤
5037 端⼝的进程号,若仍然⽆效,再执⾏以下命令:
adb kill-server
会计专业主要学什么adb start-server
adb remount
执⾏完上述命令后,再执⾏【python -m uiautomator2 init】,若成功执⾏,⼿机上会安装【com.st】(此应⽤⽆界⾯,需要在“应⽤管理”中查看)和【ATX】。
端午放假三天不调休3 界⾯信息查看⼯具
⽤户可以通过点击按钮所在坐标,实现对按钮的控制,但是,只通过坐标不能获取对⽂本框的控制权。好在⼿机界⾯上的控件,⼀般都有 resourceId 、text、description、className 等属性,⽤户通过这些属性,可以轻松定位到指定控件,从⽽实现对控件的控制。
3.1 weditor
⽤户通过在 cmd 界⾯执⾏【python -m weditor】命令,打开 weditor,界⾯如下:
注意事项: ⽤户需要在⼿机上打开【ATX】软件,点击【启动UIAUTOMATOR】,并且保证⼿机和 PC 连在同⼀个 wifi 上,当【Connect】旁边的图标变绿,说明连接成功,⽤户可以通过点击【Dump Hierarchy】同步⼿机界⾯。
3.2 uiautomatorviewer
uiautomatorviewer 是 Android SDK 中提供的页⾯信息查看⼯具,位置:
【D:\Program\sdk\tools\uiautomatorviewer.bat】,⽤户通过单击此⽂件,进⼊如下界⾯:
注意事项:
1)使⽤ Android Studio 下载最新的 platform-tools 和 tools
2)配置系统环境变量:【ANDROID_SWT】(key)——【D:\Program\sdk\tools\lib\x86_64】(value),并将
【D:\Program\sdk\tools】和【D:\Program\sdk\platform-tools】添加到系统环境变量的 path 中。
3)必须关闭【ATX】
4 uiautomator2 常⽤API
在应⽤ uiautomator2 框架时,需要导⼊包,如下:
import uiautomator2 as u2
4.1 设备连接
设备连接主要分为有线连接和⽆线连接,如下:
# 有线连接
d = u2.connect_usb(id) # id 为 adb devices 命令中得到的设备 id
# ⽆线连接
d = u2.connect(ip) # ip 为⼿机 ip
说明:返回的 d 为连接句柄,通过 d 可以实现对⼿机的操作。
4.2 应⽤控制
1)安装应⽤
d.app_install('domain/xxx.apk')
注意:只能从 URL 安装
2)打开应⽤
d.app_start("app_package_name")
3)关闭应⽤
d.app_stop("app_package_name")
4)关闭所有应⽤
d.app_stop_all()
通过点击 recent 按钮清除所有应⽤
d.press("recent") # 点击 recent 键
sleep(1)
d(resourceId="com.huawei.android.launcher:id/clear_all_recents_image_button").click()
4.3 元素定位
由于页⾯元素(控件)⼀般有 resourceId 、text、description、className 等属性,因此可以通过这些属性定位到具体控件。
resourceId:控件 id
text:控件上显⽰的⽂本
description:控件描述
className:控件所属的类
element = d(resourceId=value)
element = d(text=value)
element = d(description=value)
element = d(className=value)
说明:d 为 4.2 节中得到的 连接句柄,value 为控件标识类型对应的属性值。
element 是⼀个列表,因为可能返回多个同属性值控件,如:控件为 ListView,每个 item 的 resourceId 都⼀样,采⽤resourceId 定位,就会把整个列表的 item 都返回,⽤户可以通过 element[index] 来控制指定的控件。当属性值唯⼀时,可以省略 element[0] 后⾯的“[0]”,即:element。
通过以下命令,可以判断属性值对应的元素是否存在。
element[index].exists # 属性值不唯⼀
亚服刺激战场怎么下载4.4 元素控制
1)单击控件
element[index].click() # 定位的控件有多个,通过 index 指定某⼀个
element.click() # 定位的控件只有⼀个,等价于 element[0].click()
d.click(x, y) # 点击具体坐标
2)双击控件
element[index].double_click() # 定位的控件有多个,通过 index 指定某⼀个
element.double_click() # 定位的控件只有⼀个,等价于 element[0].double_click()
d.double_click(x, y) # 双击具体坐标
3)长按控件
element[index].long_click() # 定位的控件有多个,通过 index 指定某⼀个
element.long_click() # 定位的控件只有⼀个,等价于 element[0].long_click()
d.long_click(x, y, duration=0.5) # 长按具体坐标
4)⽂本操作
输⼊⽂本:
十大暴利行业排行榜element[index].set_text(text) # 定位的控件有多个,通过 index 指定某⼀个
注册公司需要什么条件element.set_text(text) # 定位的控件只有⼀个,等价于 element[0].set_text(text)
另外,当页⾯中有且仅有⼀个编辑框时,可以使⽤以下代码:
d.set_fastinput_ime(True) # 打开输⼊法
端口被占用d.send_keys(text) # 输⼊⽂本
d.set_fastinput_ime(False) # 关闭输⼊法
清除⽂本:
element[index].clear_text() # 定位的控件有多个,通过 index 指定某⼀个
element.clear_text() # 定位的控件只有⼀个,等价于 element[0].clear_text()
获取⽂本:
element[index].get_text() # 定位的控件有多个,通过 index 指定某⼀个
<_text() # 定位的控件只有⼀个,等价于 element[0].get_text()
4.5 ⼿势控制
1)滑动
d.swipe(sx, sy, ex, ey, duration=0.5)
2)拖拽
d.drag(sx, sy, ex, ey, duration=0.5)
4.6 系统控制
1)按键
# key = {"back", "home", "recent", "power", "volume_up", "volume_down", "volume_mute", "enter",...}
d.press(key)
2)旋转
获取屏幕⽅向:
orientation = d.orientation # 获取屏幕⽅向,取值为{"natural", "left", "right", "upsidedown"}
锁定屏幕⽅向:
d.freeze_rotation() # 锁定屏幕⽅向
d.freeze_rotation(True) # 解除锁定屏幕⽅向
设置屏幕⽅向:
d.set_orientation("left") # 向左转为横屏
d.set_orientation("right") # 向右转为横屏
d.set_orientation("natural") # 转为竖屏
说明:left 、right、natural 可以分别简写为 l、r、n
3)截屏
image = d.screenshot()
image.save("path.jpg")
d.screenshot("path.jpg") # 截屏并保存
4)push
d.push(pc_file_path, phone_dir_path) # 将 PC 上的⽂件 push 到⼿机上指定⽬录,若此⽬录不存在,会⾃动创建
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论