Uiautomator 2.0之UiDevice新增API学习小记

1. InstrumentationRegistry类

1.1. 类说明:

一个暴露的注册实例,持有instrumentation运行的进程和参数,还提供了一种简便的方法调用instrumentation, application context和instrumentation参数。

1.2 相关API

返回类型 API
static Bundle getArguments(): 返回一个instrumentation参数副本
static Context getContext():  返回instrumentation对应包的Context
static Instrumentation getInstrumentation(): 返回当前运行的instrumentation
static Context getTargetContext(): 返回一个目标应用程序的Context
static void registerInstance(Instrumentation instrumentation, Bundle arguments):记录或暴露当前instrumentation运行和instrumentation参数包的副本,存储在注册中心

1.3 简单示例

1.3.1 测试代码

package com.test.tommyxie.hellouiautomator;

import android.app.Instrumentation;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.IOException;

/**
 * Created by tommyxie on 16/3/3.
 */

@RunWith(AndroidJUnit4.class)
public class TestClass01 {
    public UiDevice mDevice;
    public Instrumentation instrumentation;

    @Before
    public void setUp(){
        instrumentation = InstrumentationRegistry.getInstrumentation();
        mDevice = UiDevice.getInstance(instrumentation);
    }

    @Test
    public void testCase01() throws IOException {
        //获取运行时的参数
        Bundle args = InstrumentationRegistry.getArguments();
        //输出到运行报告中
        instrumentation.sendStatus(100, args);

        //获取测试包的Context
        Context testContext = InstrumentationRegistry.getContext();
        //获取被测应用的Context
        Context testedContext = InstrumentationRegistry.getTargetContext();

        //通过Context来启动一个Activity,e.g.浏览器
        String url = "https://www.baidu.com";
        Intent i1 = new Intent(Intent.ACTION_VIEW);
        i1.setData(Uri.parse(url));
        i1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        testContext.startActivity(i1);
        
        //通过目标Context来启动拨号功能
        Intent i2 = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + 10086));
        i2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        testedContext.startActivity(i2);
        
        Bundle inputBundle = new Bundle();
        inputBundle.putString("key", "value");
        //注入一个Bundle
        InstrumentationRegistry.registerInstance(instrumentation, inputBundle);
        //获取运行参数
        Bundle outBundle = InstrumentationRegistry.getArguments();
        //输出到结果报告中
        instrumentation.sendStatus(110,outBundle);


    }

}


1.3.2 运行结果

Uiautomator 2.0之UiDevice新增API学习小记_第1张图片


2. UiDevice新增API

2.1 API 介绍

返回类型 API
void dumpWindowHierarchy(OutPutStream out): 获取当前页面层级到输出流
String executeShellCommand(String cmd): 执行一个shell命令。备注:此方法只支持api21以上,手机需要5.0系统以上
UiObject2 findObject(BySelector selector): 返回第一个匹配条件的对象
UiObject findObject(UiSelector selector): 返回一个匹配条件的代表视图的UiObject对象
List<UiObject2> findObjects(BySelector selector): 返回所有匹配条件的对象
<R> R wait(SearchCondition<R> condition, long timeout): 等待的条件得到满足

2.2 代码示例

package com.test.tommyxie.hellouiautomator;

import android.app.Instrumentation;
import android.os.Bundle;
import android.os.Environment;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiObject2;
import android.support.test.uiautomator.UiObjectNotFoundException;
import android.support.test.uiautomator.UiSelector;
import android.support.test.uiautomator.Until;
import android.widget.TextView;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

/**
 * Created by tommyxie on 16/3/3.
 */

@RunWith(AndroidJUnit4.class)
public class TestClass01 {
    public UiDevice mDevice;
    public Instrumentation instrumentation;

    @Before
    public void setUp(){
        instrumentation = InstrumentationRegistry.getInstrumentation();
        mDevice = UiDevice.getInstance(instrumentation);
    }

    @Test
    public void testCase01() throws IOException, UiObjectNotFoundException {

        //dumpWindowHierarchy(OutPutStream out)
        File file = new File(Environment.getExternalStorageDirectory()+File.separator+"dump.xml");
        if(file.exists()){
            file.delete();
        }
        file.createNewFile();
        OutputStream outputStream = new FileOutputStream(file);
        mDevice.dumpWindowHierarchy(outputStream);

        //executeShellCommand(String cmd)
        mDevice.executeShellCommand("am start -n com.tencent.mobileqq/.activity.SplashActivity ");

        //findObject(BySelector selector)
        mDevice.wait(Until.findObject(By.text("联系人")),2000);
        UiObject2 uiObject2 = mDevice.findObject(By.text("联系人"));
        uiObject2.click();

        //findObject(UiSelector selector)
        UiObject uiObject = mDevice.findObject(new UiSelector().text("短信"));
        uiObject.click();

        //findObjects(BySelector selector)
        List <UiObject2> uiObject21 = mDevice.findObjects(By.clazz(TextView.class));
        Bundle bundle = new Bundle();
        for (UiObject2 a:uiObject21) {
            bundle.putString("TextView", a.getText());
        }
        instrumentation.sendStatus(123,bundle);


    }

}

你可能感兴趣的:(android,测试)