在单元测试中,app第一次加载时,经常遇到权限弹窗问题。我们可以结合预先申请和权限弹窗自动点击两种方式完美解决。
1. 预先申请
可以使用Rule注解,在程序开头预先申请需要的权限,并在xml文件中配置。
@AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
@xx.java
private static String[] PERMISSIONS = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
//Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO
};
@Rule
public GrantPermissionRule grantPermissionRule = GrantPermissionRule.grant(PERMISSIONS);
2. 权限弹窗自动点击。
这个需要用到uiautomator,在build.gradle中引入:
androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3'
uiautomator需要api18及以上才能引入,如果程序sdk小于18的话可以在测试文件夹下创建自己的配置文件,并添加如下配置
<uses-sdk tools:overrideLibrary="android.support.test.uiautomator.v18"/>
都配置好后,开始我们的权限弹窗自动点击逻辑。
public class PermissionGranter {
private static final String TAG = PermissionGranter.class.getSimpleName();
private static final int PERMISSIONS_DIALOG_DELAY = 3000;
private static final int GRANT_BUTTON_INDEX = 1;
private static ExecutorService executor;
private PermissionGranter() {
executor = getExecutor();
}
private static class SingletonHolder {
static PermissionGranter sInstance = new PermissionGranter();
}
public static PermissionGranter getInstance() {
return SingletonHolder.sInstance;
}
public void allowPermissionsIfNeededWithText(final String str) {
getExecutor().execute(new Runnable() {
@Override
public void run() {
allowPermissionsWithText(str);
}
});
}
private void allowPermissionsWithText(String str) {
try {
UiDevice device = UiDevice.getInstance(getInstrumentation());
UiObject allowPermissions = device.findObject(new UiSelector().text(str));
boolean exists = allowPermissions.waitForExists(PERMISSIONS_DIALOG_DELAY);
Log.d(TAG, "allowPermissionsWithText exists:" + exists);
if (exists) {
allowPermissions.click();
}
} catch (Exception e) {
Log.d(TAG, "allowPermissionsWithText e:" + e);
}
}
private ExecutorService getExecutor() {
if (executor == null) {
executor = Executors.newSingleThreadExecutor();
}
return executor;
}
网友评论