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

此文章来源于项目官方公众号:“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