Android 8.0(API26) instrumented测试中如何点击ALLOW权限按钮?
解决Android 8.0(API26)instrumented测试中权限弹窗Allow按钮点击问题
问题背景
在Android 8.0设备上运行instrumented androidTest时,系统弹出录音权限请求弹窗,尝试通过文本匹配查找并点击Allow选项时,出现Clicking on non-clickable object错误。日志显示找到的对象是权限提示文本(com.android.packageinstaller:id/permission_message),而非真正可点击的按钮控件。
错误原因分析
原代码中By.textStartsWith("Allow")匹配到的是弹窗的提示语文本(内容包含"Allow My App to record audio?"),该TextView本身不可点击,并非实际的Allow按钮控件,因此点击操作失效。
可行解决方案
方案1:通过PackageInstaller的资源ID定位按钮
Android 8.0的系统权限弹窗按钮有固定的资源ID,直接通过ID精准查找:
UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); // 等待弹窗加载完成,超时5秒 device.wait(Until.hasObject(By.packageName("com.google.android.packageinstaller")), 5000); // 定位权限弹窗根容器 UiObject2 permissionDialog = device.findObject(By.packageName("com.google.android.packageinstaller")); if (permissionDialog != null) { // 通过资源ID查找Allow按钮 UiObject2 allowButton = permissionDialog.findObject(By.res("com.android.packageinstaller", "permission_allow_button")); if (allowButton != null && allowButton.isClickable()) { allowButton.click(); } else { Log.e("PermissionTest", "未找到可点击的Allow按钮"); } } else { Log.e("PermissionTest", "权限弹窗未出现"); }
方案2:通过弹窗区域坐标点击
若资源ID因厂商定制ROM失效,可通过弹窗边界计算按钮大致位置(通常在弹窗右下角):
UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); device.wait(Until.hasObject(By.packageName("com.google.android.packageinstaller")), 5000); UiObject2 permissionDialog = device.findObject(By.packageName("com.google.android.packageinstaller")); if (permissionDialog != null) { Rect dialogBounds = permissionDialog.getVisibleBounds(); // 计算右下角点击坐标(偏移量可根据实际调整) int clickX = dialogBounds.right - 80; int clickY = dialogBounds.bottom - 80; device.click(clickX, clickY); }
方案3:使用Espresso自动授予权限(推荐)
若项目采用Espresso测试框架,可通过GrantPermissionRule直接跳过弹窗,自动授予权限:
@Rule public GrantPermissionRule permissionRule = GrantPermissionRule.grant(Manifest.permission.RECORD_AUDIO);
该规则会在测试启动前自动完成权限授予,无需处理弹窗交互,适用于API 23及以上设备。
注意事项
- 必须添加弹窗等待逻辑,避免因弹窗未完全加载导致查找失败;
- 部分定制ROM可能修改权限弹窗结构,需针对不同厂商做适配。
内容的提问来源于stack exchange,提问作者sfinja
相关产品推荐
相关产品推荐

