一、工具准备

Eclipse

ant 环境(添加ant到环境变量)

Android SDK(添加android、adb等到环境变量)

Java 环境

待测APK(BBX司机端)

真机or夜神模拟器or雷电模拟器等等(本文使用夜神模拟器)

二、打开工具,配置好环境

添加adb环境变量

打开夜神模拟器--开发者模式--USB调试

adb connect 127.0.0.1:62001 连接模拟器

adb devices命令可以出来设备

用命令安装apk:adb install -r C:\Users\zekyll\Desktop\资料\xxx-release.apk

打开夜神模拟器,可以看到软件已经安装完成

三、编写脚本

1、创建工程:

打开Eclipse软件--File--New--Java Project--输入工程名称--Finish

2、创建package

3、添加libs文件夹和设置UTF-8属性

4、添加uiautomator.jar和Android.jar这两个外部引用包

5、创建testcase(.java)

6、API熟悉:

该部分转自:https://blog.csdn.net/u013247461/article/details/81042763

UiDevice(基于设备操作)

  概述:

    UiDevice用与访问关设备状态的信息,也可以使用这个类来模拟用户在设备上的操作。可以通过下面的方法得到实例:

    UiDevice mdevice = getUiDevice();

  摘要:

函数返回值 函数体 说明 实例
boolean click(int x, int y) 模拟用户在指定位置点击 mdevice.click(200, 300) 点击屏幕的200,300坐标处
String getCurrentActivityName() 获得的是应用程序在桌面上显示的名字 例如,在qq首页得到的是“QQ”,在微信登录页得到的是“微信”,注意,这个得到的不是Activity的名字
String getCurrentPackageName() 获得当前显示的应用程序的包名 例如,在微信启动的时候,获得的是“com.tencent.mm”
int getDisplayHeight() 获得当前设备的屏幕分辨率的高 例如,我的手机1920*1080,得到的是 1920
int getDisplayWighth() 获得当前设备的屏幕分辨率的宽 例如,我的手机1920*1080,得到的是 1080
boolean isScreenOn() 判断手机当前是否灭屏 当手机灭屏的时候,得到是“false”,手机亮屏,得到的是“true”
void wakeUp() 点亮当前屏幕 调用后,相当于按下了电源键,如果手机设置了滑动锁屏,滑动锁屏还是在的,不会自动解开
boolean pressBack() 点击back键  
boolean pressHome() 点击home键  
boolean pressMenu() 点击menu键  
boolean pressKeyCode(int keyCode) 利用keycode值模拟一次按下事件 例如,需要按下数字1 数字1的keycode是 KEYCODE_NUMPAD_1,更多keycode可以在 http://developer.android.com/intl/zh-cn/reference/android/view/KeyEvent.html 进行查询
boolean swipe(int startX, int startY, int endX, int endY, int steps) 用指定的步长,从A点滑动B点 例如,需要从(10, 10)点用两步滑动到(100, 200)点,则需要mdevice.swipe(10, 10, 100, 200, 2)
boolean takeScreenshot(File storePath) 截取当前屏幕,保存到文件 例如,File files = new File("/sdcard/res.jpg"); mdevice.takeScreenshot(files); 即可将截图保存到sd卡中了。

UiSelector(控件定位)

  概述:

    按照一定的条件(例如控件的text值,资源id),定位界面上的元素。UiSelector对象的最终目的是去构造一个UiObject对象。

  摘要:

1、根据text构造:

函数返回值 函数体 说明 用法
UiSelector text(String text) 根据“控件text属性的内容”构造出UiSelector对象 例如,一个控件text的值是“发现”,UiSelector s = new UiSelector().text("发现");
UiSelector textContains(String text) 根据“控件text属性包含的内容”构造出UiSelector对象 同上例子:UiSelector s = new UiSelector().textContains("现");
UiSelector textMatches(String regex) 根据“控件text属性正则表达式的内容”构造出UiSelector对象 正则表达式语法参考网上资料即可。
UiSelector textStartsWith(String text) 根据“控件text属性开始的内容”构造出UiSelector对象 同上例子:UiSelector s = new UiSelector().textStartsWith("发");

      比较常用,准确度也比较高,中文查找的时候,如果遇到 “UiOjbectNotFoundException” 的时候,记得把项目的编码格式改为utf-8。

