UI Automator 测试框架提供了一组 API 来构建 UI 测试,用于在用户应用和系统应用中执行交互,适合编写黑盒自动化测试,其测试代码不依赖于目标应用的内部实现详情。要求 Android 4.3(API >= 18)
UI Automator分为三个主要部分
-
UI 查看器
uiautomatorviewer 工具位于 <android-sdk>/tools/ 目录,用来查看和分析 Android 设备上当前显示的 UI 组件和布局层次结构,并以方便查找元素对其操作。
UI 查看器
左上角四个按钮依次是:
- 打开 本地保存的ui信息
- 查看(全部)
- 查看(精简)
- 保存 保存ui信息到本地
- 利用UiDevice设备操作
- 更改设备旋转
- 按 D-pad 按钮
- 按“返回”、“主屏幕”或“菜单”按钮
- 打开通知栏
- 屏幕截图
- 利用Api进行元素操作
主要涉及
- UIObject 界面元素
- UIObject2 新的界面元素,在元素销毁后失效
- UiSelector UIObject的选择器
- By UIObject2的选择器
在JUnit的基础上添加依赖:
dependencies{
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
}
由于uiautomator支持18以上的,所以配置文件的minSdkVersion需要修改下或者在AndroidManifest.xml中添加(不知道是不是bug,无效)
<uses-sdk tools:overrideLibrary="android.support.test.uiautomator.v18" />
还可以定义flavor来自定义一个专门用来测试。
package cn.kerison.playground.test;
//import ...
@LargeTest
@SdkSuppress(minSdkVersion = 18)
@RunWith(AndroidJUnit4.class)
public class DemoActivityTest2 {
private static final String PACKAGE_NAME = "cn.kerison.playground";
private static final int LAUNCH_TIMEOUT = 5000;
private UiDevice mDevice;
@Before
public void setUp() throws Exception {
//获取设备实例
mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
//点击Home键
mDevice.pressHome();
//确保最上层只有Launcher
final String launcherPackage = mDevice.getLauncherPackageName();
assertThat(launcherPackage, notNullValue());
mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)),LAUNCH_TIMEOUT);
//启动App
Context context = InstrumentationRegistry.getContext();
final Intent intent = context.getPackageManager()
.getLaunchIntentForPackage(PACKAGE_NAME);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intent);
//确保应用已启动
mDevice.wait(Until.hasObject(By.pkg(PACKAGE_NAME).depth(0)),LAUNCH_TIMEOUT);
}
@After
public void tearDown() throws Exception {
}
@Test
public void onShowPage() throws InterruptedException {
//查找的条件可以通过uiautomator获得。
//UIObject 方式操作元素
// try {
// mDevice.findObject(new UiSelector().className("android.widget.ImageButton").packageName("cn.kerison.playground").clickable(true)).click();
// } catch (UiObjectNotFoundException e) {
// e.printStackTrace();
// }
//UIObject2 方式操作元素
mDevice.findObject(By.clazz("android.widget.ImageButton").pkg("cn.kerison.playground").clickable(true)).click();
}
}
详情见传送门
网友评论