UIAutomator2.0在UIDevice类中,提供了两个静态方法,用于获取UIDevice对象。
(1)static UIDevice getInstance()
(2)static UIDevice getInstance(Instrumentation instrumentation)
方法(1)可以不用关注,官方已将该方法废弃。即,方法(2)是唯一获取UIDevice对象的方法。
Instrumentation mInstrumentation=InstrumentationRegistry.getInstrumentation();
UIDevice mDevice=UiDevice.getInstance(mInstrumentation);
从方法(2)中可以看到,要获取UIDevice对象,需要提供Instrumentation对象作为输入参数。
Instrumentation是移动测试的白盒框架,类似于window系统的hook程序,从系统层面实现对APP的监听。而UIAutomator2.0框架,正是基于Instrumentation框架。简单来说,Instrumentation对象可以看做一个通过监听获取信息的通道。而通过该通道获取的设备信息,即是UIDevice。
InstrumentationRegistry可以看做是Instrumentation的工厂类,通过工厂类获取Instrumentation的单例。
我们先简单理解Instrumentation,之后将用单独的篇幅介绍Instrumentation框架,这里不再啰嗦。
这里,我们用简单的例子来测试UIDevice是否获取成功。
代码如下:
package com.breakloop.u2demo;
import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.UiDevice;
import android.util.Log;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Created by user on 2017/10/31.
*/
@RunWith(JUnit4.class)
public class UIDeviceTest {
private final String TAG=getClass().getName();
@Test
public void getDevice() {
UiDevice mUIDevice=UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
if(mUIDevice!=null){
Log.i(TAG, "get Device successfully");
}else {
Log.i(TAG, "get Device failed");
}
}
}
运行结果如下: