AirtestProject 【装包测试】Android 应用权限授权小技巧

fishfish-yu · 2024年09月05日 · 最后由 fishfish-yu 回复于 2024年09月12日 · 4595 次阅读

此文章来源于项目官方公众号:“AirtestProject”\
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

一、前言

大家在日常测试中,每次新安装应用或游戏都有一些前置的权限设置需要点击,但在不同的 Android 设备上的同意按钮都不完全相同,如果需要提高脚本的通用性以及复用性我们应该怎么办呢?那我们本周就一起来探讨一下这个问题吧~

二、pm 授权与取消授权指令详解

PM 工具,即包管理器(Package Manager),是 Android 开发和测试中不可或缺的工具。可以用于执行安装应用程序、查询应用包信息、管理系统权限以及控制应用程序。通常,PM 工具位于系统的/system/bin目录下。

pm 工具有两个指令参数,分别是 grant(授予应用权限许可) 与 revoke(撤销应用权限),在Airtest环境的具体使用如下:

#授予应用权限许可。必需android6.0(API级别23)以上的设备
shell(pm grant <packageName> <permission>)

#撤销应用权限。必需android6.0(API级别23)以上的设备
shell(pm revoke <packageName> <permission>)

在知道了 pm 工具的使用方法之后,那我们来看一下我们常用的 Android 应用的权限操作指令有哪些呢?当然,我们这里只是列举了一部分常见的权限指令,更多的权限指令,我们可以自行去搜索一下。

指令说明 指令
应用的电话权限 android.permission.READ_PHONE_STATE
应用存储的读取权限 android.permission.READ_EXTERNAL_STORAGE
应用存储的写入权限 android.permission.WRITE_EXTERNAL_STORAGE
应用打开位置权限 android.permission.ACCESS_COARSE_LOCATION
应用打开摄像头权限 android.permission.CAMERA
应用访问麦克风 android.permission.RECORD_AUDIO
应用读取联系人数据 android.permission.READ_CONTACTS
应用读取短信数据 android.permission.READ_SMS
应用读取设备的日历表 android.permission.READ_CALENDAR
应用写入设备的日历表 android.permission.WRITE_CALENDAR

如果我们需要给微博打开 “允许应用的电话权限”,或者关闭 “允许应用的电话权限”,那我们可以这么写:

#允许应用的电话权限
shell("pm grant com.sina.weibo android.permission.READ_PHONE_STATE")

#撤销应用的电话权限
shell("pm revoke com.sina.weibo android.permission.READ_PHONE_STATE")

将应用包名跟对应的权限指令传入,即可给对应的应用开启对应权限指令,但有个别权限是需要执行两条权限授权指令,如:读写设备存储权限、读写设备日历表等

#允许应用存储的读写权限
shell("pm grant com.sina.weibo android.permission.READ_EXTERNAL_STORAGE")
shell("pm grant com.sina.weibo android.permission.WRITE_EXTERNAL_STORAGE")

#撤销应用存储的读写权限
shell("pm revoke com.sina.weibo android.permission.READ_EXTERNAL_STORAGE")
shell("pm revoke com.sina.weibo android.permission.WRITE_EXTERNAL_STORAGE")

在装包后通过先行允许对应的权限,再打开应用进行测试,这样我们可以减少这类权限申请弹窗的跳出。或者需要测试应用的权限申请弹窗是否可以正常跳出的时候,可以反复通过关闭对应的权限,再进行打开应用进行测试。

三、使用案例

根据上述所说的命令以及使用方式,我们可以根据自己的测试需求组合一个小小的使用案例,我们这里就利用了微博 APP 为例,可以看到我们在同意了 APP 权限之后,直接打开是可以跳过权限弹窗的,当我们撤销关闭掉权限之后,应用的弹窗是照常出现的。

参考代码:

# -*- encoding=utf8 -*-
__author__ = "Airtest"

from airtest.core.api import *

auto_setup(__file__)

from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)

# 定义授予权限的函数
def grant_permit():
    #先行允许应用的电话权限
    shell("pm grant com.sina.weibo android.permission.READ_PHONE_STATE")
    print("已允许应用的电话权限")

    #允许应用存储的读写权限
    shell("pm grant com.sina.weibo android.permission.READ_EXTERNAL_STORAGE")
    shell("pm grant com.sina.weibo android.permission.WRITE_EXTERNAL_STORAGE")
    print("已允许应用存储的读写权限")

# 定义撤销权限的函数
def revoke_permit():

    #撤销应用的电话权限
    shell("pm revoke com.sina.weibo android.permission.READ_PHONE_STATE")
    print("已撤销应用的电话权限")

    #撤销应用存储的读写权限
    shell("pm revoke com.sina.weibo android.permission.READ_EXTERNAL_STORAGE")
    shell("pm revoke com.sina.weibo android.permission.WRITE_EXTERNAL_STORAGE")
    print("已撤销应用存储的读写权限")

    
if __name__ == "__main__":
    #安装微博app
    install("./com.sina.weibo.apk")

    #点击确认安装按钮
    poco("com.sonymobile.cta:id/btn_ok").wait_for_appearance()
    poco(text="确定").click()
    
    #先允许微博的所需权限
    grant_permit()
    
    #点击打开微博App
    start_app("com.sina.weibo")

    #点击开屏的用户隐私确认
    poco(text="我知道了").click()

    # 检查微博是否成功打开
    if exists(Template(r"tpl1725350455008.png", record_pos=(0.001, -0.803), resolution=(1080, 2520))):
        print("已成功打开微博")
        
    #关闭微博
    stop_app("com.sina.weibo")
    
    #移除微博的所需权限
    revoke_permit()
    
     #点击打开微博App
    start_app("com.sina.weibo")
    sleep(3.0)

    # 检查权限申请弹窗是否出现
    if exists(Template(r"tpl1725350984228.png", record_pos=(0.001, -0.061), resolution=(1080, 2520))):
        print("权限申请弹窗正常跳出")

四、小结

本周推文我们介绍了关于 Android 设备的应用权限授权以及撤销授权的命令以及在 Airtest 环境中的具体的使用方法。包括了常见的电话权限、媒体存储权限等等。大家可以根据自己的需求去找更多的权限指令,并运用起来。

同时如果大家在使用过程中有一些新的使用方式或者遇到了问题,又或者有任何想要深入了解的知识点,欢迎在官方交流群(526033840)里告诉我们或者提交 issue。


AirtestIDE 下载:airtest.netease.com/\
Airtest 教程官网:airtest.doc.io.netease.com/\
搭建企业私有云服务:airlab.163.com/b2b

官方答疑 Q 群:526033840

最佳回复
Xovz 回复

不完全需要 root,一般这个报错的话,是你应用没有这个权限请求,所以你申请了也不会生效

共收到 4 条回复 时间 点赞

使用 pm 命令是会报错无权限设置,需要 root 设备才可以授权设备权限吗?

报错信息:Exception occurred while executing 'grant':
java.lang.SecurityException: grantRuntimePermission: Neither user 2000 nor current process has android.permission.GRANT_RUNTIME_PERMISSIONS.
at android.app.ContextImpl.enforce(ContextImpl.java:2187)
at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:2215)
at com.android.server.pm.permission.PermissionManagerService.grantRuntimePermissionInternal(PermissionManagerService.java:1477)

Xovz 回复

不完全需要 root,一般这个报错的话,是你应用没有这个权限请求,所以你申请了也不会生效

fishfish-yu 回复

还有一点是,这个权限申请是开发同学这边可以打开的,如果遇到了某个权限是无法开启或不生效的,可以找开发同学帮忙看一下是否有添加了权限申请

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册