本人在使用UiAutomator的过程当中,一直用快速调试类来作测试,发现其中不少地方都须要根据不一样的需求作修改,今天特地花了点时间整体修改一遍,更加灵活了,又写了不少中文注释。分享出来,供你们参考。java
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(); } } }