2、根据description构造:

UiSelector description(String desc) 根据“控件content-desc属性的内容”构造出UiSelector对象
UiSelector descriptionContains(String desc) 包含**
UiSelector descriptionMatches(String regex) 正则
UiSelector descriptionStartsWith(String desc) 以**开始

      同text的用法基本一致,也是比较靠谱的一种方式。

3、根据资源id:

UiSelector resourceId(String id) 根据资源id获取对象,例如:UiSelector s = new UiSelector().resourceId("com.tencent.mm:id/b8m")
UiSelector resourceIdMatches(String regex) 根据资源id的正则表达式获取对象

4、根据类:

      UiSelector className(String className):

        根据控件的类名来找到UiSelector对象。

          

        但是呢?因为一般Android布局的时候,同样的控件类名都是一样的。

        因此我在微信的登录界面调用: UiSelector s = new UiSelector().className("android.widget.TextView") 这句话,它得到的就是我左上开始算第一个class名称为“android.widget.TextView”的控件。

      

      UiSelector instance (int instance):

        上面提到的假如我们想获取屏幕上电话号码的那个TextView使用这样方法,就可以使用instance:

            UiSelector s = new UiSelector().className("android.widget.TextView").instance(1);

    

      UiSelector index(int index):

        用法和上面的instance差不多,谷歌的原文说这个方法是unreliable的,推荐使用instance方法。

          

      UiSelector childSelector(UiSelector selector):

        有的时候假如子控件不好获得,而其父控件比较好获得的时候,我们通常采用这样的方式,例如下面:

        

      我们目前选中的是LinearLayout,这个Android中的一种布局,它的里面嵌套了两个控件,一个是ImageView,另一个是EditText。这们这里就通过LinearLayout这个控件找到它的子控件。

        很明显,父控件id已经给定。我们先得到父控件:UiSelector s_p = new UiSelector().resourceId("com.tencent.mm:id/axj");

        其次 UiSelector s_c= s_p.childSelector( new UiSelector().className("android.widget.EditText") );

        在它的父控件的childSelector方法中传入一个带有一定特征的UiSelector对象,即可得到子控件,这里 s_c 就是输入框的UiSelector对象。

      

      UiSelector fromParent(UiSelector selector):

        有的时候父控件也不好获得,而是同级的控件(同属一个parent)比较好获取,那么使用这样方法,还拿上面的举例:

        我们先得到EditText的UiSelector对象:UiSelector s1 = new UiSelector().resourceId("com.tencent.mm:id/axc");

        得到和它同样一个父控件的ImageView的UiSelector对象:UiSelector s2 = fromParent( new UiSelector().className("android.widget.ImageView") );

    

5、根据特有属性:

UiSelector checked(boolean val) 根据是否可check来构造出UiSelector对象
UiSelector chickable(boolean val)  
UiSelector enabled(boolean val)  
UiSelector focusable(boolean val)  
UiSelector longClickable(boolean val)  
UiSelector scrollable(boolean val)  
UiSelector selected(boolean val)  

      举个简单的例如,假如当前的界面,只有一个checkbox是勾选状态,你就可以这样得到:UiSelector s2 = new UiSelector().checked(true)

        

UiCollection  

  概述: 用的不多,直接参考文档   

  摘要: http://android.toolib.net/tools/help/uiautomator/UiCollection.html

UiScrollable(滚动列表)

  概述:  用的不多,直接参考文档   

  摘要: http://www.cnblogs.com/by-dream/p/4921701.html

UiObject(控件实例)

  概述:可以理解为 直接操作界面ui元素的实例。

  摘要:

