前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android UiAutomator自定义快速调试类

android UiAutomator自定义快速调试类

作者头像
FunTester
发布2019-09-05 18:18:22
4840
发布2019-09-05 18:18:22
举报
文章被收录于专栏:FunTester

本人在使用UiAutomator的过程中,一直用快速调试类来做测试,发现其中很多地方都需要根据不同的需求做修改,今天特意花了点时间总体修改一遍,更加灵活了,又写了很多中文注释。分享出来,供大家参考。

代码语言:javascript
复制
package student;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class UiAutomatorHelper {

    private static String android_id = "1";//androidId,写好不用传参
    private static String jar_name = "";//jar名字
    private static String test_class = "";//包名.类名
    private static String test_name = "";//用例名
    private static String devices = UseOften.NEXUS5DEVICESID;//自定义设备ID
    private static String workspace_path;// 工作空间不需要配置,自动获取工作空间目录
    public UiAutomatorHelper() {//如果类有带参构造方法,必须把隐藏的空参构造方法写出来
        Library.getInstance().output("欢迎使用自定义调试类!");
    }
    public UiAutomatorHelper(String jarName, String testClass, String testName) {
        workspace_path = getWorkSpase();
        jar_name = jarName;
        test_class = testClass;
        test_name = testName;
        UseOften.getInstance().setMobileInputMethodToUtf();//设置输入法为utf7
        runUiautomator();
        UseOften.getInstance().setMobileInputMethodToQQ();//设置输入法为QQ输入法
        System.out.println(UseOften.LINE+"---FINISH DEBUG----"+UseOften.LINE);//结束
    }
    // 运行步骤
    private void runUiautomator() {
        creatBuildXml();
        modfileBuild();
        buildWithAnt();
        pushTestJar(workspace_path + "\\bin\\" + jar_name + ".jar");
        runTest(jar_name, test_class + "#" + test_name);
    }

    //创建build.xml
    public void creatBuildXml() {
        execCmd("cmd /c android create uitest-project -n " + jar_name + " -t " + android_id + " -p " + "\""
                + workspace_path + "\"");
    }
    //修改build
    public void modfileBuild() {
        StringBuffer stringBuffer = new StringBuffer();//创建并实例化stringbuffer
        try {
            File file = new File("build.xml");
            if (file.isFile() && file.exists()) { //判断文件是否存在
                InputStreamReader read = new InputStreamReader(new FileInputStream(file));//通过文件字节输入流创建并实例化输出字符流(流转换)
                BufferedReader bufferedReader = new BufferedReader(read);//创建并实例化BufferedReader,用来接收字符流
                String lineTxt = null;//用来接收readline的结果
                while ((lineTxt = bufferedReader.readLine()) != null) {//循环读取处理内容
                    if (lineTxt.matches(".*help.*")) {//正则匹配
                        lineTxt = lineTxt.replaceAll("help", "build");//替换help为build
                    }
                    stringBuffer = stringBuffer.append(lineTxt + "\t\n");//stringbuffer接收修改后的内容
                }
                bufferedReader.close();//关闭流,有依赖关系所以先关闭
                read.close();//关闭流
            } else {
                System.out.println("找不到指定的文件");
            }
        } catch (Exception e) {
            System.out.println("读取文件内容出错");
            e.printStackTrace();
        }
        // 修改后写回去
        writerText("build.xml", new String(stringBuffer));
    }
    //ant 执行build
    public void buildWithAnt() {
        execCmd("cmd /c ant");
    }
    //把jar包push到手机上
    public void pushTestJar(String localPath) {
        localPath = "\"" + localPath + "\"";
        String pushCmd = "adb -s "+devices+" push " + localPath + " /data/local/tmp/";
        execCmd(pushCmd);
    }
    //运行用例方法
    public void runTest(String jarName, String testName) {
        String runCmd = "adb -s "+devices+" shell uiautomator runtest ";//此处-s表示nexus机器
        String testCmd = jarName + ".jar " + "--nohup -c " + testName;
        execCmd(runCmd + testCmd);
    }
    //获取工作空间
    public String getWorkSpase() {
        File directory = new File("");//创建并实例化file对象
        String abPath = directory.getAbsolutePath();//获取绝对路径
        return abPath;
    }
    //执行cmd命令
    public void execCmd(String cmd) {
        try {
            Process p = Runtime.getRuntime().exec(cmd);//通过runtime类执行cmd命令
            // 正确输出流
            InputStream input = p.getInputStream();//创建并实例化输入字节流
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));//先通过inputstreamreader进行流转化,在实例化bufferedreader,接收内容
            String line = "";
            while ((line = reader.readLine()) != null) {//循环读取
                    System.out.println(line);//输出
                    saveToFile(line, "runlog.log", false);//保存,false表示不覆盖
                    }
            reader.close();//此处reader依赖于input,应先关闭
            input.close();
            // 错误输出流
            InputStream errorInput = p.getErrorStream();//创建并实例化输入字节流
            BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorInput));//先通过inputstreamreader进行流转化,在实例化bufferedreader,接收内容
            String eline = "";
            while ((eline = errorReader.readLine()) != null) {//循环读取
                System.out.println(eline);//输出
                saveToFile(eline, "runlog.log", false);//保存,false表示不覆盖
            }
            errorReader.close();//此处有依赖关系,先关闭errorReader
            errorInput.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //覆盖写入文件
    public void writerText(String path, String content) {
        File dirFile = new File(path);
        if (!dirFile.exists()) {//如果不存在,新建
            dirFile.mkdir();
        }
        try {
            //这里加入true 可以不覆盖原有TXT文件内容,续写
            BufferedWriter bw1 = new BufferedWriter(new FileWriter(path));//通过文件输出流来用bufferedwrite接收写入
            bw1.write(content);//将内容写到文件中
            bw1.flush();//强制输出缓冲区内容
            bw1.close();//关闭流
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //写入文档,注释见writerText方法
    public void saveToFile(String text, String path, boolean isClose) {
        File file = new File("runlog.log");
        BufferedWriter bf = null;
        try {
            FileOutputStream outputStream = new FileOutputStream(file, true);
            OutputStreamWriter outWriter = new OutputStreamWriter(outputStream);
            bf = new BufferedWriter(outWriter);
            bf.append(text);//添加内容
            bf.newLine();
            bf.flush();
            if (isClose) {
                bf.close();
            }
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    } 
}

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档