一、在测试中弹出提示框

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 "未获取到信息";
}

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

  1. 一步步学习ASP.NET MVC3 (13)——HTML辅助方法

    请注明转载地址:http://www.cnblogs.com/arhat 今天老魏是在十分郁闷,我的一个U盘丢了,心疼里面的资料啊,全部是老魏辛辛苦苦积攒的Linux资料,太心疼,到现在心情还不是很爽 ...

  2. 面试之路(13)-android apk之间共享数据的方式以及shareUserId详解

    1.通过content Provider/sharedPreferrence 2.通过shareUserId 我们详细介绍一下shareUserId: Android App Sandbox(andr ...

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

    MVC表单和HTML辅助方法 一.表单的使用. 表单中的action与method特性.Action表示表单要提交往那里,因此这里就有一个URL.这个URL可以是相对或绝对地址.表单默认的method ...

  4. ASP.NET MVC5高级编程 之 HTML辅助方法

    Html属性调用HTML辅助方法,Url属性调用URL辅助方法,Ajax属性调用Ajax辅助方法. HTML辅助方法 1.Html.BeginForm @using (Html.BeginForm(& ...

  5. ASP.NET MVC5 学习系列之表单和HTML辅助方法

    一.表单 (一)Action和Method特性 Action特性用以告知浏览器信息发往何处,因此,Action特性后面需要包含一个Url地址.这里的Url地址可以是相对的,也可以是绝对的.如下Form ...

  6. [python学习篇] uiautomator xiaocong

    Skip to content     This repository Pull requests Issues Marketplace Gist   Sign out       Watch103 ...

  7. jvm源码解读--13 gc_root中的栈中oop的mark 和copy 过程分析

    粘贴源码 package com.test; import java.util.Random; public class Test { static int number=12; private in ...

  8. appium的log详细分析

    下面介绍appium日志的大概分析 //启动appium服务成功2017-03-24 11:22:49:218 - info: [Appium] Welcome to Appium v1.6.3201 ...

  9. Java程序员

    从生存.制胜.发展三个方面入手,为大家展示出程序员求职与工作的一幅3D全景图像.本书中既有在公司中的生存技巧,又有高手达人的进阶策略,既有求职攻略的按图索骥,又有入职后生产环境的破解揭秘. 书中浓缩了 ...

随机推荐

  1. 使用appcmd命令创建iis站点及应用程序池

    参考文章:iis7 appcmd的基础命令及简单用法 验证环境:Windows 7    IIS7 AppCmd.exe工具所在目录 C:\windows\sytstem32\inetsrv\目录下, ...

  2. USACO 3.3.1 Riding the Fences 骑马修栅栏(欧拉回路)

    Description 农民John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个一个栅栏.你必须编一个程 ...

  3. Java中的抽象类abstract

    abstract定义抽象类 abstract定义抽象方法,只需要声明,不需要实现 包含抽象方法的类是抽象类 抽象类中可以包含抽象方法,也可以包含普通方法 抽象类不能直接创建,可以定义父类引用变量指向子 ...

  4. 2018软工实践—Alpha冲刺(4)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前后端接口的开发 测试项目运行的服务器环 ...

  5. FormsAuthentication.SetAuthCookie 方法登录

    FormsAuthentication.SetAuthCookie 方法,登录的原理. FormsAuthentication.SetAuthCookie 方法登录的过期时间. 登录相关阅读 asp. ...

  6. MySQL 基于mysqldump备份工具实战演练

    前言: 细节提示:先执行 show global variables like 'log_bin';看看log_bin的值,如果服务器变量log_bin的值为OFF,需要修改my.cnf配置文件,将l ...

  7. C语言文法推导

  8. memached实现tomcat的session共享

    由于项目服务器用的阿里云的ECS,Memcached也采用的阿里云.多个tomcat集群的session都存储在一个云memcached中. 配置步骤如下: 一.tomcat增加memcached支持 ...

  9. crontab部署定时任务

    1.安装cron工具:apt-getinstall cron 2.开启定时任务:crontab –e 定时任务语句格式为:执行周期+命令. 周期有5个域,分别是分,时,日(day of month), ...

  10. (转)微软借力.NET开源跨平台支持,布局物联网平台开发

    今天科技类最大的新闻,莫过于微软宣布.NET开发框架开源计划..NET 开源,集成 Clang 和 LLVM 并且自带 Android 模拟器,这意味着 Visual Studio 这个当下最好没有之 ...