返回值 函数
void ClearTextField() 在可以编辑处清除已经存在的文本内容
boolean click() 执行单击
boolean clickAndWaiForNewWindow(long timeout) 执行单击,等待窗口出现,等待时间参数中设置
boolean clickAndWaiForNewWindow() 点击等待一个新窗口的出现,默认等待时间
boolean clickBottomRight() 点击ui元素的右下方
boolean clickTopLeft() 点击ui元素的左上方
boolean exists() 检查ui 元素是否存在
Rect getBounds() 返回ui元素的坐标值
UiObject getChild(UiSelector selector) 通过参数中的对象,创建一个新的当前元素的子类ui元素的子类元素
int getChildCount() 获取对象下子类ui元素数量
String getContentDescription() 读取ui 元素的描述信息值
UiObject getFromParent(UiSelector selector) 根据当前参数对象从父类元素获取子类信息
String getPackageName() 读取Ui元素的包名称
final UiSelector getSelector() 获取selector用作帮助调试
String getText() 根据Ui元素获取文本值
Rect getVisibleBounds() 返回ui元素的可视范围
boolean isCheckable() 检查对象的checkable属性是否为true
boolean isChecked() 检查对象的checked属性是否为true
boolean isClickable() 检查对象的clickable属性是否为true
boolean isEnabled() 检查对象的enabled属性是否为true
boolean isFocusable() 检查对象的focusable属性是否为true
boolean isFocused() 检查对象的focused属性是否为true
boolean isLongClickable() 检查对象的longclickable属性是否为true
boolean isScrollable() 检查对象的scrollable属性是否为true
boolean isSelected() 检查对象的selected属性是否为true
boolean longClick() 长按对象
boolean longClickBottomRight() 长按对象右下方
boolean longClickTopLeft() 长按对象左上方
boolean setText(String text) ui对象中输入文字
boolean swipeDown(int steps) 向下滑动steps个步长
boolean swipeLeft(int steps) 往左滑动step个步长
boolean swipeRight(int steps) 往右滑动steps个步长
boolean swipeUp(int steps) 向上滑动steps个步长
boolean waitForExists(long timeout) 等待对象出现
boolean waitUntilGone(long timeout) 等待对象消失

7、编写脚本

