怎样在Android Studio中使用Uiautomator

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样在Android Studio中使用Uiautomator相关的知识,希望对你有一定的参考价值。

Google在sdk4.0以后提供了一个自动化解决方案uiautomator:
优点:可以跨应用了;这可是亲生的;
缺点:必须sdk4.0以上版本;要想实现的好,最好有开发配合;java项目编译为jar后需要push到手机才能运行,也就是说必须打印日志暴力调试。
Appium基于android InstrumentationFramework和UIAutomator,也就是说这个工具是可以跨应用的。说远了,好吧,为了帮大家更容易理解appium的使用,我这里就讲一下uiautomator的使用方法。

你应该有android-sdk吧,升级到4.0以上,进入目录android-sdk\tools,你会看到两个文件:
traceview.bat 和 uiautomatorviewer.bat,这俩文件让你想起了monkeyrunner了吧,是的,traceview.bat就对应于hierarchyviewer.bat,用来查看程序的ui界面的,通常也是使用管理员权限启动的。
好了,现在用eclipse创建一个java project,是的,你没看错,是java project不是android project,添加引用:

在project.properties中内容为:

# Project target.
target= android-16

这里的android-16需要和之前的android.jar和uiautomator.jar位置相一致。
然后呢?写代码吧,建立一个类,得,发个给大家参考:

package com.uia.example.my;
import org.apache.http.util.EncodingUtils ;
import android.graphics.Bitmap ;
import android.graphics.BitmapFactory ;
import android.graphics.Rect ;
import android.os.Environment;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core. UiSelector ;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class TAppWorkAssistV1 extends UiAutomatorTestCase
public String sLog ;
public File fout = null ;
public FileOutputStream outStream = null ;
public void write2file(String filename,String sData)

String sLog= "" ;
// 初始化日志文件
if (Environment. getExternalStorageState ().equals(Environment.MEDIA_MOUNTED ))
sLog = Environment. getExternalStorageDirectory().getAbsolutePath();

try
fout = new File(sLog,filename);
outStream = new FileOutputStream( fout , true ); // 此处的 true 是append
sData=sData + "\n" ;
outStream .write(sData.getBytes());
outStream .flush();
outStream .close();
fout = null ;

catch (Exception e)
e.printStackTrace();

else
System. out .println( " 该手机没有 SD 卡 " );


public void testDemo() throws UiObjectNotFoundException
//1. 启动 app
getUiDevice().pressHome();
UiObject allAppsButton = new UiObject( newUiSelector().description( "Apps" ));
allAppsButton.clickAndWaitForNewWindow();

UiObject appsTab = new UiObject( new UiSelector().text( "Apps" ));
appsTab.click();
UiScrollable appViews = new UiScrollable( newUiSelector().scrollable( true ));

UiObject settingsApp = appViews.getChildByText( newUiSelector().className(android.widget.TextView. class .getName()), "Efilm" );
settingsApp.clickAndWaitForNewWindow();

//2. 进入主界面
System. out .println( "into main view" );
System. out .println(getUiDevice().waitForWindowUpdate("com.eshore.efilm" , 60000));
System. out .println( "intoed main view" );
UiObject tv1 = new UiObject( new UiSelector().text( " 影院 " ));
tv1.click();

//3. 点击影院
UiObject oyy= new UiObject( new UiSelector().description("cinema_row" ));
System. out .println( "wait yingyuan come out" );
oyy.waitForExists(60000);
System. out .println( "yingyuan come out" );
oyy.clickAndWaitForNewWindow();
System. out .println( "click yingyuan" );

//4. 场次
UiObject occ= new UiObject( new UiSelector().description("LinearLayout10" ));
System. out .println( "wait changci come out" );
oyy.waitForExists(60000);
System. out .println( "changci come out" );
occ.clickAndWaitForNewWindow();
System. out .println( "click changci" );
//5. 座位
UiObject oseat= new UiObject( new UiSelector().description("cinema_shows_list_item" ).index(0).childSelector( newUiSelector().description( "LinearLayout10" )));
System. out .println( "wait seat come out" );
oseat.waitForExists(5000);
int h=getUiDevice().getDisplayHeight();
int w=getUiDevice().getDisplayWidth();
System. out .println( "(h/2,w/2)=" +h/2+ "," +w/2);
getUiDevice().click(h/2,w/2);
//System.out.println("seat count:"+String.valueOf(oseat.getChildCount()));
//System.out.println("seat getText:"+ oseat.getText());

