Android UiAutomator2.0
一、环境搭建
JDK(java环境)、SDK(adb appt环境),这两个已经不想再叙述了直接看详见-->
android studio 安装,下载地址:https://developer.android.google.cn/studio/index.html
安装完成,打开后大概是这个样子的:

二、新建测试工程
1.开始新建一个工程:点击上图的“Start a new Android Studio project ”
2.进入创建工程界面,设置app的名称、包名,及工程路径,点击 “Next”

3.选择平台类型及sdk的最小版本,点击 “Next”

4.选择Empty Activity,点击“Next”;选择No Activity,点击“Finish”

5.工程创建完成。(默认是Android目录模式,且有一个默认的Module【app】)
这里附上以下界面的较为详细的介绍>>>>>

三、编写脚本
在编写脚本前说明几点:(实例并非以上新建的工程目录,但并不影响此教程)
a:脚本实例中将测试脚本写在main中,以便后续build apk后,能在CTS框架中运行。
b:需先配置AndroidManifest.xml文件、build.gradle(Module:app)文件、以及settings.gradle文件。
1.settings.gradle文件内容

2.AndroidManifest.xml文件中添加Instrumentation标签

3.build.gradle(Module:app)文件中添加测试依赖的包。文件代码如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
applicationId "com.zzw.testdemo"
minSdkVersion 24
targetSdkVersion 26
versionCode 1
versionName "1.0"
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'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
testCompile 'junit:junit:4.12'
compile 'com.android.support.test:runner:0.5'
// Set this dependency to use JUnit 4 rules
compile 'com.android.support.test:rules:0.5'
// Set this dependency to build and run Espresso tests
compile 'com.android.support.test.espresso:espresso-core:2.2.2'
// Set this dependency to build and run UI Automator tests
compile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
// Add uiTestHelper
compile project(':uiTestHelper')
}
4.接下来就是代码的编写了,这里贴出一个例子
package com.zzw.testdemo; import android.graphics.Rect;
import android.os.Environment;
import android.os.SystemClock;
import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiScrollable;
import android.support.test.uiautomator.UiSelector; import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import java.io.File;
import java.io.IOException;
import java.util.Locale; /**
* Created by zzw on 2017/12/19.
*/ public class TestPermission2 {
private UiDevice mDevice;
private static long LONG_TIMEOUT = 5000;
private static long SHORT_TIMEOUT = 3000;
private static String TEST_PACKAGE_NAME ="com.android.settings";
private static String TEST_MAIN_ACTIVITY="com.android.settings/.Settings"; @Before
public void setUp() throws IOException {
mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
mDevice.executeShellCommand("pm clear "+TEST_PACKAGE_NAME);
} @After
public void tearDown(){
mDevice.pressHome();
} /**
* Case : 打开设置->点击语言&输入法->点击语言->切换语言(en || cn)
*
*/
@Test
public void test01_a()throws Throwable {
try {
// Launch settings application
mDevice.executeShellCommand("am start -n " + TEST_MAIN_ACTIVITY);
// Sleep 5s
SystemClock.sleep(LONG_TIMEOUT);
// Setting list interface
UiScrollable settingList = new UiScrollable(new UiSelector().resourceId("com.android.settings:id/dashboard_container"));
// Sliding lookup "Languages & input" or "语言和输入法"
UiObject languageInput = mDevice.findObject(new UiSelector().textMatches("Languages & input|语言和输入法"));
settingList.scrollIntoView(languageInput); //UiObject languageInput = settingList.getChildByText(new UiSelector().textMatches("Languages & input|语言和输入法")
// ,Locale.getDefault().getLanguage().equals("en")?"Languages & input":"语言和输入法"); // Click "Languages & input" or "语言和输入法"
languageInput.clickAndWaitForNewWindow();
// Click "Languages" or "语言"
mDevice.findObject(new UiSelector().textMatches("Languages|语言")).clickAndWaitForNewWindow();
// Add language control
UiObject addLanguage = mDevice.findObject(new UiSelector().resourceId("com.android.settings:id/add_language"));
// Language list interface control
UiObject dragList = mDevice.findObject(new UiSelector().resourceId("com.android.settings:id/dragList"));
// The first language displayed rect
Rect rect = dragList.getChild(new UiSelector().className("android.widget.RelativeLayout").index(0)).getBounds();
// Language cn control
UiObject cn = dragList.getChild(new UiSelector().textMatches(".*中文(中国)"));
// Language en control
UiObject en = dragList.getChild(new UiSelector().text("English (United States)"));
// Add language list interface control
UiScrollable findList = new UiScrollable(new UiSelector().className("android.widget.ListView"));
// If language cn and en exists in the language list interface
if (cn.exists() && en.exists()) {
UiObject first = dragList.getChild(new UiSelector().className("android.widget.RelativeLayout").index(0))
.getChild(new UiSelector().className("android.widget.TextView")); if (first.getText().equals("English (United States)")) {
// if the first language displayed "English (United States)" , Switch to cn
cn.dragTo(rect.centerX(), rect.top, 500);
} else if (first.getText().matches(".*中文(中国)")) {
// if it displayed ".*中文(中国)" , Switch to en
en.dragTo(rect.centerX(), rect.top, 500);
} else {
// else none of them , Switch to en
en.dragTo(rect.centerX(), rect.top, 500);
}
} else if (cn.exists() && !en.exists()) {
// if cn exists and en not exists , add en and switch to en
addLanguage.clickAndWaitForNewWindow();
findList.getChildByText(new UiSelector().text("English"), "English").clickAndWaitForNewWindow();
findList.getChildByText(new UiSelector().text("United States"), "United States").clickAndWaitForNewWindow();
SystemClock.sleep(SHORT_TIMEOUT);
en.dragTo(rect.centerX(), rect.top, 500);
} else if (en.exists() && !cn.exists()) {
// if en exists and cn not exists , add cn and switch to cn
addLanguage.clickAndWaitForNewWindow();
UiObject chinese = mDevice.findObject(new UiSelector().textMatches(".*中文"));
findList.scrollIntoView(chinese);
chinese.clickAndWaitForNewWindow();
UiObject china = mDevice.findObject(new UiSelector().text("中国"));
if (china.exists()) {
china.clickAndWaitForNewWindow();
}
SystemClock.sleep(SHORT_TIMEOUT);
cn.dragTo(rect.centerX(), rect.top, 500);
} else {
// else none of them , add en and switch to en
addLanguage.clickAndWaitForNewWindow();
findList.getChildByText(new UiSelector().text("English"), "English").clickAndWaitForNewWindow();
findList.getChildByText(new UiSelector().text("United States"), "United States").clickAndWaitForNewWindow();
SystemClock.sleep(LONG_TIMEOUT);
en.dragTo(rect.centerX(), rect.top, 500);
}
SystemClock.sleep(LONG_TIMEOUT);
}catch (Throwable e){
// if error exist ,print stack trace log and screenshot to sdcard/test01_a.png
e.printStackTrace();
mDevice.takeScreenshot(new File(Environment.getExternalStorageDirectory(),this.getClass().getName()+".png"));
}finally {
mDevice.pressBack();
mDevice.pressBack();
mDevice.pressBack();
}
} @Test
public void test02_a() { } @Ignore
public void test03_a() { }
}
四、运行测试
1.首先来看下在哪里运行测试,及怎么运行测试。步骤见图解

