Android UiAutomator 1&2
目录
- UiAutomator1 官网 教程1 教程2
- 1、JDK / SDK / ANT 安装
- 2、新建java工程,添加junit、Android库(sdk\platforms\android-xx下面的android.jar和uiautomator.jar android-17以上)
- 3、新建java类:
- 4、cmd下执行
android list
,查看API 大于15的SDK的ID值 - 5、cmd下执行
android create uitest-project -n <name> -t <android-sdk-ID> -p <path>
其中name为将来生成的jar包的名字,可以自己定义,android-sdk-ID为上一步骤看到的2,path是上面2中的项目路径。执行完成后会在项目根目录下生成build.xml文件 - 6、cmd进入项目根目录,执行
ant build
,执行完后会在bin目录下生成jar文件 - 7、将jar包push到Android手机中,
adb push <jar文件路径> data/local/tmp
- 8、在cmd下执行
adb shell uiautomator runtest <jar文件名> -c <包名.类名>
进行测试 - 9、修改代码后,需重新执行ant clean-6-7-8
- UiAutomator2 教程
- UiAutomator1和2两者的主要区别如下
- 1、JDK / SDK / GRADLE
- 2、创建一个简单的Android工程(有无Activity无所谓),需要注意的是minSdkVersion必须大于等于18。
- 3、 在对应module的build.gradle文件中,添加对uiautomator的dependends引用
- 总的build.gradle
- 4、在项目的androidTest下会自动生成ExampleInstrumentedTest,同级下新增测试class-SalaryShowAppTest
- 5、SalaryShowAppTest源码如下
- 6、如果是在Android Studio下,可以直接通过默认的配置执行测试,但是如果是IDEA下,需要手工配置一个Configuration,选择Android Instrumented Tests
UiAutomator1 官网 教程1 教程2
1、JDK / SDK / ANT 安装
2、新建java工程,添加junit、Android库(sdk\platforms\android-xx下面的android.jar和uiautomator.jar android-17以上)
3、新建java类:
public class Test extends UiAutomatorTestCase {
public void testDemo() throws UiObjectNotFoundException{
UiDevice.getInstance().pressHome();
UiObject browserObject = new UiObject(new UiSelector().text("Browser"));
browserObject.clickAndWaitForNewWindow();
UiObject editoObject = new UiObject(new UiSelector().className("android.widget.EditText"));
editoObject.click();
UiDevice.getInstance().pressDelete();
editoObject.setText("www.baidu.com");
UiDevice.getInstance().pressEnter();
sleep(2000);
}
}
4、cmd下执行android list
,查看API 大于15的SDK的ID值
5、cmd下执行android create uitest-project -n <name> -t <android-sdk-ID> -p <path>
其中name为将来生成的jar包的名字,可以自己定义,android-sdk-ID为上一步骤看到的2,path是上面2中的项目路径。执行完成后会在项目根目录下生成build.xml文件
6、cmd进入项目根目录,执行ant build
,执行完后会在bin目录下生成jar文件
7、将jar包push到Android手机中,adb push <jar文件路径> data/local/tmp
8、在cmd下执行adb shell uiautomator runtest <jar文件名> -c <包名.类名>
进行测试
9、修改代码后,需重新执行ant clean-6-7-8
UiAutomator2 教程
UiAutomator1和2两者的主要区别如下
(a)2.0基于 Instrumentation, 可以获取应用Context,可以使用Android服务及接口。
(b)2.0基于 Junit4,测试用例无需继承于任何父类,方法名不限,使用Annotation进行, 1.0需要继承UiAutomatorTestCase,测试方法需要以test开头。
(c)2.0采用Gradle进行构建,1.0使用Maven或Ant。
(d)2.0新增UiObject2、Until、By、BySelector等接口。
(e)2.0输出到Logcat,1.0可以使用System.out.print输出流回显至执行端。
(f)2.0输出为APK,1.0输出为JAR。
1、JDK / SDK / GRADLE
2、创建一个简单的Android工程(有无Activity无所谓),需要注意的是minSdkVersion必须大于等于18。
3、 在对应module的build.gradle文件中,添加对uiautomator的dependends引用
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:26.1.0'
compile 'com.android.support.constraint:constraint-layout:1.1.3'
testCompile 'junit:junit:4.12'
androidTestCompile('com.android.support.test.espresso:espresso-core:3.0.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
// Set this dependency to use JUnit 4 rules
androidTestCompile 'com.android.support.test:rules:0.4'
// Set this dependency to build and run UI Automator tests
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}
总的build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "28.0.1"
defaultConfig {
applicationId "com.testcrash.qiaoqiao.uiautomator20"
minSdkVersion 18
targetSdkVersion 26
versionCode 1
versionName "1.0"
//使用android的runner执行脚本
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:26.1.0'
compile 'com.android.support.constraint:constraint-layout:1.1.3'
testCompile 'junit:junit:4.12'
androidTestCompile('com.android.support.test.espresso:espresso-core:3.0.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
// Set this dependency to use JUnit 4 rules
androidTestCompile 'com.android.support.test:rules:0.4'
// Set this dependency to build and run UI Automator tests
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
}
4、在项目的androidTest下会自动生成ExampleInstrumentedTest,同级下新增测试class-SalaryShowAppTest
5、SalaryShowAppTest源码如下
package com.testcrash.qiaoqiao.uiautomator20;
import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.UiDevice;
import android.util.Log;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
/**
* Description:
* Created by quxun on 2018-11-23.
*/
@RunWith(AndroidJUnit4.class)
public class SalaryShowAppTest {
private final String TAG = getClass().getName();
private String mPackageName = "com.tencent.mm";
private String mActivity = "com.tencent.mm.ui.LauncherUI";
@Test
public void case1() {
UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
try {
if (!mDevice.isScreenOn()) {
mDevice.wakeUp();
}
} catch (RemoteException e) {
e.printStackTrace();
}
mDevice.pressHome();
startApp(mPackageName);
mDevice.waitForWindowUpdate(mPackageName, 5 * 2000);
closeApp(mDevice, mPackageName);
mDevice.waitForIdle(10000);
startApp(mDevice, mPackageName, mActivity);
mDevice.waitForWindowUpdate(mPackageName, 5 * 2000);
closeApp(mDevice, mPackageName);
}
private void startApp(String packageName) {
Context mContext = InstrumentationRegistry.getContext();
Intent mIntent = mContext.getPackageManager().getLaunchIntentForPackage(packageName);
mContext.startActivity(mIntent);
}
private void closeApp(UiDevice uiDevice, String packageName) {
Log.i(TAG, "closeApp: ");
try {
uiDevice.executeShellCommand("am force-stop " + packageName);
} catch (IOException e) {
e.printStackTrace();
}
}
private void startApp(UiDevice uiDevice, String packageName, String launchActivity) {
try {
uiDevice.executeShellCommand("am start -n " + packageName + "/" + launchActivity);
} catch (IOException e) {
e.printStackTrace();
}
}
}