Android Uiautomator2 Python Wrapper应用管理API:安装、卸载与启动全掌握
【免费下载链接】uiautomator2 Android Uiautomator2 Python Wrapper 项目地址: https://gitcode.***/gh_mirrors/ui/uiautomator2
1. 引言:告别繁琐的Android应用管理操作
你是否还在为Android应用的自动化测试中频繁的安装、卸载和启动操作而烦恼?手动执行这些步骤不仅耗时,还容易出错,严重影响测试效率。本文将全面介绍Android Uiautomator2 Python Wrapper(以下简称uiautomator2)提供的应用管理API,帮助你轻松实现应用的安装、卸载与启动的自动化,显著提升测试效率。
读完本文后,你将能够:
- 熟练使用uiautomator2进行应用的安装、卸载和启动操作
- 掌握应用状态监测和管理的高级技巧
- 解决应用管理过程中常见的问题和异常
- 构建完整的应用生命周期自动化测试流程
2. 环境准备与基础配置
2.1 安装uiautomator2
首先,确保你的Python环境已配置好,然后使用以下命令安装uiautomator2:
pip install uiautomator2
2.2 连接设备
在使用uiautomator2的应用管理API之前,需要先连接Android设备。可以通过USB或网络连接:
import uiautomator2 as u2
# USB连接
d = u2.connect_usb()
# 网络连接
# d = u2.connect("192.168.1.100:5555")
# 检查设备连接状态
print("设备信息:", d.device_info)
成功连接后,会输出设备的基本信息,如序列号、品牌、型号等。
3. 应用安装API详解
3.1 安装本地APK文件
uiautomator2提供了app_install方法,可以方便地安装本地APK文件到设备:
# 安装本地APK
d.app_install("/path/to/your/app.apk")
参数说明:
-
data:可以是本地文件路径、URL或文件对象
3.2 从URL安装应用
除了本地文件,app_install还支持直接从URL安装应用:
# 从URL安装应用
d.app_install("https://example.***/app-release.apk")
3.3 安装应用的工作流程
应用安装的内部工作流程如下:
3.4 安装异常处理
在安装过程中,可能会遇到各种异常情况,如APK损坏、版本冲突等。建议使用try-except块捕获异常:
try:
d.app_install("/path/to/your/app.apk")
print("应用安装成功")
except Exception as e:
print(f"应用安装失败: {str(e)}")
4. 应用卸载API详解
4.1 基本卸载方法
使用app_uninstall方法可以卸载指定包名的应用:
# 卸载应用
su***ess = d.app_uninstall("***.example.myapp")
if su***ess:
print("应用卸载成功")
else:
print("应用卸载失败")
返回值:布尔值,表示卸载操作是否成功
4.2 批量卸载应用
uiautomator2还提供了app_uninstall_all方法,可以批量卸载应用:
# 批量卸载第三方应用,排除指定应用
excluded_apps = ["***.android.settings", "***.google.android.gms"]
uninstalled = d.app_uninstall_all(excludes=excluded_apps, verbose=True)
print(f"已卸载应用数量: {len(uninstalled)}")
print("卸载的应用列表:", uninstalled)
参数说明:
-
excludes:要排除的应用包名列表 -
verbose:是否显示详细卸载过程
5. 应用启动API详解
5.1 基本启动方法
app_start方法用于启动指定包名的应用:
# 启动应用
d.app_start("***.example.myapp")
参数说明:
-
package_name:应用包名 -
activity:可选参数,指定要启动的Activity -
wait:是否等待应用启动完成,默认为False -
stop:启动前是否停止应用,默认为False -
use_monkey:当未指定activity时,是否使用monkey命令启动应用,默认为False
5.2 启动指定Activity
如果需要启动应用的特定Activity,可以指定activity参数:
# 启动指定Activity
d.app_start("***.example.myapp", activity=".MainActivity", wait=True)
5.3 启动应用并等待
使用wait=True参数可以让方法阻塞直到应用启动完成:
# 启动应用并等待
d.app_start("***.example.myapp", wait=True)
print("应用已启动")
5.4 启动前停止应用
如果需要确保应用是全新启动的,可以设置stop=True:
# 先停止应用再启动
d.app_start("***.example.myapp", stop=True)
5.5 使用Monkey命令启动应用
当不知道应用的具体Activity时,可以使用Monkey命令启动:
# 使用Monkey命令启动应用
d.app_start("***.example.myapp", use_monkey=True)
5.6 应用启动的工作流程
6. 应用状态监测与管理
6.1 获取当前运行的应用
使用app_current方法可以获取当前在前台运行的应用信息:
# 获取当前运行的应用
current_app = d.app_current()
print("当前应用:", current_app)
# 输出示例: {'package': '***.example.myapp', 'activity': '***.example.myapp.MainActivity'}
6.2 检查应用是否安装
app_info方法可以获取应用的详细信息,如果应用未安装会抛出AppNotFoundError异常:
# 检查应用是否安装
try:
app_info = d.app_info("***.example.myapp")
print("应用已安装")
print("版本名称:", app_info["versionName"])
print("版本号:", app_info["versionCode"])
except u2.exceptions.AppNotFoundError:
print("应用未安装")
6.3 获取已安装应用列表
使用app_list方法可以获取设备上已安装的应用列表:
# 获取所有已安装应用
all_apps = d.app_list()
print(f"已安装应用数量: {len(all_apps)}")
# 获取第三方应用
third_party_apps = d.app_list("-3")
print(f"第三方应用数量: {len(third_party_apps)}")
filter参数可选值:
-
-f:只显示系统应用 -
-d:只显示已禁用的应用 -
-e:只显示已启用的应用 -
-s:只显示系统应用 -
-3:只显示第三方应用 -
-i:显示应用的安装器 -
-u:包含已卸载的应用
6.4 获取运行中应用列表
app_list_running方法可以获取当前正在运行的应用列表:
# 获取运行中应用列表
running_apps = d.app_list_running()
print(f"运行中应用数量: {len(running_apps)}")
print("运行中应用:", running_apps)
6.5 停止应用
使用app_stop方法可以停止指定应用:
# 停止应用
d.app_stop("***.example.myapp")
6.6 停止所有应用
app_stop_all方法可以停止所有第三方应用,保留系统应用:
# 停止所有第三方应用,排除指定应用
excluded = ["***.example.important"]
stopped = d.app_stop_all(excludes=excluded)
print(f"已停止应用数量: {len(stopped)}")
6.7 清除应用数据
app_clear方法可以清除应用的数据:
# 清除应用数据
d.app_clear("***.example.myapp")
这相当于在设备的设置中执行"清除数据"操作。
7. 应用会话管理
7.1 创建应用会话
session方法可以创建一个应用会话,用于跟踪应用状态:
# 创建应用会话
sess = d.session("***.example.myapp")
# 会话中可以直接操作UI元素
sess(text="登录").click()
sess(text="用户名").set_text("testuser")
sess(text="密码").set_text("password123")
sess(text="登录").click()
# 关闭会话
sess.close()
7.2 附加到现有会话
如果应用已经在运行,可以附加到现有会话:
# 附加到现有会话
sess = d.session("***.example.myapp", attach=True)
print("当前会话活动:", sess.running())
7.3 会话管理的工作原理
8. 高级应用管理技巧
8.1 应用版本检查
在安装或启动应用前,检查应用版本可以避免兼容性问题:
def check_app_version(package_name, min_version_code):
try:
info = d.app_info(package_name)
print(f"当前版本: {info['versionName']} ({info['versionCode']})")
return info['versionCode'] >= min_version_code
except u2.exceptions.AppNotFoundError:
print("应用未安装")
return False
# 检查应用版本是否满足要求
if check_app_version("***.example.myapp", 1001007):
print("应用版本满足要求")
else:
print("应用版本过低,需要更新")
# d.app_install("https://example.***/new-version.apk")
8.2 等待应用启动完成
app_wait方法可以等待应用启动完成:
# 启动应用并等待
d.app_start("***.example.myapp")
pid = d.app_wait("***.example.myapp", timeout=20.0, front=True)
if pid > 0:
print(f"应用启动成功,PID: {pid}")
else:
print("应用启动失败")
参数说明:
-
package_name:应用包名 -
timeout:最大等待时间,默认20秒 -
front:是否等待应用进入前台,默认False
8.3 应用启动时间测量
结合app_start和app_wait可以测量应用的启动时间:
import time
def measure_app_start_time(package_name):
start_time = time.time()
d.app_start(package_name)
pid = d.app_wait(package_name, front=True)
if pid > 0:
end_time = time.time()
return end_time - start_time
else:
return -1
# 测量应用启动时间
start_time = measure_app_start_time("***.example.myapp")
if start_time > 0:
print(f"应用启动时间: {start_time:.2f}秒")
else:
print("应用启动失败")
8.4 应用权限管理
app_auto_grant_permissions方法可以自动授予应用所需的权限:
# 自动授予应用所有请求的权限
d.app_auto_grant_permissions("***.example.myapp")
这在自动化测试中非常有用,可以避免权限请求对话框中断测试流程。
9. 常见问题与解决方案
9.1 应用安装失败
| 问题 | 解决方案 |
|---|---|
| 签名不一致 | 卸载已安装的旧版本应用后重试 |
| 存储空间不足 | 清理设备存储空间 |
| 安装来源不受信任 | 在设备设置中允许"未知来源" |
| APK文件损坏 | 重新下载或获取APK文件 |
9.2 应用启动失败
def safe_start_app(package_name, max_retries=3):
retries = 0
while retries < max_retries:
try:
d.app_start(package_name, stop=True, wait=True)
print("应用启动成功")
return True
except Exception as e:
retries += 1
print(f"应用启动失败 (重试 {retries}/{max_retries}): {str(e)}")
if retries < max_retries:
d.app_clear(package_name)
time.sleep(2)
return False
# 安全启动应用
safe_start_app("***.example.myapp")
9.3 处理应用崩溃
使用watchers可以监控应用崩溃并自动处理:
# 设置崩溃监控
d.watcher("应用崩溃").when(text="很抱歉,应用已停止运行").click(text="确定")
# 启用监控器
d.watcher.start()
# 执行应用操作...
# 停止监控器
d.watcher.stop()
10. 应用管理API综合示例
下面是一个综合示例,演示如何使用uiautomator2的应用管理API构建完整的应用测试流程:
import uiautomator2 as u2
import time
import os
def test_app_lifecycle():
# 连接设备
d = u2.connect_usb()
print("设备信息:", d.device_info)
# 应用包名
package_name = "***.example.myapp"
apk_path = os.path.expanduser("~/Downloads/app-debug.apk")
try:
# 检查应用是否已安装,如有则卸载
if d.app_info(package_name):
print("卸载现有应用...")
d.app_uninstall(package_name)
# 安装应用
print("安装应用...")
d.app_install(apk_path)
# 检查应用是否安装成功
app_info = d.app_info(package_name)
print(f"应用信息: 版本 {app_info['versionName']} ({app_info['versionCode']})")
# 启动应用
print("启动应用...")
start_time = time.time()
d.app_start(package_name, wait=True)
launch_time = time.time() - start_time
print(f"应用启动时间: {launch_time:.2f}秒")
# 授予应用所有权限
print("授予应用权限...")
d.app_auto_grant_permissions(package_name)
# 执行一些基本操作
print("执行应用操作...")
d(text="跳过").click()
d(text="我的").click()
time.sleep(2)
# 获取当前应用状态
current_app = d.app_current()
print(f"当前应用: {current_app['package']}")
# 停止应用
print("停止应用...")
d.app_stop(package_name)
# 验证应用已停止
running_apps = d.app_list_running()
if package_name not in running_apps:
print("应用已成功停止")
else:
print("应用停止失败")
print("应用生命周期测试完成")
return {
"su***ess": True,
"launch_time": launch_time
}
except Exception as e:
print(f"测试过程中出错: {str(e)}")
return {
"su***ess": False,
"error": str(e)
}
finally:
# 清理测试环境
if d.app_info(package_name):
d.app_uninstall(package_name)
# 运行测试
result = test_app_lifecycle()
print("测试结果:", result)
11. 总结与展望
uiautomator2提供了全面的应用管理API,涵盖了从安装、启动到卸载的完整应用生命周期。通过这些API,我们可以轻松构建自动化测试流程,提高测试效率和可靠性。
本文介绍的主要API包括:
| API方法 | 功能描述 |
|---|---|
app_install |
安装应用 |
app_uninstall |
卸载应用 |
app_uninstall_all |
批量卸载应用 |
app_start |
启动应用 |
app_stop |
停止应用 |
app_stop_all |
停止所有应用 |
app_clear |
清除应用数据 |
app_info |
获取应用信息 |
app_current |
获取当前运行应用 |
app_list |
获取已安装应用列表 |
app_list_running |
获取运行中应用列表 |
app_wait |
等待应用启动完成 |
session |
创建应用会话 |
未来,随着uiautomator2的不断发展,应用管理API可能会增加更多高级功能,如应用更新、后台运行管理等。建议定期查看官方文档和更新日志,以获取最新功能和最佳实践。
通过掌握这些应用管理API,你可以构建更强大、更可靠的Android自动化测试框架,为你的应用质量保驾护航。
12. 扩展学习资源
- uiautomator2官方文档: https://github.***/openatx/uiautomator2
- Android开发者文档: https://developer.android.***/reference
- ADB命令参考: https://developer.android.***/studio/***mand-line/adb
【免费下载链接】uiautomator2 Android Uiautomator2 Python Wrapper 项目地址: https://gitcode.***/gh_mirrors/ui/uiautomator2