用UiDevice获取当前界面的UI组件的状态

写在最前面,这个功能能够实现,真的要非常感谢师兄:

http://lishiwen4.github.io/android/android-uiautomator

1. 写app(使用Android Studio)

因为我们是要用androidx.test.uiautomator.UiDevice。所以如果想要使用这里面的接口,不能像一般的APP那样将需要实现的部分放在E:\projects_android\DeviceUiTest\app\src\main\java\com\example\cassie_huang\deviceuitest路径,因为在这里面死活都掉不到的。

所以,在实际app中是将测试类放在了E:\projects_android\DeviceUiTest\app\src\androidTest\java\com\example\cassie_huang\deviceuitest路径下面。

直接贴上简单的测试code:

package com.example.cassie_huang.deviceuitest;


import android.support.test.InstrumentationRegistry;
import android.util.Log;

import org.junit.Before;
import org.junit.Test;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import androidx.test.uiautomator.UiDevice;

import static org.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertThat;


public class UiTest {
    private UiDevice mDevice;
    private static final int LAUNCH_TIMEOUT = 5000;
    private final String TAG = "CASSIE-getui";
    private  ByteArrayOutputStream baos = new ByteArrayOutputStream();
   // public File dest = new File("/sdcard/cassie.txt");
    @Before
    public void setUp() {
        // Initialize UiDevice instance
        mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
        assertThat(mDevice, notNullValue());

    }

    @Test
    public void myTest() {
        try {
            Log.e(TAG,"cassie11111111111111");
            mDevice.dumpWindowHierarchy(baos);
            baos.flush();
            String[] lines = baos.toString().split(System.lineSeparator());
            for (String line : lines) {
                Log.d(TAG, line.trim());
            }
            Log.e(TAG,"cassie22222");
           // mDevice.dumpWindowHierarchy(dest);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行的话,直接下command或者是直接运行"RUN"都可以。运行myTest的command是:

adb shell am instrument -w -r   -e debug false -e class 'com.example.cassie_huang.deviceuitest.UiTest#myTest' com.example.cassie_huang.deviceuitest.test/android.support.test.runner.AndroidJUnitRunner

当然,这个库里面还有很多的其他的api,能做的事情是很多的。

另外,这个project是有两个apk的。分别位于

E:\projects_android\DeviceUiTest\app\build\outputs\apk\androidTest\debug

E:\projects_android\DeviceUiTest\app\build\outputs\apk\debug

所以使用adb install安装的时候不要遗漏了。

2. 几个问题

2.1. 问题1-sync failed-Failed to open zip file.

错误提示:

Failed to open zip file.
Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
Re-download dependencies and sync project (requires network)
Re-download dependencies and sync project (requires network)

解决办法:

修改文件E:\projects_android\DeviceUiTest\gradle\wrapper\gradle-wrapper.properties

把下行中的https 改为 http

distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

2.2. 问题2-import fail

错误提示:

import androidx.test.uiautomator.UiDevice; //这一行的uiautomator显示为了红色字体

解决办法:

在E:\projects_android\DeviceUiTest\app\build.gradle文件中的dependencies里面添加:

androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'

此处是参考https://developer.android.com/training/testing/ui-testing/uiautomator-testing

2.3. 问题3-调用接口创建文件运行时提示permission denied

错误提示:

因为想使用接口dumpWindowHierarchy(File dest),所以需要创建一个文件到/sdcard/test.txt. 但是运行的log提示permission denied.

解决办法:

sign apk.

可以参考https://blog.csdn.net/sinat_24946363/article/details/79934086.

 

功能不难,但是自己知之甚少。还是迈小步,不停步吧。记录工作学习。共勉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章