怎样在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的主要内容,如果未能解决你的问题,请参考以下文章