// 截座位图
Process process;
try
process = Runtime. getRuntime ().exec( "screencap /mnt/sdcard/EfilmFailSnapShot01.png" );
try
process.waitFor();
catch (InterruptedException e) // TODO Auto-generated catch block
e.printStackTrace();

catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();

//takeScreenShots("EfilmSeatSnapShot");



这个例子是随便写的,可能不够严谨。大体就这么个情况吧。下一步就是编译执行了,先插上手机usb接口,然后打开cmd,执行:

找到SDKID,也就是android create中的-t参数:
cd C:\ PROGRAM\android-sdk\tools
android list

找到t参数的值以后:

cd C:\ PROGRAM\android-sdk\tools
android create uitest-project -n TAppWorkAssistV1 -t 25 -p C:\android自动化\Tv2.0\TestSetting
cd C:\android自动化\Tv2.0\TestSetting
ant build
cd C:\android自动化\Tv2.0\TestSetting\bin
adb push TAppWorkAssistV1.jar /data/local/tmp/
adb shell uiautomator runtest TAppWorkAssistV1.jar -c com.uia.example.my. TAppWorkAssistV1

看了看,好像没有什么特别值得解释的
-n TAppWorkAssistV1:类名
-p: 项目所在目录
Ant build 把这个类编译成一个jar包:TAppWorkAssistV1.jar
然后把jar包push到手机上,调用执行这个类就可以了
大致是这么个步骤,不过有一个非常重要的细节,就是如果你需要更省心,就最好把界面元素,无论动态的还是布局文件中的,都加上content-description属性,并保证唯一性,根据:
UiSelector:description(String desc)
Set the search criteria to match thecontent-description property for a widget.
那就可以统一只使用这一个引用界面元素的方法就行了,就不用去想方设法利用其它的属性来引用了。
参考技术A androidStudio是支持UIAutomator的 这点毋庸置疑,而且android已经为每个module都设置好了,即androidTest。

首先 我们要加入依赖包,在build.gradle中的dependencies中加入
// Testing-only dependenciesandroidTestCompile 'com.android.support.test:runner:0.3'// Set this dependency to use JUnit 4 rulesandroidTestCompile 'com.android.support.test:rules:0.3'// Set this dependency to build and run Espresso testsandroidTestCompile 'com.android.support.test.espresso:espresso- www.hbbz08.com core:2.2'// Set this dependency to build and run UI Automator testsandroidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
当然 这一步如果没想相应的Android Support Library是会报错的 ,需要到Android sdk manager中去下载,Extras包中的Android Support Library
然后更新gradle,如果你的minSdkVersion小于18会报错,可能是我下的support的版本缘故,如果有哪位知道,麻烦告诉下。
我这里暂时设置minSDKVersion为18
然后就可以开始写我们的测试用例了
在androidTest下创建我们的测试用例即可
@RunWith(AndroidJUnit4.class)@SdkSuppress(minSdkVersion = 18)public class UIautomatorTest


androidStudio中的测试用例采用了注解的方式
@Before
这个注解下的方法一般用于启动你的app
@Test
这个注解下的方法,就可以写自己的测试用例了,可以有多个
写好后,设置启动配置
在启动设置中的Android Tests中选择你要启动的测试用例
Test有 1.All in Module 2.All in Package 3.Class 4.Method等4个选项 我这里选择的Class
runner 选择AndroidJUnitRunner
apply ok后
启动测试用例即可

以上是关于怎样在Android Studio中使用Uiautomator的主要内容,如果未能解决你的问题,请参考以下文章

怎样在Android Studio中使用Uiautomator

android studio怎样运行打包后的apk

Android Studio怎样新建Activity

怎样在androidstudio中导入gson包

怎样在android studio中打jar包

android studio怎样导入第三方库 步骤