美文网首页
单元测试(5)-权限申请及权限弹窗的处理

单元测试(5)-权限申请及权限弹窗的处理

作者: lisx_ | 来源:发表于2020-03-23 16:13 被阅读0次

在单元测试中,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;
    }

相关文章

网友评论

      本文标题:单元测试(5)-权限申请及权限弹窗的处理

      本文链接:https://www.haomeiwen.com/subject/pyuzehtx.html