没有零基础学安卓开发发基础的测试员怎么使用uiautomator

[摘要:测试用例已编写好了,那末怎样编译战运转呢?列位接着往下看吧~~
1.建立build文件
cmd下运转以下代码举行build文件建立
&span style=&font-family: YaHfont-siz]
测试用例已经编写好了,那么怎么编译和运行呢?各位接着往下看吧~~
1.创建build文件
cmd下运行以下代码进行build文件创建
&span style=&font-family:Microsoft YaHfont-size:14&& create uitest-project -n &jar name& -t 1 -p &workspace path&
-n指的是jar包名字
-t指的是你中的第几个SDK,可以通过android list查看
-p指的是你的工作的路径&/span&
如我们的例子可以直接运行,运行成功之后会显示在Demo1工程下创建了build.xml文件:
2.刷新工程之后,我们发现确实多了build.xml文件,将文件打开并将default值“help”修改为“build”:
3.开始编译,编译方法:
ant –buildfile&build.xml文件路径&
如果我直接在build.xml下进行操作,可以不加路径哦,例如:
编译成功!生成的jar包文件存放在:D:\adt-bundle--x86_64-\Demo1\bin\testDemo1.jar
插一嘴,如果没有配置ant的环境变量可能需要配置一下哦,eclipse中已经集成了ant,只需要在eclipse中搜索ant,然后添加到环境变量即可使用
4.将编译完成的jar包push到中,具体操作为:
&path_to_output_jar& /data/local/tmp/
注意,必须push到该路径下!!!
例如:adb push&D:\adt-bundle-windows-x86_64-\Demo1\bin\testDemo1.jar&&/data/local/tmp/
5.运行测试,具体操作为:
adbshell uiautomator runtest&jarname&-c &包名&.&类名&[#test
例如:adb shell uiautomator runtest testDemo1.jar -c com.li.test1
测试成功!你的用例就这么测试完成了哦!
PS:如果想再次进行测试,需要再循环以上的操作!下一篇将向大家介绍一种直接在eclipse中编译的方法哦~~> android自动化测试使用uiautomator怎样获取context?
android自动化测试使用uiautomator怎样获取context?
kskzdtidy & &
发布时间: & &
浏览:0 & &
回复:0 & &
悬赏:0.0希赛币
android&SDK自带的自动化测试uiautomator,使用时发现无法获取activity或context,各位大神,有办法解决吗?有精通uiautomator的大神吗?我还想获取view,比如获取textview。但是uiautomator里面只有获取UiObject的方法。大神们,救救我吧。谢谢啦
Uiautomator&没办法获取到相应apk的上下文的。hlfeng & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经解决,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&  1)JDK: 1.6及其以上版本  2)Eclipse  3) SDK  其中Eclipse和Android SDK已经被打包成ADT(Android Development Tools―安卓开发包),因此仅需要下载JDK和ADT即可。  下载地址:/s/1eQByJXC  2、配置开发环境:  1)安装JDK  一路点击next,将JDK安装在G:\Program Files\Java路径下  2)配置环境变量:  JAVA_HOME=G:\Program Files\Java\jdk1.7.0_45(机器上JDK的安装路径)  CLASSPATH=.;%JAVA_HOME%\lib\dt.%JAVA_HOME%\lib\tools.jar  Path=%JAVA_HOME%\%JAVA_HOME%\jre\bin  3)验证开发环境是否配置成功:  (1)打开新的终端窗口,输入java -version,显示JDK版本信息说明JDK配置成功  (2)继续终端输入javac,显示帮助信息说明JRE配置成功  3、Android环境配置:  1)解压ADT压缩包  将压缩包解压到任意你想放置的路径下,例如G:\adt-bundle-windows-x86-  2)配置环境变量  ANDROID_HOME=G:\adt-bundle-windows-x86-\sdk(SDK的路径)  Path=%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools  3)验证环境是否配置成功  (1)打开新的终端窗口,输入adb,有返回信息说明platform-tools配置成功  (2)继续输入android list,有返回信息说明tools配置成功  4、ANT环境配置:  1)配置环境变量  ANT_HOME=G:\adt-bundle-windows-x86-\eclipse\plugins\org.apache.ant_1.8.3.v  Path=%ANT_HOME%\bin  2)验证环境是否配置成功  打开新的终端窗口,输入ant,有返回信息说明ANT环境配置成功最近公司在开展Android的自动化测试,美国那边的开发人员利用Android的UI Testing和powershell搭建了一个Android自动化的框架。通过几天的学习,大概熟悉了他们的这套框架了。
新的Android SDK提供2个工具用以UI的自动化:uiautomatorviewer&- 一个GUI工具,用来扫描识别UI上面的控件uiautomator&- JAVA类库,包含一些自定义的UI功能测试,用以自动化和跑test case的引擎。
这两个工具只在Android SDK Tools, Revision 21 or higher和Android SDK Platform, API 16 or higher才有。
当你安装完SDK以后,就可以用AVD创建虚拟机器或者使用USB连接实际的device来做自动化了。注意:如果想用真正的device来做自动化,机器的android版本必须是4.1以上,而且要在开发模式下把USB Debugging打开。当AVD创建好,或者设备通过USB连接到电脑后,可以以下命令检查设备的id(这个在以后编写程序的时候会用到,特别是当你同时连接多台设备的时候)&android-sdk&\platform-tools&adb devices
今天,先把搭建UI Testing测试开发环境的步骤写下来,有需要的也可供参考。因为我之前没有任何编程基础,所以内容可能有误。如发现错误,也希望各位能提出,谢谢。
1. 安装JDK,这个直接google搜索一下,就可以了。我的当前版本是6.02. 设置java_home环境变量
3. 下载安装Android SDK
4. 通过SDK Manager下载最新SDK(版本&21),platform-tools(版本&16)5. 下载安装Android 4.2 (API17)下的SDK Platform。如果需要使用AVD的(Android虚拟机),可以把整个API 下下来。(注意:只有Android 4.1.2(API 16)以上才支持uiautomator)6. 设置ANDROID_HOME环境变量7. 下载ant并设置ant的环境变量
ANT环境变量设置
Windows下ANT用到的环境变量主要有2个,ANT_HOME 、PATH。
设置ANT_HOME指向ant的安装目录。
设置方法:ANT_HOME = D:/apache_ant_1.7.0
将%ANT_HOME%/ %ANT_HOME%/lib添加到环境变量的path中。
设置方法:PATH = %ANT_HOME%/ %ANT_HOME%/lib&
8. 安装Eclipse - 创建一个新的Java Project9. 点击Java Project,Menu - Project & Properties10. Java Build Path - Libraries11. Add External JARs... - 把android-sdk\platform\android-xx里面的android.jar和uiautomator.jar添加进来12. Add Library... - 添加JUnit - JUnit3类库13. 在src里添加目录src/com/uia/example/my14. 在my下添加一个JUnit Test Case,名为LaunchSettings15. 把/tools/testing/testing_ui.html下的sample复制黏贴至testcase,保存16. 运行cmd17. 运行命令:  -&&android-sdk&/tools&&android create uitest-project -n &name& -t 1 -p &path&
(&name&就是LaunchSettings, &path&就是项目所在目录)18. 切换到项目所在目录(build.xml文件所在目录),运行  -&ant build  完成后会在/bin下生成LaunchSettings.jar19. 使用adb push命令,把test case(LaunchSettings.jar)上传到被测试设备上  -&&android-sdk&\platform-tools&adb push &path_to_output_jar&&/data/local/tmp/ & & & & (&path_to_output_jar&:jar的文件目录)20. 最后,运行命令,那个sample的test case就会在设备上跑起来了。  -&&android-sdk&\platform-tools&adb shell uiautomator runtest LaunchSettings.jar -c com.uia.example.my.LaunchSettings
想了解更多Android UI自动化的内容,可以上官网查看()
阅读(...) 评论()今天看啥 热点:
android app自动化测试之UIAutomator,androiduiautomator一、UIAutomator
&&&&&&&& Android自动化测试工具有很多,但是要免费、易上手,本人觉得就直接使用Eclipse自带的UIAutomator就不错。测试人员无需跟开发要代码信息,只要手机上有安装之后的APP自己就能做出自动测试用例,况且一通百通,就算是不满足于UI测试的,找个简单易上手的先明白原理,再深入了解其它复杂工具也会轻松很多。何乐而不为呢?
UIAutomator是Eclipse自带的用于UI自动化测试工具,可仿真APP上的单击、滑动、输入文本等操作。
&&&&&&&& 在使用之前,需要安装好java有关的JDK,SDK,然后配置java环境变量。关于安装JDK,SDK,配置JAVA环境变量网上有数不清的教程,这里就不废话了。直接进入主题。
&&&&&&&& 还是简单介绍一下自动化测试代码中使用到的类关系:现在还不清楚也没有关系,先让程序跑起来,然后在使用API的过程中自然就理解了。
1、创建java工程
&&&&&&&& 打开Eclipse,操作步骤: 点击&File&&New&&java Project&,然后打开如下图的界面:
其它的先不用管,既然要求必须输入Project name,那就输入。请用英文命名,很多时候中文会带来许多意想不到的问题。
输入Project name之后,点击&Next&进入下一步,看到的界面如下:
Source下的东西无需关注,点击&Libraries&,既然是调用java自带的UIAutomator,就要先引入UIAutomator使用到的包。导入uiautomator相关包:点击&Add External JARs&
&&&&&&&& 先要找到自己的android.jar 和 Uiautomator.jar 包的位置,一般在安装文件下的adt-bundle-windows-x86-\sdk\platforms\android-18\ 下,具体要找到自己电脑上的jar位置哦,
选中两个jar文件,&打开&导入。
此外还需要再加入本地库,点击&Add Library&,选择Junit,后点击&next&,使用默认的JUit3。点击&Finish&。
回到New Java Project,点击&Finish&即可创建工程成功。
2、创建class文件
&&&&&&&& 刚刚创建的工程,Src下还没有任何东西,我们需要创建一个Class文件,用来写自动化程序代码。
创建class文件:项目名称右键&&NEW&&class,写class内容如下
&&&&&&&& 2.1 import UIautomator两个包
&&&&&&&& 2.2 class 名称必须和XXX.java名称相同
&&&&&&&& 2.3每一个public开头,且以test命名开始的函数,系统就视为一个case,运行时方法的调用顺序并不是代码中的位置顺序,而是根据方法名的ASCII码大小顺序调用的。
&&&&&&&& 2.4每一个class都必须继承自UiAutoMatorTestCase
3、生成xml 文件
找到target版本:&android list targets
创建build.xml到测试工程中去,用于生成.jar文件:&Android create UItest-project &n testprojectname &t 1 &p testprojectpath
4.build jar 文件
&&&&&&&& 4.1 Update Ant to 1.9
&&&&&&&& 4.2 配置ant使用的javac版本:
&&&&&&&&&&&&&&&&&& 右键build.xml&》RUN AS &》 External Tools Configurations。
&&&&&&& 在main Tab 下输入Argumens: -piler=javac1.7&&》
&&&&&&&&&&&&&&&&&& Apply。
&&&&&&&&&&&&&&&&&& 4.3配置sdk中的build.xml 文件E:\Android\android\adt-bundle-windows-x86-\sdk\tools\ant\build.xml: 找到javac,添加includeantruntime="false"
&javac encoding="${java.encoding}"
&&&&&&&&&&&&&&&&&&& source="${java.source}" target="${java.target}"
&&&&&&&&&&&&&&&&&&& debug="true" extdirs="" includeantruntime="false"
&&&&&&&&&&&&&&&&&&& destdir="${out.classes.absolute.dir}"
&&&&&&&&&&&&&&&&&&& bootclasspathref="project.target.class.path"
&&&&&&&&&&&&&&&&&&& verbose="${verbose}"
&&&&&&&&&&&&&&&&&&& classpathref="project.javac.classpath"
&&&&&&&&&&&&&&&&&&& fork="${need.javac.fork}" includeantruntime="false"&
&&&&&&&&&&&&&&& &src path="${source.absolute.dir}" /&
&&&&&&&&&&&&&&& &src path="${gen.absolute.dir}" /&
&&&&&&&&&&&&&&& &compilerarg line="${pilerargs}" /&
&&&&&&&&&&& &/javac&
5. push jar文件到手机
Cmd环境下需要先找到adb.exe所在位置目录,完整的命令语句:
adb push &path_to_output_jar& &/data/local/tmp
&&path_to_output_jar&&即要放到手机里的jar文件名及路径
相反的如果是从手机复制文件到电脑:
6. 运行测试
Cmd环境下需要先找到adb.exe所在位置目录,完整的命令语句:
adb shell uiautomator runtest& XXX.jar &-c &XXXClassname
备注:XXX.jar需要运行的jar文件名,
&&&&&& Classname: 需要运行jar中的哪个类的名字
7.测试结果
运行结果如下:
Current: 当前运行的测试编号,与方法名称相关
Class:当前运行的函数所在的类
Numtests:测试的总数,每一个public testXX就是一个测试数
Test: 当前测试的函数名称
INSTRUMENTAION_STATUS_CODE:测试状态码,1表示正在执行,0表示执行成功,-1编辑运行错误
二、使用UIAUTOMATORVIEWER获取APP控件
1.手机打开app
使用UIAutomator获取手机app控件时,先在手机上运行起对应app
2 .电脑连接手机
&&&&&&&& 确保电脑与手机已连通。
&&&&&&&& 先在cmd界面到达java的adb.exe所在位置,
&&&&&&&& 运行命令& &adb shell &获取当前连接电脑的设备,如下图,如果adb shell 运行正常,会弹出&shell@hwH30-C00:/$&
&&&&&& 有多个设备连接开发机器时(模拟器或真机),通过设置ANDROID_SERIAL环境变量指定需要截图的设备。比如下图的:shell@hwH30-C00:/$ set ANDROID_SERIAL= hwH30-C00,设置连接成功后,返回:&set ANDROID_SERIAL=hwH30-C00&
&&&&&& adb devices命令查看连接中的设备编号
如果当前只连接了一个设备,则不用再在Cmd中执行连接命令
3.运行uiautomatorviewer.bat
找到uiautomatorviewer.bat安装目录,本机中的位置如下:
E:\Android\android\adt-bundle-windows-x86-\sdk\tools\uiautomatorviewer.bat
双击运行uiautomatorviewer.bat,打开界面如下图:
&&&&&&&& 上图中左半部分显示当前手机的呈现界面,若要获取其它界面的控件,需要在手机上后,点击上图左上角顶部的刷新,重新获取新界面。
&&&&&&&& 上图右半部分显示当前界面的所有ui元素层即控件信息。右上半部分显示层级,右下部分显示指定层级上具体的控件属性,比如当前属性&class&:当前控件的所在class
&Package&:显示当前控制所在包
&Resource-id&:这个属性有最好了,有些Android开发人员没有为每个控件单独命名,在抓取的时候就非常不方便。如果有Resource-id,在抓取控件时,直接用Resource-id就能获取到正确的控件,并且操作正确,如果没有Resource-id,就只能通过查找同类控件后再按顺序获取了。比如先找到所有的textbox控件,再从所有的textbox控件中按序取几个,才能抓取到对应控件。
还有一些控件属性显示是否可见,是否checked,有实际应用需要时,可以获取
这里附上一个简单的测试java源代码,供参考代码格式
import com.android.uiautomator.core.UiD
import com.android.uiautomator.core.UiO
import com.android.uiautomator.core.UiObjectNotFoundE
import com.android.uiautomator.core.UiS
import com.android.uiautomator.core.UiS
import com.android.uiautomator.testrunner.UiAutomatorTestC
public class MyTestCase extends UiAutomatorTestCase {
&&& public void testDemo() throws UiObjectNotFoundException {
&&&&&&&&&& //点击home回到桌面
&&&&&& UiDevice device = getUiDevice();
&&&&&& device.pressHome();
&&&&&&&&&& // 点击并等待打开app
&&&&&& UiObject czmApp = new UiObject(new UiSelector().className(android.widget.TextView.class.getName()));&&&&&
&&& &&& czmApp.clickAndWaitForNewWindow();&
&&& &&& sleep(1000);
&&& &&& //登录;instan从0开始,
&&& &&& UiObject username= new UiObject(new UiSelector().className("android.widget.EditText").resourceId("com.wlyc.warehousechampions:id/login_username_edit"));&&
&&& &&& username.clearTextField();
&&& &&& username.setText("");
&&& &&& UiObject pwd= new UiObject(new UiSelector().className("android.widget.EditText").enabled(true).resourceId("com.wlyc.warehousechampions:id/login_password_edit"));
&&& &&& pwd.clearTextField();
&&& &&& pwd.setText("00OA8C");
&&& &&& device.pressBack();
&&&&&& sleep(500);
&&& &&& UiObject enter= new UiObject(new UiSelector().className("android.widget.Button").resourceId("com.wlyc.warehousechampions:id/login_btn"));
&&& &&& enter.click();
&&& &&& sleep(5000);
&&& &&&&&&& &&&&
&&& &&& //跳转到&我的&
&&& &&& UiObject My= new UiObject(new UiSelector().className("android.widget.RelativeLayout").resourceId("com.wlyc.warehousechampions:id/personcenter"));&&
&&& &&& My.clickAndWaitForNewWindow();
&&& &&& sleep(500);
&&& &&& //检查认证状态
&&& &&& UiObject result= new UiObject(new UiSelector().className("android.widget.TextView").resourceId("com.wlyc.warehousechampions:id/personcenter_apply_status"));&&
&&& &&& int n=result.getText().length();
&&& &&& //认证审核中
&&& &&& n=Dur_verify(n);&
&&& &&& //认证失败 或者认证成功
&&& &&& if(n==4)
&&& &&& UiObject failed= new UiObject(new UiSelector().className("android.widget.RelativeLayout").resourceId("com.wlyc.warehousechampions:id/apply_certificate_layout"));&&
&&& &&& failed.click();
&&& &&& UiObject isedit= new UiObject(new UiSelector().className("android.widget.RelativeLayout").resourceId("com.wlyc.warehousechampions:id/titlebar_right_layout"));&&
&&&&&& &&& //认证失败
&&& &&& if(isedit.exists())
&&&&&& &&& isedit.click();
&&&&&& &&& write();
&&&&&& &&& sleep(500); &
&&&&&& &&& }
&&& &&& else //认证成功
&&& &&& {&&
&&& &&& &&& UiObject backtoMy= new UiObject(new UiSelector().className("android.widget.LinearLayout").resourceId("com.wlyc.warehousechampions:id/titlebar_left_layout"));
&&& &&& &&& backtoMy.click();
&&& &&& &&& Release();
&&&&&& &&& }
&&& &&& n=result.getText().length();
&&& &&& n=Dur_verify(n);
&&& &&& Release();
&&&&&&&&&&&&& //录入并提交企业认证
&&& public void write()throws UiObjectNotFoundException
&&& &&& &&& //跳转到企业认证
&&& &&& UiObject Company= new UiObject(new UiSelector().className("android.widget.RadioButton").resourceId("com.wlyc.warehousechampions:id/company_certificate"));&&
&&&&&& &&& Company.click();
&&&&&& &&& //录入企业认证信息
&&&&&& &&& UiObject CompanyName=new UiObject(new UiSelector().className("android.widget.EditText").resourceId("com.wlyc.warehousechampions:id/cettificate_companyname_edit"));
&&&&&& &&& CompanyName.setText("test");
&&&&&& &&& sleep(500);
&&&&&& &&& //拍照
&&&&&& &&& UiObject photo= new UiObject(new UiSelector().className("android.widget.ImageView").resourceId("com.wlyc.warehousechampions:id/uploadimage_image"));&&
&&&&&& &&& photo.click();
&&&&&& &&& sleep(500);
&&&&&& &&& UiObject takephoto= new UiObject(new UiSelector().className("android.widget.TextView").instance(1));&&
&&&&&& &&& takephoto.click();
&&&&&& &&& sleep(500);
&&&&&& &&& UiObject phototake= new UiObject(new UiSelector().className("android.widget.ImageView").resourceId("com.android.gallery3d:id/shutter_button"));&&
&&&&&& &&& phototake.click();
&&&&&& &&& sleep(500);
&&&&&& &&& UiObject photook= new UiObject(new UiSelector().className("android.widget.ImageView").resourceId("com.android.gallery3d:id/btn_done"));&&
&&&&&& &&& photook.click();
&&&&&& &&& sleep(500);
&&&&&& &&& //提交认证
&&&&&& &&& UiObject commit= new UiObject(new UiSelector().className("android.widget.Button").resourceId("com.wlyc.warehousechampions:id/commit_btn"));&&
&&&&&& &&& commit.click();
&&&&&& &&& sleep(500);&&&
&&&&&&&&&&&&& //发布仓库
&&& &&& public void Release() throws UiObjectNotFoundException
&&& &&& UiObject wh_release= new UiObject(new UiSelector().className("android.widget.RelativeLayout").resourceId("com.wlyc.warehousechampions:id/warehouse_distribute"));&&
&&& &&& wh_release.click();
&&& & && UiObject wh_name= new UiObject(new UiSelector().className("android.widget.EditText").resourceId("com.wlyc.warehousechampions:id/warehouse_name_edit"));&&
&&& &&& wh_name.setText("nametest");
&&& &&& UiObject wh_ctg= new UiObject(new UiSelector().className("android.widget.RelativeLayout").resourceId("com.wlyc.warehousechampions:id/spinnerview_layout"));&&
&&& &&& wh_ctg.clickAndWaitForNewWindow();
&&& &&& UiObject wh_ctg1= new UiObject(new UiSelector().className("android.widget.TextView").resourceId("com.wlyc.warehousechampions:id/spinnerview_listitem_text"));
&&& & & &&&&wh_ctg1.click();
&&& & &&&&& UiObject wh_mod= new UiObject(new UiSelector().className("android.widget.RelativeLayout").resourceId("com.wlyc.warehousechampions:id/spinnerview_layout").instance(1));&&
&&& &&& wh_mod.click();
&&& &&& sleep(500);
&&& &&& UiObject wh_mod1= new UiObject(new UiSelector().className("android.widget.TextView").enabled(true).instance(0));&&
&&& &&& wh_mod1.click();
&&& &&& sleep(500);
&&& & & &&&&UiObject wh_area= new UiObject(new UiSelector().className("android.widget.EditText").resourceId("com.wlyc.warehousechampions:id/warehouse_area_edit"));&&
&&& &&& wh_area.setText("5000");
&&& &&& UiObject wh_area_low= new UiObject(new UiSelector().className("android.widget.EditText").resourceId("com.wlyc.warehousechampions:id/warehouse_rentarea_edit"));&&
&&& &&& wh_area_low.setText("500");
&&& &&& UiObject wh_area_cpb= new UiObject(new UiSelector().className("android.widget.EditText").resourceId("com.wlyc.warehousechampions:id/warehouse_availrentarea_edit"));&&
&&& &&& wh_area_cpb.setText("1000");
&&& &&& UiObject wh_pric= new UiObject(new UiSelector().className("android.widget.EditText").resourceId("com.wlyc.warehousechampions:id/warehouse_price_edit"));&&
&&& &&& wh_pric.setText("26");
&&& &&& UiObject wh_etpris= new UiObject(new UiSelector().className("android.widget.EditText").resourceId("com.wlyc.warehousechampions:id/warehouse_company_edit"));&&
&&& &&& wh_etpris.setText("companyname");
&&& &&& UiObject wh_floor= new UiObject(new UiSelector().className("android.widget.CheckBox").enabled(true).instance(0));&&
&&& &&& wh_floor.click();
&&& &&& sleep(500);
&&& &&& &&&&&&& //向下滑动屏幕
&&& &&& UiScrollable& wh_scroll=new UiScrollable(new UiSelector().className("com.wlyc.warehousechampions:id/pulltorefresh_listview"));
&&& & & &&&&wh_scroll.setAsVerticalList();
&&&&&&&&&& ;
&&& &&& UiObject wh_addre= new UiObject(new UiSelector().className("android.widget.TextView").resourceId("com.wlyc.warehousechampions:id/warehousedetail_hightemperature_unit"));
&&& & & &&&&wh_addre.click();
&&& & & &&&&
&&& &&& &&& //认证审核中等待
&&& &&& public int Dur_verify(int n) throws UiObjectNotFoundException
&&& &&& &while (n!=4) {
&&& &&& &&& UiObject My= new UiObject(new UiSelector().className("android.widget.RelativeLayout").resourceId("com.wlyc.warehousechampions:id/personcenter"));
&&& &&& &&& My.clickAndWaitForNewWindow();
&&& &&&&&& &&& sleep(5000);
&&& &&&&&& &&& UiObject result= new UiObject(new UiSelector().className("android.widget.TextView").resourceId("com.wlyc.warehousechampions:id/personcenter_apply_status"));
&&& &&&&&& &&& n=result.getText().length();
&&& &&&&&& }
&&& &&& &return
三、Uiautomator Api分析
&&&&&&&& UiAutomator主要涉及以下几个类,大多数位于源码包的com.android.uiautomator.core下,其中粗体字部分为主要会接触到的类,熟知这5个类的作用,就可以大体顺畅的写出UiAutomator的测试用例。
UiAutomatorTestCase
UiSelector
UiScrollable
UiCollection
UiTestAutomationBridge, UiAutomatorBridge
InteractionController, QueryController
&&&&&&&&&&&&&&&&&& 1、UiAutomatorTestCase
TestCase (Junit) -& UiAutomatorTestCase& -& App Test
&&&&&&&& 每个测试用例(类)都需要继承UiAutomatorTestCase,以实现测试环境的setup,teardown(拆卸)等同能。而UiAutomatorTestCase则是通过继承Junit3中的TestCase类,并在其中的setUp() 、tearDown() 、getParams() 函数中。其中主要是用Bundle实现Android Activity之间的通讯。在UiAutomatorTestCase,还加入了getUiDevice()等关于UiDevice的 函数,以实现在测试的任意地方均可调用UiDevice()。
&&&& 2、UiDevice
&&&&&&&& 此类主要包含了获取设备状态信息,和模拟用户至于设备的操作两类api。
可以通过getDisplaySizeDp(), getDisplayWidth() , getDisplayHeight() ,getProductName() ,getCurrentActivityName(), getCurrentPackageName() 等获取设备相关信息。
pressMenu(), pressBack(), pressHome(), pressSearch() ,pressDPadCenter(), pressDPadRight(), pressDPadLeft(), pressDPadUp(), pressDPadDown() ,pressDelete(), pressEnter(), pressKeyCode(), pressRecentApps(),click(),swipe(),getDisplayRotation() setOrientationLeft()& wakeUp(), sleep() ,dumpWindowHierarchy(), waitForWindowUpdate()等API可以灵活的操纵设备。
而takeScreenshot() 允许随时对设备截屏。
&&&& 3、UiSelector
&&&&&&&& 主要是通过一定查询方式,定位到所要操作的UI元素。
&&&&&&&& 一般UI元素均可通过以下API定位:text(), textMatches(String regex), textStartsWith(), textContains() ,className() ,classNameMatches(String regex), className(Class type) ,Description(), descriptionMatches(String regex),descriptionStartsWith(),descriptionContains() ,packageName(), packageNameMatches(String regex)。
值得注意的是index()和 instance() 两个函数,其中index()是当前页面的ID编号,instance()则表示在一定的搜索结果下,获取的子元素集的第几个元素。如:
new UiSelector().className("android.widget.ImageView").enabled(true).instance(2);
&&&&&&&& 另有enabled(), focused(), focusable(), scrollable(), selected(), checked(), clickable() ,longClickable() ,childSelector()等检索条件,顾名思义。
&&&& 4、UiObject
&&&&&&&& UiObject可代表页面的任意元素,它的各种属性定位通常通过UiSelector来完成。
&&&&&&&& 比较常用的Api如clickAndWaitForNewWindow(),表示点击该元素,并且等待新窗口的展示完毕。这一过程是Android UI Testing框架支持的,不需要额外的控制等待时间。
&&&&&&&& UiObject允许点击该元素的具体一个部分,Api如clickTopLeft(), longClickBottomRight(),&
&&&&&&&& 通过getText(), getContentDescription(), getVisibleBounds(),& 等api可获取UiObject的相关属性,getPackageName() 可用来明确是否打开了目标测试的App.
&&&&&&&& setText(), clearTextField() 可以 用来设置以及清空所关联的输入框。
&&&&&&&& waitForExists() 可以用来操纵相关等待或验证。
&&&& 5、UiCollection
&&&&&&&& UiCollection一般与UiSelector连用,如它的构造函数也要求提供Uiselector: UiCollection(UiSelector selector)。
它的api较少,主要用以从Uiselector筛选出的元素集中挑出所要的元素:getChildByDescription(), getChildByInstance(), getChildByText() ,以及统计元素集的个数getChildCount()
&&&& 6、UiScrollable
UiObject -& UiCollection -&UiScrollable
&&&&&&&& UiScrollable 用来表示可以滑动的界面元素,其继承关系如上图所示。
其Api中,setAsVerticalList(), setAsHorizontalList() 用以设置Ui元素列表是基于横向滚动还是纵向滚动。其后可以用getMaxSearchSwipes() ,flingForward(), flingBackward() ,scrollForward(),scrollBackward() ,scrollToEnd(), scrollToBeginning() 等函数控制滑动,以及getChildByDescription(), getChildByInstance(), getChildByText() ,scrollIntoView(), scrollTextIntoView(),& 来选择是否已经转换到具有目标元素的页面。如:
UiScrollable appViews = new UiScrollable(new UiSelector().scrollable(true));
appViews.setAsHorizontalList();
UiObject helperA
helperApp = appViews.getChildByText(new UiSelector()
.className(android.widget.TextView.class.getName()), " 91助手 ");& 则若当前页面没有91助手APP, 测试会自动滑动页面,直到91助手App出现。
&&&&&&&& 下面介绍下UI Testing Framework构成的重要类:
7、UiTestAutomationBridge
&&&&&&&& 这是整个Testing Framework的基础,此类负责连接系统了,记录最新的可链接事件(AccessibilityEvent) , 窗口内容查询Api等。可以被Android App调用,或者Java程序从shell调用。
这里需要注意两个概念:
&&&&&&&& 7.1、AccessibilityEvent:所有的Ui元素可以被操纵,因为这些Event都是AccessibilityEvent。对于怎样令页面元素可以被操纵,使得相关的事件都是AccessibilityEvent,请参见Uiautomator 词条-"确认程序可以被测试" 部分。
&&&&&&&& 7.2、AccessibilityNodeInfo:视窗中的组件树节点,也就是uiautomtorViewer中展示的各个节点。
&&&&&&&& Api中connect(), disconnect() 负责建立与设备的实际连接。
executeCommandAndWaitForAccessibilityEvent() performAccessibilityAction() findAccessibilityNodeInfosByText(), findAccessibilityNodeInfoByViewIdInActiveWindow() 都是其中重要的Api。
&&&& 8、UiAutomatorBridge
&&&&&&&& UiAutomatorBridge是UiTestAutomationBridge的子类,区别主要是在构造函数中加上了InteractionController 和QueryController 两大对象的调用。以及一些常量定义等。除了上述差异,UiAutomatorBridge还定义了executeCommandAndWaitForAccessibilityEvent() 、onAccessibilityEvent() 、waitForIdle() 、addAccessibilityEventListener() 等函数。
&&&& 9、InteractionController
&&&&&&&& 介绍InteractionController,需要先提InteractionProvider,它负责注入用户事件(如点击、输入等) ,并且反应事件的对应坐标。
&&&&&&&& InteractionController则定义了几乎所有至于手机的基础操作,如runAndWaitForEvents(), clickAndWaitForEvents() ,click(), longTap(), scrollSwipe(),Swipe() ,clickAndWaitForNewWindow() ,touchUp(), touchDown(), TouchMove() ,isNaturalRotation(), setRotationRight(), setRotationLeft() ,freezeRotation() ,wakeDevice(), sleepDevice() 等。
&&&& 10、QueryController
&&&&&&&& QueryController负责把UiSelector 的查找信息转化为AccessibilityNodeInfo。
具体Api如下:findNodePatternRecursive(), translatePatternSelector(), translateReqularSelector(), translateCompoundSelector(), getRootNode() ,findAccessibilityNodeInfo()。
&&&& 11、UiWatcher
&&&&&&&& UiWatcher只在UiSelector无法找到匹配的结果时被调用,意在重试、等待页面更新 (如弹出对话框)等。其中只有一个主要函数:checkForCondition() 。
它的相关函数均在UiDevice中,如:UiDevice.registerWatcher() ,UiDevice. resetWatcherTriggers() ,UiDevice.runWatchers() ,UiDevice.removeWatcher()
暂无相关文章
相关搜索:
相关阅读:
相关频道:
Android教程最近更新

我要回帖

更多关于 uiautomator二次开发 的文章

 

随机推荐