手把手教你uiautomator_android自动化测试第一个示例


 

 

 

android的自动化测试方案,弄了好久了。

 

 

Google在sdk4.0以后提供了一个自动化解决方案uiautomator:

优点:可以跨应用了;这可是亲生的;

缺点:必须sdk4.0以上版本;要想实现的好,最好有开发配合;java项目编译为jar后需要push到手机才能运行,也就是说必须打印日志暴力调试。

 

后来听到群友Teddy说到appium和calabash-android,翻了一下appium的文章,发现:

 

01.jpg

 


Appium基于Android InstrumentationFramework和UIAutomator,也就是说这个工具是可以跨应用的。说远了,好吧,为了帮大家更容易理解appium的使用,我这里就讲一下uiautomator的使用方法。

 

首先提供uiautomator的官方网页:

http://developer.android.com/tools/help/uiautomator/index.html

 

你应该有android-sdk吧,升级到4.0以上,进入目录android-sdk\tools,你会看到两个文件:

traceview.bat 和 uiautomatorviewer.bat,这俩文件让你想起了monkeyrunner了吧,是的,traceview.bat就对应于hierarchyviewer.bat,用来查看程序的ui界面的,通常也是使用管理员权限启动的。


除了androidsdk,还需要弄一个ant,用来编译程序用,配置一下环境变量:

ANT_HOME=C:\PROGRAM\apache-ant-1.8.2 


好了,现在用eclipse创建一个java project,是的,你没看错,是java project不是android project,添加引用:

02.jpg

 

 

在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  extendsUiAutomatorTestCase {  

      public StringsLog;

      public Filefout =null;

      public FileOutputStreamoutStream=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);  //此处的trueappend

                 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(new UiSelector().description("Apps"));

              allAppsButton.clickAndWaitForNewWindow();

             

              UiObject appsTab = new UiObject(new UiSelector().text("Apps"));

              appsTab.click();

 

              UiScrollable appViews = new UiScrollable(new UiSelector().scrollable(true));

             

              UiObject settingsApp = appViews.getChildByText(new UiSelector().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(new UiSelector().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.

 

那就可以统一只使用这一个引用界面元素的方法就行了,就不用去想方设法利用其它的属性来引用了。

 

如果你没有源码,那就只能根据那个traceview.bat工具来找不同的引用方法了,如果有源码,可以参考下文:

http://blog.csdn.net/testingba/article/details/19398445

 

 

说回来了,appium还有instrument部分,可以参考下文:

http://blog.csdn.net/testingba/article/details/8565533

 

或者参考ranorex的instrument代码,就可以理解instrument是怎么回事了,说穿了加上个instrument的jar包引用,然后设hook。

http://blog.csdn.net/testingba/article/details/19538749

 

有了这几部分知识做底,appium如何实现就会比较容易理解了。

 

如有错漏,不吝赐教。

 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Android平台上使用FFmpeg需要进行交叉编译,生成适用于Android的FFmpeg库,并将其打包到apk中。以下是手把手你搭建ffmpeg命令行运行环境的步骤: 1.下载NDK 首先需要下载NDK(Native Development Kit),NDK是一个工具包,用于开发C/C++应用程序的原生库。Android Studio自带NDK,也可以从官网下载。 2.下载FFmpeg源代码 从FFmpeg的官网下载源代码,然后解压到本地。 3.配置交叉编译环境 在FFmpeg源代码根目录下创建一个build_android.sh文件,输入以下内容: ```bash #!/bin/bash NDK=$HOME/Android/Sdk/ndk-bundle # NDK路径 SYSROOT=$NDK/platforms/android-21/arch-arm/ # Android SDK路径 TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 # 工具链路径 function build_one { ./configure \ --prefix=$PREFIX \ --enable-shared \ --disable-static \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-debug \ --disable-network \ --disable-avdevice \ --disable-postproc \ --disable-symver \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=android \ --arch=arm \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG make make install } CPU=arm PREFIX=$(pwd)/android/$CPU ADDI_CFLAGS="-marm" ADDI_LDFLAGS="" build_one ``` 其中,NDK是NDK的路径,SYSROOT是Android SDK的路径,TOOLCHAIN是工具链的路径。 4.执行交叉编译命令 在终端中输入以下命令: ```bash chmod +x build_android.sh ./build_android.sh ``` 等待编译完成。编译完成后,在FFmpeg源代码根目录下会生成一个android目录,其中包含了交叉编译生成的FFmpeg库。 5.创建Android Studio项目 打开Android Studio,创建一个新项目。在app/build.gradle文件中添加以下代码: ```groovy android { compileSdkVersion 28 defaultConfig { applicationId "com.example.ffmpegdemo" minSdkVersion 21 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } externalNativeBuild { cmake { cppFlags "" abiFilters "armeabi-v7a" arguments "-DANDROID_ARM_NEON=TRUE" } } sourceSets.main { jniLibs.srcDirs = ['src/main/jniLibs'] } ndk { abiFilters "armeabi-v7a" } } ``` 其中,externalNativeBuild和ndk是用于指定使用交叉编译生成的库的配置。 6.将FFmpeg库打包到apk中 将交叉编译生成的库复制到项目的app/src/main/jniLibs/armeabi-v7a/目录下。在app/build.gradle文件中添加以下代码: ```groovy android { sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } } ``` 然后在终端中输入以下命令: ```bash ./gradlew assembleDebug ``` 等待打包完成。打包完成后,在项目的build/outputs/apk/debug/目录下会生成一个apk文件,其中包含了FFmpeg库。 至此,就完成了搭建ffmpeg命令行运行环境的所有步骤。可以通过在MainActivity中执行FFmpeg命令来测试FFmpeg是否正常工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Testingba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值