package com.bbx.testcase;import java.io.File;import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;import android.widget.EditText;
import junit.framework.Assert;public class LoginApp extends UiAutomatorTestCase {public void testCase() {UiDevice device=UiDevice.getInstance();try {//点击HOME,回到桌面device.pressHome();//定位桌面的“帮邦行司机”APP图标,并点击new UiObject(new UiSelector().text("xxxx应用")).clickAndWaitForNewWindow();//等待2秒Thread.sleep(2000);//输入手机号new UiObject(new UiSelector().text("输入手机号")).setText("15444444444");//输入密码new UiObject(new UiSelector().className(EditText.class.getName()).instance(1)).setText("123456");//点击登录new UiObject(new UiSelector().resourceId("com.xxx.mobile:id/login_tx_btn")).clickAndWaitForNewWindow();//等待2秒Thread.sleep(2000);//验证是否测试通过Assert.assertTrue(!new UiObject(new UiSelector().text("输入手机号")).exists());} catch (Exception e) {//获取当前系统时间戳long current = System.currentTimeMillis();//过程中若出现失败,则截图,并停止case执行device.takeScreenshot(new File("/sdcard/"+current+".png"));System.out.println("interrupt:\n "+e.getMessage()+"\n ScreenShot at :/sdcard/"+current+".png");e.printStackTrace();}}
}
 

8、编译为可执行文件.jar

首先,获取Android list值,一般为1

其次,打开cmd命令窗口,输入:android create uitest-project -n jar包名称自定义 -t androidlist值 -p 当前工程地址。以我这边为例:

android create uitest-project -n bbxtest -t 1 -p C:\DEV\eclipse-workspace\BBX

在eclipse刷新(File--Refresh)之后,可以看到多了个build.xml文件,双击打开并修改其中help字段为build

再次,cmd命令中cd到工程目录,执行ant命令

9、push到手机端,并且执行

使用push命令推送jar包到手机端:adb push C:\DEV\eclipse-workspace\BBX\bin\bbxtest.jar /data/local/tmp

使用命令调起uiaiutomotor:adb shell runtest uiautomator jar包名 -c package名+类名 --nohup

adb shell uiautomator runtest bbxtest.jar -c com.bbx.testcase.LoginApp --nohup

第一条Android自动化测试脚本相关推荐

  1. 用ADB命令写Android自动化测试脚本

    之前有用过monkey进行测试,简单测试一下稳定性:最近也简单了解了一下Espresso感觉还可以,可以对UI进行测试和校验:最近发现自己根据adb命令来写一下脚本来执行自动化测试也是不错的,比较有意 ...

  2. linux 模拟打电话,Ubuntu+Python+UIAutomator写Android自动化测试脚本-模拟拨打电话

    序言 首先介绍一下python和uiautomator 1.UIAutomator是Android官方推出的安卓应用界面自动化测试工具,是最理想的针对APK进行自动化功能回归测试的利器,使用UIAut ...

  3. 腾讯Android自动化测试实战

    腾讯Android自动化测试实战 丁如敏 盛娟 等著 图书在版编目(CIP)数据 腾讯Android自动化测试实战 / 丁如敏等著. -北京:机械工业出版社,2016.10 ISBN 978-7-11 ...

  4. python写web自动化_使用Python+selenium实现第一个自动化测试脚本

    原标题:使用Python+selenium实现第一个自动化测试脚本 最近在学web自动化,记录一下学习过程. 此处我选用python3.6+selenium3.0,均用最新版本,以适应未来需求. 环境 ...

  5. Android自动化测试第一季(基础篇)-金阳光-专题视频课程

    Android自动化测试第一季(基础篇)-32195人已学习 课程介绍         Android自动化测试第一季 初级 课程收益     零基础 讲师介绍     金阳光 更多讲师课程      ...

  6. 【金阳光测试】Android自动化测试第一季第四讲—Robotium原理初步和录制器

    百度传课:http://www.chuanke.com/v1983382-106000-218428.html 一.基于控件 控件: 1.  Spinner 2.  TabHost 3.  Galle ...

  7. selenium自动化测试多条数据选择第一条

    如果我们测试时在一个页面中存在多条数据元素名称一致但是我们要选择第一条? 示意图: 方法一 driver.find_element_by_css_selector('.article-list/div ...

  8. 用selenium4 webdriver + java 开发第一个自动化测试脚本

    环境准备: 1.环境准备: 搜有资源可以从百度网盘下载链接:https://pan.baidu.com/s/17Yp3M-eCA429jv3A3KBCkA  提取码:1234 1)安装java环境,我 ...

  9. Android 自动化测试Monkey、Monkeyrunner

    软件测试是软件产品开发过程中的重要环节,对于保重软件质量具有重要的意思.手动测试和自动化测试是软件测试的两个基本手段.本文主要介Android – 自动化测试 Android平台上提供了一些自动化测试 ...

最新文章

  1. python中使用flask实现人脸实时检测
  2. 历届试题 大臣的旅费 树形DP
  3. netty:NIO模型--选择器(Selector)
  4. 上传漏洞新姿势(限Linux)
  5. php beego,MixPHP 2.2 / Beego 1.12 数据库查询性能对比
  6. 数据库行转列的sql语句(zt)
  7. 为什么一般不将'在制品转出科目'设为初级成本要素
  8. [js高手之路] vue系列教程 - vue的事件绑定与方法(2)
  9. 无限极 php算法,无限极分类算法,对你一定有帮助
  10. 获取第三方应用的签名
  11. ▲▲▲▲▲▲▲▲▲▲▲yum源的配置(本地和ftp)▲▲▲▲▲▲▲▲▲▲▲▲▲v...
  12. SQL数据库置疑修复
  13. 【机器学习基石】感知机模型+PLA(二)
  14. 用java实现编译器之代码实现Thompson构造:在简单NFA的基础上构造更复杂的NFA
  15. python中数字加引号和不加引号的区别_高考完小白自学Python,不太懂print语句中一个加引号,一个不加?...
  16. Android第三方框架之学习高德地图SDK-----①集成环境,获取定位信息,地图显示。
  17. ORACLE DataGuard环境搭建详细步骤(新方法)
  18. 卧底“刷量”卖家,有关微信公众号“刷量”的五个劲爆事实
  19. 联想电脑 PE重装系统
  20. reverse()的使用

热门文章

  1. 修改aapt和自定义资源ID
  2. Python图形用户界面GUI入门
  3. 应用安装失败,原因是应用标识符具有
  4. 重庆北大青鸟解放碑校区J12班 皮皮虾队【八戒租车平台】
  5. 宜泊科技加入阿里云原生合作伙伴计划,共建智慧停车新生态
  6. 查看Linux服务器的配置信息
  7. 天天预约 | 2022年11月产品更新
  8. 【玩转RT-Thread】CPK-RA6M4智慧门禁系统教学
  9. 腾讯云服务器 - 将 Spring Boot 项目部署到云服务器上(保姆级教程)
  10. applewatch怎么记录步数(苹果手表运动追踪用法)