美文网首页
Android测试之UI Automator

Android测试之UI Automator

作者: 卖梦想的男孩 | 来源:发表于2017-02-21 17:44 被阅读796次

UI Automator 测试框架提供了一组 API 来构建 UI 测试,用于在用户应用和系统应用中执行交互,适合编写黑盒自动化测试,其测试代码不依赖于目标应用的内部实现详情。要求 Android 4.3(API >= 18)

UI Automator分为三个主要部分

  1. UI 查看器
    uiautomatorviewer 工具位于 <android-sdk>/tools/ 目录,用来查看和分析 Android 设备上当前显示的 UI 组件和布局层次结构,并以方便查找元素对其操作。


    UI 查看器

    左上角四个按钮依次是:

  • 打开 本地保存的ui信息
  • 查看(全部)
  • 查看(精简)
  • 保存 保存ui信息到本地
  1. 利用UiDevice设备操作
  • 更改设备旋转
  • 按 D-pad 按钮
  • 按“返回”、“主屏幕”或“菜单”按钮
  • 打开通知栏
  • 屏幕截图
  1. 利用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();
    }
}

详情见传送门

相关文章

网友评论

      本文标题:Android测试之UI Automator

      本文链接:https://www.haomeiwen.com/subject/yijuwttx.html