如何用Appium绕过com.android.permissioncontroller权限审核界面?
解决方案:Appium Android权限弹窗卡住问题
针对你遇到的权限审核界面无法操作的问题,核心原因是无需新建驱动实例,应使用当前驱动直接处理系统弹窗;同时优化capabilities配置来自动授权权限,以下是具体解决步骤:
1. 优化Capabilities配置,启用自动权限授权
首先在初始化驱动时添加自动授权相关配置,确保Appium尽可能自动处理权限请求:
public static AppiumDriver options() throws MalformedURLException, URISyntaxException { File appDir = new File("src"); File app = new File(appDir, "ApiDemos-debug.apk"); URL localURL = new URI("http://127.0.0.1:4723/wd/hub").toURL(); UiAutomator2Options capabilities = new UiAutomator2Options(); capabilities.setPlatformName("Android"); capabilities.setDeviceName("Emulator"); capabilities.setApp(app.getAbsolutePath()); // 自动授予应用请求的所有权限 capabilities.setAutoGrantPermissions(true); // 自动接受系统级弹窗(如权限提示) capabilities.setAutoAcceptAlerts(true); // 延长等待时间,适配Android 13弹窗加载 capabilities.setNewCommandTimeout(Duration.ofSeconds(30)); AppiumDriver driver = new AppiumDriver(localURL, capabilities); return driver; }
2. 使用现有驱动直接处理权限弹窗
删除allowAppPermissionController方法,无需新建驱动,直接在主逻辑中用当前驱动定位并点击权限弹窗按钮:
public static void main(String[] args) throws MalformedURLException, URISyntaxException, InterruptedException { AppiumDriver driver = options(); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10)); // 处理权限弹窗:用UiAutomator定位更可靠(适配Android 13控件) try { driver.findElement(AppiumBy.androidUIAutomator("new UiSelector().text(\"Continue\")")).click(); System.out.println("权限弹窗已处理"); } catch (NoSuchElementException e) { // 弹窗未出现或已被自动处理,跳过 System.out.println("无权限弹窗需处理"); } // 后续自动化操作示例 // driver.findElement(AppiumBy.accessibilityId("Accessibility")).click(); // 最后关闭驱动 // driver.quit(); }
3. 关键问题说明
- 为何新建驱动无效:每个Appium Session对应一个设备连接实例,新建驱动会尝试创建新Session,但当前设备已被第一个Session占用,导致报错;且权限弹窗属于当前Session的上下文,无需重新初始化驱动。
autoGrantPermissions不生效原因:Android 13的权限弹窗逻辑有更新,部分特殊权限(如通知权限)无法被自动授权,需手动补充处理;同时要确保设备上的Appium Settings应用正常运行。- 确认权限界面的包名/Activity:如果需要手动切换到权限应用(极少场景),可通过
adb shell dumpsys window | grep mCurrentFocus命令获取当前界面的包名和Activity,替换你代码中的PermissionControllerPackage和PermissionControllerActivity值。
4. 备选方案:手动切换应用(如需)
如果权限弹窗属于独立的系统应用界面,可使用startActivity切换应用,无需新建驱动:
// 切换到权限控制器应用 driver.startActivity(new Activity("com.google.android.permissioncontroller", "com.android.permissioncontroller.permission.ui.ReviewPermissionsActivity")); // 点击Continue按钮 driver.findElement(AppiumBy.androidUIAutomator("new UiSelector().text(\"Continue\")")).click(); // 切回ApiDemos应用 driver.startActivity(new Activity("io.appium.android.apis", "io.appium.android.apis.ApiDemos"));
内容的提问来源于stack exchange,提问作者michel reyes
相关产品推荐
相关产品推荐

