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 测试代码

 1 package com.test.tommyxie.hellouiautomator;
 2 
 3 import android.app.Instrumentation;
 4 import android.content.Context;
 5 import android.content.Intent;
 6 import android.net.Uri;
 7 import android.os.Bundle;
 8 import android.support.test.InstrumentationRegistry;
 9 import android.support.test.runner.AndroidJUnit4;
10 import android.support.test.uiautomator.UiDevice;
11 
12 import org.junit.Before;
13 import org.junit.Test;
14 import org.junit.runner.RunWith;
15 
16 import java.io.IOException;
17 
18 /**
19  * Created by tommyxie on 16/3/3.
20  */
21 
22 @RunWith(AndroidJUnit4.class)
23 public class TestClass01 {
24     public UiDevice mDevice;
25     public Instrumentation instrumentation;
26 
27     @Before
28     public void setUp(){
29         instrumentation = InstrumentationRegistry.getInstrumentation();
30         mDevice = UiDevice.getInstance(instrumentation);
31     }
32 
33     @Test
34     public void testCase01() throws IOException {
35         //获取运行时的参数
36         Bundle args = InstrumentationRegistry.getArguments();
37         //输出到运行报告中
38         instrumentation.sendStatus(100, args);
39 
40         //获取测试包的Context
41         Context testContext = InstrumentationRegistry.getContext();
42         //获取被测应用的Context
43         Context testedContext = InstrumentationRegistry.getTargetContext();
44 
45         //通过Context来启动一个Activity,e.g.浏览器
46         String url = "https://www.baidu.com";
47         Intent i1 = new Intent(Intent.ACTION_VIEW);
48         i1.setData(Uri.parse(url));
49         i1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
50         testContext.startActivity(i1);
51         
52         //通过目标Context来启动拨号功能
53         Intent i2 = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + 10086));
54         i2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
55         testedContext.startActivity(i2);
56         
57         Bundle inputBundle = new Bundle();
58         inputBundle.putString("key", "value");
59         //注入一个Bundle
60         InstrumentationRegistry.registerInstance(instrumentation, inputBundle);
61         //获取运行参数
62         Bundle outBundle = InstrumentationRegistry.getArguments();
63         //输出到结果报告中
64         instrumentation.sendStatus(110,outBundle);
65 
66 
67     }
68 
69 }

 1.3.2 运行结果

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 代码示例

 1 package com.test.tommyxie.hellouiautomator;
 2 
 3 import android.app.Instrumentation;
 4 import android.os.Bundle;
 5 import android.os.Environment;
 6 import android.support.test.InstrumentationRegistry;
 7 import android.support.test.runner.AndroidJUnit4;
 8 import android.support.test.uiautomator.By;
 9 import android.support.test.uiautomator.UiDevice;
10 import android.support.test.uiautomator.UiObject;
11 import android.support.test.uiautomator.UiObject2;
12 import android.support.test.uiautomator.UiObjectNotFoundException;
13 import android.support.test.uiautomator.UiSelector;
14 import android.support.test.uiautomator.Until;
15 import android.widget.TextView;
16 
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.junit.runner.RunWith;
20 
21 import java.io.File;
22 import java.io.FileOutputStream;
23 import java.io.IOException;
24 import java.io.OutputStream;
25 import java.util.List;
26 
27 /**
28  * Created by tommyxie on 16/3/3.
29  */
30 
31 @RunWith(AndroidJUnit4.class)
32 public class TestClass01 {
33     public UiDevice mDevice;
34     public Instrumentation instrumentation;
35 
36     @Before
37     public void setUp(){
38         instrumentation = InstrumentationRegistry.getInstrumentation();
39         mDevice = UiDevice.getInstance(instrumentation);
40     }
41 
42     @Test
43     public void testCase01() throws IOException, UiObjectNotFoundException {
44 
45         //dumpWindowHierarchy(OutPutStream out)
46         File file = new File(Environment.getExternalStorageDirectory()+File.separator+"dump.xml");
47         if(file.exists()){
48             file.delete();
49         }
50         file.createNewFile();
51         OutputStream outputStream = new FileOutputStream(file);
52         mDevice.dumpWindowHierarchy(outputStream);
53 
54         //executeShellCommand(String cmd)
55         mDevice.executeShellCommand("am start -n com.tencent.mobileqq/.activity.SplashActivity ");
56 
57         //findObject(BySelector selector)
58         mDevice.wait(Until.findObject(By.text("联系人")),2000);
59         UiObject2 uiObject2 = mDevice.findObject(By.text("联系人"));
60         uiObject2.click();
61 
62         //findObject(UiSelector selector)
63         UiObject uiObject = mDevice.findObject(new UiSelector().text("短信"));
64         uiObject.click();
65 
66         //findObjects(BySelector selector)
67         List <UiObject2> uiObject21 = mDevice.findObjects(By.clazz(TextView.class));
68         Bundle bundle = new Bundle();
69         for (UiObject2 a:uiObject21) {
70             bundle.putString("TextView", a.getText());
71         }
72         instrumentation.sendStatus(123,bundle);
73 
74 
75     }
76 
77 }

 

 原创:http://blog.csdn.net/swordgirl2011/article/details/50941555

posted @ 2016-11-25 16:12  快乐生活740  阅读(3041)  评论(0编辑  收藏  举报