Android Uiautomator2 Python Wrapper应用管理API:安装、卸载与启动全掌握

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_startapp_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

转载请说明出处内容投诉
CSS教程网 » Android Uiautomator2 Python Wrapper应用管理API:安装、卸载与启动全掌握

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买