提问者:小点点

Android Marshmallow:使用浓缩咖啡测试权限?


Android Marshmallow 引入的新权限方案需要在运行时检查特定权限,这意味着需要根据用户是拒绝还是允许访问来提供不同的流程。

当我们使用 Espresso 在我们的应用程序上运行自动 UI 测试时,我们如何模拟或更新权限的状态以测试不同的场景?


共3个答案

匿名用户

在新版本的 Android 测试支持库 1.0 中,您可以在测试中使用 GrantPermissionRule,以便在开始任何测试之前授予权限。

@Rule public GrantPermissionRule permissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_FINE_LOCATION);

Kotlin 解决方案

@get:Rule var permissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_FINE_LOCATION)

@get:必须使用规则以避免java.lang.Exception:@Rule“permissionRule”必须是公开的。更多信息在这里。

匿名用户

接受的答案实际上并不测试权限对话框;它只是绕过了它。因此,如果权限对话框由于某种原因失败,您的测试将给出错误的绿色。我鼓励实际单击“授予权限”按钮来测试整个应用程序行为。

看看这个解决方案:

public static void allowPermissionsIfNeeded(String permissionNeeded) {
    try { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !hasNeededPermission(permissionNeeded)) {
        sleep(PERMISSIONS_DIALOG_DELAY);
        UiDevice device = UiDevice.getInstance(getInstrumentation());
        UiObject allowPermissions = device.findObject(new UiSelector()
          .clickable(true) 
          .checkable(false) 
          .index(GRANT_BUTTON_INDEX));
        if (allowPermissions.exists()) {
          allowPermissions.click();
        } 
      } 
    } catch (UiObjectNotFoundException e) {
      System.out.println("There is no permissions dialog to interact with");
    } 
  } 

在这里找到整个班级: https://gist.github.com/rocboronat/65b1187a9fca9eabfebb5121d818a3c4

顺便说一下,由于这个答案很受欢迎,我们将 PermissionGranter 添加到 Barista 中,这是我们在 Espresso 和 UiAutomator 之上的工具,以使仪器测试绿色:https://github.com/SchibstedSpain/Barista 检查一下,因为我们将逐个版本维护它。

匿名用户

当您的手机处于英语区域设置时,请尝试使用这种静态方法:

private static void allowPermissionsIfNeeded() {
    if (Build.VERSION.SDK_INT >= 23) {
        UiDevice device = UiDevice.getInstance(getInstrumentation());
        UiObject allowPermissions = device.findObject(new UiSelector().text("Allow"));
        if (allowPermissions.exists()) {
            try {
                allowPermissions.click();
            } catch (UiObjectNotFoundException e) {
                Timber.e(e, "There is no permissions dialog to interact with ");
            }
        }
    }
}

我在这里找到了它