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