如何用Python处理Android系统权限弹窗?Appium自动化测试求助
嘿,刚看到你的问题,作为也踩过Appium权限弹窗坑的过来人,给你几个实用的解决方案,肯定能帮你搞定!
解决Android系统权限弹窗的几种方案
方案1:直接定位并点击权限弹窗的ALLOW按钮
系统权限弹窗属于系统自带应用(比如packageinstaller)的元素,得用系统应用的元素ID来定位。Android 7.1.1的权限允许按钮,常规ID是com.android.packageinstaller:id/permission_allow_button。你可以在测试方法开头加这段逻辑,建议用显式等待代替固定sleep,代码会更稳定:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By def test_OpenDocuments(self): # 处理权限弹窗 try: # 最多等10秒,直到允许按钮可点击 allow_button = WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable((By.ID, "com.android.packageinstaller:id/permission_allow_button")) ) allow_button.click() except Exception as e: # 如果没有弹窗(比如已经授权过),直接跳过 print("权限弹窗未出现或已自动处理:", e) # 原来的业务逻辑 documentSearchButton = self.driver.find_element_by_id('example.example').click()
方案2:通过Desired Capabilities自动授权
这是最省心的方法!Appium提供了autoGrantPermissions参数,设为True后,会自动允许应用请求的所有权限,完全不用手动处理弹窗。你只需要在desired_caps里加一行配置就行:
def setUp(self): desired_caps = {} desired_caps['platformName'] = 'Android' desired_caps['platformVersion'] = '7.1.1' desired_caps['deviceName'] = 'Android Emulator' desired_caps['app'] = 'example.apk' # 新增自动授权配置 desired_caps['autoGrantPermissions'] = True self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
亲测Appium 1.3.1已经支持这个参数了,大概率能直接解决你的问题。
方案3:提前用ADB命令授予权限
如果你的测试环境是固定的,还可以在启动测试前用ADB命令直接给应用授好权限,这样连弹窗都不会出现。针对文件访问权限,执行这两条命令即可:
adb shell pm grant com.your.package.name android.permission.READ_EXTERNAL_STORAGE adb shell pm grant com.your.package.name android.permission.WRITE_EXTERNAL_STORAGE
把com.your.package.name换成你的应用包名,你可以用aapt dump badging example.apk | grep package命令从APK里提取,或者查看AndroidManifest.xml也能找到。
嫌手动敲命令麻烦的话,也可以在Python代码里通过os.system自动执行,比如在setUp最前面加:
def setUp(self): # 提前授予文件访问权限 os.system('adb shell pm grant com.your.package.name android.permission.READ_EXTERNAL_STORAGE') os.system('adb shell pm grant com.your.package.name android.permission.WRITE_EXTERNAL_STORAGE') # 原来的desired_caps配置 desired_caps = {} desired_caps['platformName'] = 'Android' desired_caps['platformVersion'] = '7.1.1' desired_caps['deviceName'] = 'Android Emulator' desired_caps['app'] = 'example.apk' self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
小提醒
- 尽量用显式等待代替固定
sleep,避免因为设备性能差异导致元素找不到的问题。 - 如果遇到多个权限弹窗(比如同时请求存储、相机等),方案2能一次性搞定所有授权,比逐个点击高效多了。
内容的提问来源于stack exchange,提问作者bluRNG
相关产品推荐
相关产品推荐

