用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.

 

功能不難,但是自己知之甚少。還是邁小步,不停步吧。記錄工作學習。共勉。

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