写在最前面,这个功能能够实现,真的要非常感谢师兄:
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.
功能不难,但是自己知之甚少。还是迈小步,不停步吧。记录工作学习。共勉。