Android Marshmallow 引入的新权限方案需要在运行时检查特定权限,这意味着需要根据用户是拒绝还是允许访问来提供不同的流程。
当我们使用 Espresso 在我们的应用程序上运行自动 UI 测试时,我们如何模拟或更新权限的状态以测试不同的场景?
在新版本的 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 ");
}
}
}
}
我在这里找到了它