13.UiAutomator 辅助APK的使用

一、在测试中弹出提示框

UiAutomator无法直接实现,,但是可以通过让辅助APK接受UiAutomator发送的指令信息来实现,使用am命令

  • 实例:
1.新建辅助apk,用来接收Uiautomator用例中的广播信息(新建android appliction project,然后next直到finish为止,注意创建过程中选对API)
2.建好工程后将一些不用的代码删除,需要删除的代码如下:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
3.然后在生成的辅助apk的src下的包中新建一个类作为广播接收器,继承”BroadcastReceiver”,代码如下:
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.WindowManager;
//注意上面的import文件。应该有这些导入就够了。之前调试过程中在Builder builder=new Builder(arg0);总是会报错。后来解决掉才发现原来是导入文件的问题
public class AlertRecevier extends BroadcastReceiver{

    @Override
    public void onReceive(Context arg0, Intent arg1) {
            //接收键值对
            Bundle bundle=arg1.getExtras();
            String message=bundle.getString("alert");
            //创建消息弹窗
            Builder builder=new Builder(arg0);
            builder.setTitle("APP TEST");
            builder.setMessage(message);
            builder.setNegativeButton("OK",null);
            Dialog dialog=builder.create();

            dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            dialog.show();
    }
}
4.代码编辑完成后,需要点辅助apk的.xml清单文件添加一个权限,

1)在清单界面点”Permissions”–“add”–“uises-permission”–“ok”
2)name=”android.permission.SYSTEM_ALERT_WINDOW” MaxSDK=20然后点add

3)remove “uises-permission”

4)点击xml清单文件查看是否有这个权限””

5)在xml清单文件中注册广播接收器。也就是在结束标签后面加入下列代码

</activity>//结束标签
<receiver android:name="AlertRecevier">//name=广播接收器类名
    <intent-filter>
        <action android:name="jian.demo.action"/>//name=自定义
    </intent-filter>
</receiver>

6)右键点辅助APK工程–run as–android application,将apk安装到手机上
7)打开命令行,输入命令”adb shell am broadcast -a [自定义的name] -e [广播接收器中定义的字符串] [可以随便输几个值]”查看是否注册成功,按照上述代码,该命令的正确表现形式应该是”adb shell am broadcast -a jian.demo.action -e alert 1234”

5.在测试用例中写入以下代码:
//弹出指定弹窗
public void testDemo() throws IOException{
    alert("test alert!");
}

//写一个方法
public void alert(String message) throws IOException{
    //自定义弹窗内容
    String cmd=("am broadcast -a jian.demo.action -e alert"+message);
    //输入命令
    try{
        Runtime.getRuntime().exec(cmd);
    }catch(IOException e){
        e.printStackTrace();
    }
}

二、在测试中输入中文

UiObject.setText(String)这个API无法输入非ASCLL字符,比如中文、日文等,可以使用Unicode输入助手解决这个问题,它将输入的原始字符转换为Unicode文本,通过中间转化从而进行输入各种文字

1.使用步骤:

1)手机端安装jutf-7输入法
2)将该输入法设置为手机默认输入法(系统设置–语言和输入法–设置UTF7为默认输入法)

3)写用例过程中将UTF-7的辅助工具类加入进去

4)使用”UiObject.setText(“Utf7lmeHelper.e(“各种语言”))”来实现各种语言的输入。

2.UTF-7的辅助工具类下载配置

1)GitHub上搜索通过搜索uiautomator来找到sumio/uiautomator-unicode-input-helper这个输入工具并下载

2)点击eclipes左上角file–import–android/existing android code into workspase–next

3)在新弹出的窗口导入下载好文件的路径(是解压后的文件)手动勾选copy projects into workspace然后点击finish

4)导入完成后应该有一个name=Utf7Ime的project,右键点击工程–run as –android application,即可将输入法push到手机中

5)手机系统设置–语言和输入法–设置UTF7为默认输入法

6)在”\git\uiautomator-unicode-input-helper-master\UiAutomatorInputSample\src”路径下(代表你下载时候的存储位置)将两个文件夹(com/jp)copy到eclipes的用例工程的src下面,正常情况src下面会多出来三个包

3.测试代码
//输入中文
public void testDemo1() throws UiObjectNotFoundException{
    //获取新建联系人的联系人姓名输入框
    UiObject edit=new UiObject(new UiSelector().className(EditText.class.getName()));
    edit.setText(Utf7ImeHelper.e("测试输入"));
}

三、获取应用信息

  • 实例:
1.新建辅助apk(移步本文一、1.2.步骤)
2.在辅助apk中创建广播类,代码如下:
//Import文件
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.List;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
//广播接收器代码
public class AppInfo extends BroadcastReceiver{
    public void onReceive(Context arg0, Intent arg1) {
        //使用bundle把我们要传的信息提取出来
        Bundle bundle=arg1.getExtras();
        //定义参数包名和文件名(pn,fn)
        String packageName=bundle.getString("pn");
        String fileName=bundle.getString("fn");
        //使用包管理来获取信息
        PackageManager pm=arg0.getPackageManager();
        try {
            PackageInfo manifext=pm.getPackageInfo(packageName, 0);
            //获取版本号
            String versionName=manifext.versionName;
            //获取应用的名子
            String apkName=pm.getApplicationLabel(pm.getApplicationInfo(packageName,0)).toString();
            //将信息写入文件
            writeFile("/mnt/sdcard", fileName, "versionName:"+versionName);
            writeFile("/mnt/sdcard", fileName, "apkName:"+apkName);
            //获取主activity查询条件
            Intent mainIntent=new Intent(Intent.ACTION_MAIN);
            mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
            mainIntent.setPackage(packageName);
            //通过上面的查询条件获取查询列表
            List<ResolveInfo> resolveInfos=pm.queryIntentActivities(mainIntent, PackageManager.MATCH_DEFAULT_ONLY);
            //列表判断
            for(ResolveInfo r:resolveInfos){
                String activityName=r.activityInfo.name;
                if(activityName.contains(packageName)){
                    //写入操作
                    writeFile("/mnt/sdcard", fileName, "activityName:"+activityName);
                }
            }
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
    }
    //写入文件的方法
    public void writeFile(String path,String fileName,String text){
        File file=new File(path+File.separator+fileName);
        try {
            //如果他不存在就创建一个
            if(!file.exists()){
                file.createNewFile();
            }
            //文件输出流
            FileOutputStream out=new FileOutputStream(file,true);
            OutputStreamWriter ow=new OutputStreamWriter(out);
            BufferedWriter bw=new BufferedWriter(ow);

            bw.append(text);
            bw.newLine();
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
3.添加权限”android.permission.WRITE_EXTERNAL_STORAGE”(SD卡写入文件的权限),添加方法参考本文一、4步骤
4.修改AndroidManiFest.xml文件注册广播接收器,在标签后面填入代码
<receiver android:name=".AppInfo">//广播类名
    <intent-filter >
        <action android:name="jian.info.action"/>//自定义动作名
    </intent-filter>
</receiver>
5.右键点辅助APK工程–run as–android application,将apk安装到手机上
6. 打开命令行,输入”adb shell am broadcast -a [自定义的name] -e pn [包名] -e fn [自定义文件名]”查看是否注册成功,按照上述代码,该命令的正确表现形式应该是”adb shell am broadcast -a jian.info.action -e pn com.android.clock -e fn apkInfo.txt”正常情况下SD卡下应该会有一个apkInfo.txt的文件
7.编写测试用例,代码如下:
//测试用例
public void tesrDemo2(){
    //设置包名
    String packageName="com.android.deskclock";
    //获取
    String version=getApkInfo("versionName", packageName);
    String apkName=getApkInfo("vapkName", packageName);
    String activityName=getApkInfo("activityName", packageName);
    //输出
    System.out.println("version:"+version);
    System.out.println("apkName:"+apkName);
    System.out.println("activityName:"+activityName);
    //启动应用
    launchApp(packageName, activityName);
}
//启动应用的方法
public void launchApp(String packageName,String activityName){
    String command="am start -W -n "+packageName+"/"+activityName;
    try {
        Runtime.getRuntime().exec(command);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
//写一个读文件的方法
public String getApkInfo(String key,String packageName){
    //文件路径
    File file=new File("/mnt/sdcard/apkTestInfo.txt");
    //看文件是否存在,如果已存在就删除
    if(file.exists()){
        file.delete();
    }
    //定义命令
    String cmd="am broadcast -a jian.info.action"+" -e pn"+packageName+"-e fn apkTestInfo.txt";
    try {
        //当文件不存在的时候才执行cmd命令
        while(!file.exists()){
        Runtime.getRuntime().exec(cmd);
        sleep(5000);
        }
        FileInputStream in=new FileInputStream(file);
        InputStreamReader re=new InputStreamReader(in);
        BufferedReader reader=new BufferedReader(re);
        //逐行读取
        String line="";
        while((line=reader.readLine())!=null){
            if((line.contains(key))){
                String[] s=line.split(":");
                return s[1];
            }
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return "未获取到信息";
}
时间: 2024-08-06 20:06:23

13.UiAutomator 辅助APK的使用的相关文章

[uiautomator篇] apk 允许uiautomator用例

http://blog.csdn.net/cxq234843654/article/details/52605441 uiautomator2.0+脱离PC运行(apk启动uiautomator2.0+)的实现方案 效果: 打开MyTest.apk,点击run uiautomator,就能直接运行你的脚本. 方案概述: 新建一个Android app工程MyTest,在Activity中添加Button,用于启动脚本 给这个app添加系统签名 在MyTest中新建一个module,命名为MyTe

Java环境解析apk文件信息

概述:Java解析apk文件,获取apk文件里的包名,版本号,图标文件等; 功能:可以提供给windows和linux平台使用; 原理:利用aapt.exe或者aapt这些anroid平台解析apk文件的工具,借用终端shell调用命令解析输出信息; 代码: 这里贴出一些关键代码,并给出代码注释,如下 1 package com.apkutils; 2 3 import java.io.BufferedReader; 4 import java.io.Closeable; 5 import ja

Android逆向基础----APK文件结构

参考这个博客 http://www.cnblogs.com/wangtianxj/archive/2010/06/13/1757639.html APK文件结构: AndroidManifest.xml                 配置清单 META-INF                                  签名 assets                                        资源 classes.dex                      

Asp.net MVC4高级编程学习笔记-模型学习第五课MVC表单和HTML辅助方法20171101

MVC表单和HTML辅助方法 一.表单的使用. 表单中的action与method特性.Action表示表单要提交往那里,因此这里就有一个URL.这个URL可以是相对或绝对地址.表单默认的method属性值是get,如果看到表单没有写method属性那就是表示method是get方式提交.另外一种就是post方式. 当使用HTTP Get请求时,浏览器会提取表单中元素的name特性值及相应的value特性值放到查询字符串中.如:http://localhost?search?id=1 如果不想把

数字代码表

数字代码表 android辅助 apk下载 00望远镜01小树02铃儿03三脚凳04汽车05手套06手枪07令旗08溜冰鞋09猫10棒球11梯子12椅儿13医生14钥匙15鹦鹉16石榴17仪器18腰包19衣钩20香烟21鳄鱼22双胞胎23和尚24闹钟25二胡26河流27耳机28恶霸29恶囚30三轮车31鲨鱼32扇儿33猩猩34三丝35山虎36山鹿37山鸡38妇女39胃药40司令41蜥蜴42柿儿43死神44蛇45师傅46饲料47司机48石板49湿狗 50奥运五环51工人52鼓儿53乌纱帽54青年5

appium的log详细分析

下面介绍appium日志的大概分析 //启动appium服务成功2017-03-24 11:22:49:218 - info: [Appium] Welcome to Appium v1.6.32017-03-24 11:22:49:221 - info: [Appium] Non-default server args:2017-03-24 11:22:49:222 - info: [Appium] log: 'C:\\Users\\LXG\\Desktop\\appium.log'2017-

用命令行方式升级Android SDK

为什么用命令行?因为google站点国内很难访问,用Android SDK Manager下载很麻烦.但是我有美国的服务器,用命令行可以升级SDK,然后复制下来. 1. 安装java Ubuntu 13.10 安装Oralce JDK 2. 下载Android SDK wget http://dl.google.com/android/android-sdk_r23.0.2-linux.tgz 解压后,进入目录的tools目录,执行: [email protected]:/opt/android

TCPCOPY 1.0 安装使用

简介 TCPCOPY 是一个 tcp 流量的实时复制工具,其1.0版本由网易工程师 @tcpcopy 开发和维护.一般用来将生产环境的线上流量实时复制到测试环境进行测试.例如新系统上线前,如果我们希望进行一些基本的压力测试,那么我们可以直接利用 tcpcopy 来复制线上的流量过来对系统进行测试,这样的好处是测试数据接近真实水平,且实施起来相对简单. 一,架构 二,安装 测试中用到的3台服务器信息如下: 线上服务器 online server       内网IP地址 192.168.0.8/2

Downloadmanager实现app实现的升级下载使用

1.app升级下载现在不推荐使用downloadmanager下载: 原因有下面的几个方面: (1)三星note系列部分手机需要手动打开这个权限才能用这个功能,而有些国产手机更加nb了直接个阉割了(downloadmanager),所以考虑到手机的适配性,最后自己编写app下载的后台代码 2.但是这里还是对downloadmanager下载进行一些详细的分析,很多下载的思路还是值得借鉴的 1.首先后台的apk的搭建 1.打开本地Tomcat服务器,放入一个Apk文件 apk存放在webapps/