最近在研究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,实现方式和第一种类似,在这里就不做详细描述了