2.编辑运行测试的配置

3.运行测试

实际上测试执行是这样的:(1~4:安装主程序和测试程序; 5:执行测试)
adb push E:\Androids\AndroidStudioProjects\TestDemo\calculator\build\outputs\apk\calculator-debug.apk /data/local/tmp/ com.zzw.testdemo adb shell pm install -r /data/local/tmp/com.zzw.testdemo adb push E:\Androids\AndroidStudioProjects\TestDemo\calculator\build\outputs\apk\calculator-debug-androidTest.apk /data/local/tmp/ com.zzw.testdemo.test adb shell pm install -r /data/local/tmp/com.zzw.testdemo.test adb shell am instrument -r -e debug false -e class com.zzw.testdemo.TestPermission2#test01_a com.zzw.testdemo.test/android.support.test.runner.AndroidJUnitRunner
五、生成报告
六、使用CTS框架运行测试脚本
要使用CTS测试框架进行测试生成报告:需要将测试脚本写在main中(编写脚本处也提到过),然后将生成的主程序 app-debug.apk放置CTS的testcase目录下,配置完成后即可运行测试。详见 《Android UiAutomator - CTS Frame》cts 7.0以上部分=>>>>
Android UiAutomator2.0的更多相关文章
- UiAutomator2.0升级填坑记
UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sk ...
- UiAutomator2.0 - Toast信息的验证
目录 问题:在做UI自动化测试时,偶尔会碰到 Toast 这种提示信息(如图),通过Uiautomatorviewer 无法获该类控件的信息.所以无法验证,该条case不能实现.然后就没然后了... ...
- UiAutomator2.0 - 与AccessibilityService的关联
目录 一.Android中的 Accessibility 二.UiAutomator2.0 与 AccessibilityService 三.验证与 AccessibilityService的关联 A ...
- UiAutomator2.0 - 控件实现点击操作原理
目录 一.UiObject 二.UiObject2 穿梭各大技术博客网站,每天都能看到一些的新的技术.突然感觉UiAutomator 2.0相对于现在来说已经是个很久远的东西了ε=(´ο`*))).写 ...
- UiAutomator1.0 与 UiAutomator2.0
在使用2.0之前,对android自动化框架也做过一些了解<Android 自动化测试框架>.使用UiAutomator2.0也有一段时间,这里将1.0与2.0进行一个对比总结. Ui ...
- 初探UiAutomator2.0中使用Xpath定位元素
J 今天的主题是讲一下在使用过程中遇到的一个问题,如何在UiAutomator2.0中使用Xpath定位元素? 背景 现在的app在打包成apk的时候都是有加固处理的,各种混淆加固,所以已经破坏了或扰 ...
- uiautomator2.0框架
1. Uiautomator1.0 Uiautomator2.0 date 2012 2015 super class UiAutomatorTestCase InstrumentationTes ...
- Uiautomator1.0与Uiautomator2.0测试项目搭建与运行原理
Uiautomator是Android原生测试框架,可以用于白盒接口测试也可以用于UI自动化测试,Uiautomator分1.0版本与2.0版本,它们都是基于UiAutomation的测试框架,都是通 ...
- Android数据存储之Android 6.0运行时权限下文件存储的思考
前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...
随机推荐
- rabbitMQ学习1:消息队列介绍与rabbitmq安装使用
1. 什么是消息队列 生活里的消息队列,如同邮局的邮箱, 如果没邮箱的话, 邮件必须找到邮件那个人,递给他,才玩完成,那这个任务会处理的很麻烦,很慢,效率很低 但是如果有了邮箱, 邮件直接丢给邮箱,用 ...
- luogu P3237 [HNOI2014]米特运输
传送门 谢特运输 先要搞懂题目是什么意思,简化版题意就是一棵有根树,要使得每个点都满足任意一个儿子的权值等于这个点权值除以儿子数量,问最少要修改多少个点的点权 就可以一边dfs求出每个点权值是点1的多 ...
- 第26月第6天 selenium
1.selenium /** * @author Young * @param locator * @param values * @throws Exception */ protected voi ...
- Hadoop思维导图之概述
- pwnable.kr col
collision - 3 pt 连接上查看col.c源码 分析一下代码, 1.hashcode等于一个固定的值 2.check_password函数取输入数据,4个一组,将输入的字符转成int,然后 ...
- Hadoop配置文件参数详解
core-site.xml <configuration> <property> <name>hadoop.tmp.dir</name> <val ...
- 2016521-Java-第八周学习总结
课本知识点 start() run()定义线程线程对象被调度之后所执行的操作 -sleep(int millsecond),必须在try-catch语句块中调用sleep方法 sAlive() 线程同 ...
- Des加密解密算法java实现
package tech.fullink.eaglehorn.utils; import javax.crypto.Cipher; import javax.crypto.SecretKey; imp ...
- Jenkins远程构建
首先在Jenkins上配置Job: 按照图片形式,仅需往对应的url发送请求即可 Shell如下: import json import urllib.parse,http.client def po ...
- NAND Flash底层原理,SLC MLC TLC比较【转】
转自:https://blog.csdn.net/qq_39560607/article/details/81714145 版权声明:请注明转载自Christa_RJ https://blog.csd ...