寫在最前面,這個功能能夠實現,真的要非常感謝師兄:
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.
功能不難,但是自己知之甚少。還是邁小步,不停步吧。記錄工作學習。共勉。