android apk与uiautomator2传参总结

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



猜你喜欢

转载自blog.csdn.net/qq_31242531/article/details/80507284
今日推荐