最近在研究android apk与uiautomator2脚本的传参,以此达到测试apk与脚本之间的交互。
对此我总结了如下的方案:
1.通过文件传值,写文件需要在manifest文件中添加文件相关权限:
若apk传值到脚本中,可以在apk中写入参数到文件中,然后uiautomator脚本读取文件数据
若脚本传值到apk中,可以在uiautomator脚本写入参数到文件中,然后apk中读取文件数据
csv文件工具类如下:
package com.example.administrator.yallatool.utils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2017/8/9.
*/
public class FileUtils {
// 判断文件是否存在,不存在则创建文件
public static void judeDirExists(File file) {
if (file.exists()&&file.isDirectory()) {
System.out.println("dir exists");
} else {
System.out.println("dir not exists, create it ...");
file.mkdir();
}
}
//写入到csv中
public void writeTofile(String filepath,String content){
String path=filepath;
File writepath=new File(path);
FileWriter writer=null;
try {
//"E:\\YallaTest\\YallaResult.csv"
// 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
writer = new FileWriter(writepath,false);
writer.write(content);
//\r\n表示换行
//,表示换一格
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(writer != null){
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//读取文件
public String read(String path) throws IOException{
BufferedReader br = new BufferedReader(new FileReader(path));
StringBuffer sb = new StringBuffer();
String line = null;
while((line= br.readLine()) != null) {
sb.append(line);
}
System.out.println(sb.toString()); //sb包含所有文本内容
return sb.toString();
}
}
2.通过Bundle传值(apk传值给脚本)
apk运行脚本时执行如下shell命令,-es表示传过去的参数为String类型,icon表示传过去的键,QQ表示传过去的值
adb shell am instrument -w -r -e debug false -es icon QQ -e class com.example.administrator.yalla_autotest.Testgetarg com.example.administrator.yalla_autotest.test/android.support.test.runner.AndroidJUnitRunner
在脚本代码中如下方法获取传过来的参数:
public String getBundle(){
Bundle b=InstrumentationRegistry.getArguments();
String values= (String) b.get("icon");
return values;
}
3.通过广播传值(脚本传值给apk)
脚本执行am命令发送广播:
adb shell am broadcast -a com.example.administrator.yallatool --es data aa
在apk里编写一个广播接受者,获取参数代码如下:
package com.example.administrator.yallatool.BroadcastReceive;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import com.example.administrator.yallatool.Activity.MainActivity;
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
//adb shell am broadcast -a com.example.administrator.yallatool --es data aa
String content=intent.getStringExtra("data");
CharSequence string="收到信息:"+content;
Toast.makeText(context, string,Toast.LENGTH_LONG).show();
}
}
4.socket传值(脚本和apk互相穿参):
eclipse编写socket代码,接收信息,并发送消息至所有连接的客户端:
脚本和apk都连接上socket即可实现消息互传
5.android的其他存储方式也可以作为穿参的方案,如sqlite,sharedpreferences,实现方式和第一种类似,在这里就不做详细描述了
网友评论