UiAutomator 使用简介

来源:互联网 发布:怎么在淘宝投诉卖家 编辑:程序博客网 时间:2024/04/30 10:24

UiAutomator 使用简介

首先新建一个Android Studio工程,在build.gradle中添加以下依赖:

    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'

先看一下测试流程:
输入邮箱>输入密码>点击登录按钮>等待界面加载>从列表中选择一个元素并点击>返回Home界面
演示效果如图:

这里写图片描述

接下来开始写测试代码,在androidTest目录下新建测试类,测试类需要继承UiAutomatorTestCase,为了使测试代码看起来更简洁,将一些常用的方法封装在一个抽象类中:

public abstract class UiAutomatorHelper extends UiAutomatorTestCase {    public UiDevice mUiDevice;    @Override    protected void setUp() throws Exception {        super.setUp();        mUiDevice = getUiDevice();    }    public abstract void testMethod();    /**     * 从UiCollection中随机选择一个子元素并点击     *     * @param idCollection UiCollection id     * @param idChild      Child id     * @return     */    public boolean randomClickCollectionChild(String idCollection, String idChild) {        boolean clickSucceed = false;        UiCollection collection = getCollection(idCollection);        UiSelector selectorChild = getSelector(idChild);        int childCount = collection.getChildCount(selectorChild);        if (childCount == 0)            return false;        int randChild = new Random().nextInt(childCount);        log("randChild=" + randChild);        try {            UiObject obj = collection.getChildByInstance(selectorChild, randChild);            clickSucceed = clickObj(obj);        } catch (UiObjectNotFoundException e) {            e.printStackTrace();        }        return clickSucceed;    }    /**     * 从UiCollection中随机选择指定子元素并点击     *     * @param idCollection UiCollection id     * @param idChild      Child id     * @param index        child index     * @return     */    public boolean clickCollectionChild(String idCollection,String idChild,int index){        boolean clickSucceed = false;        UiCollection collection = getCollection(idCollection);        UiSelector selector = getSelector(idChild);        try {            UiObject objChild = collection.getChildByInstance(selector, index);            clickSucceed = clickObj(objChild);        } catch (UiObjectNotFoundException e) {            e.printStackTrace();        }        return clickSucceed;    }    public UiCollection getCollection(String id) {        UiSelector selector = getSelector(id);        return new UiCollection(selector);    }    public UiSelector getSelector(String id) {        return new UiSelector().resourceId(id);    }    public UiObject getObjById(String id) {        return new UiObject(getSelector(id));    }    /**     * 点击元素     * @param id     */    public boolean clickObj(String id) {        log("click id=" + id);        UiObject obj = getObjById(id);        return clickObj(obj);    }    public boolean clickObj(UiObject obj) {        if (!obj.exists())            return false;        boolean clickSucceed = false;        try {            clickSucceed = obj.click();        } catch (UiObjectNotFoundException e) {            e.printStackTrace();        }        try {            if (!clickSucceed) {                Rect rect = obj.getBounds();                int clickX = (rect.left + rect.right) / 2;                int clickY = (rect.top + rect.bottom) / 2;                log("click:" + clickX + "," + clickY);                clickSucceed = mUiDevice.click(clickX, clickY);            }        } catch (UiObjectNotFoundException e) {            e.printStackTrace();        }        return clickSucceed;    }    public void waitForUi(String id,long timeOut){        UiObject obj = getObjById(id);        obj.waitForExists(timeOut);    }    public boolean inputText(String id,String text){        boolean succeed = false;        UiObject obj = getObjById(id);        try {            succeed = obj.setText(text);        } catch (UiObjectNotFoundException e) {            e.printStackTrace();        }        return succeed;    }    public void log(String textContent) {        System.out.println(textContent);        Log.i("UiAutomator", "log: " + textContent);    }    /**     * 页面向下滑动一段距离     */    public void swipeDown() {        mUiDevice.swipe(312, 600, 407, 325, 10);    }    /**     * 向上滑动一段距离     */    public void swipeUp() {        mUiDevice.swipe(312, 325, 407, 600, 10);    }    /**     * 向右滑动一段距离     */    public void swipeRight() {        mUiDevice.swipe(400, 500, 200, 500, 10);    }    /**     * 向左滑动一段距离     */    public void swipLeft() {        mUiDevice.swipe(200, 500, 400, 500, 10);    }}

写测试逻辑代码的类继承上面的抽象类,找出需要的UI组件的资源id(可以用Android SDK\tools\uiautomatorviewer.bat查看)
注意测试方法命名必须以test开头

public class UiAutomatorTest extends UiAutomatorHelper {    @Override    public void testMethod() {        //install UiAutomatorTestApp and open before testing        //simulate login        login();        //wait for login        waitForUi("com.github.uiautomatortestapp:id/rv_book_list", 10000);        //click item 2        clickCollectionChild("com.github.uiautomatortestapp:id/rv_book_list",                "com.github.uiautomatortestapp:id/card_book", 2);        SystemClock.sleep(3000);        //return home screen        mUiDevice.pressHome();    }    public void testPressHome(){        mUiDevice.pressHome();    }    public void login() {        //find email edit text        String editEmailId = "com.github.uiautomatortestapp:id/email";        UiObject objEmail = getObjById(editEmailId);        //get focus        clickObj(objEmail);        //input email        inputText(editEmailId, "test@gmail.com");        String editPasswdId = "com.github.uiautomatortestapp:id/password";        UiObject objPasswd = getObjById(editPasswdId);        clickObj(objPasswd);        inputText(editPasswdId, "123456");        //click login button        clickObj("com.github.uiautomatortestapp:id/email_sign_in_button");    }}

运行前先安装测试app并打开登录界面
测试app源码:https://github.com/bobcatkay/UiAutomatorTestApp

另外,一个类中可以同时有多个测试方法,只需要在运行的时候选择一下方法即可:

这里写图片描述

源码:https://github.com/bobcatkay/UiAutomatorDemo

原创粉丝点击