You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 13:45:57