如何在Mac OS上使用UiAutomator快速除錯類
阿新 • • 發佈:2019-08-23
本人最近在Mac OS上使用UiAutomator快速除錯類的時候發現跟Windows環境下使用有很大的區別,對於我這個Mac OS小白來說有很多坑要填,今天終於修改完畢,分享程式碼,供大家參考。主要區別就是在執行命令的時候需要把命令前面加上執行全路徑。還有一個就是斜槓的問題,統一改過來就可以了。
遇到的報錯情況:
下面這個是沒有配置全路徑時的報錯資訊:
Cannot run program "android": error=2, No such file or directory
下面這個是路徑錯誤時的報錯資訊:
Cannot run program "/Users/dahaohaozai/android-sdk-macosx/toos/android": error=2, No such file or directory
package source; 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; /** * @author ··-·塵 * @E-mail:[email protected] * @version 建立時間:2017年8月18日 上午10:53:24 * @alter 修改時間: 2017年10月23日10:19:34 類說明:測試除錯用例 */ public class UiAutomatorHelper extends Common { 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 = Common.NEXUS5DEVICESID;//自定義裝置ID private static String workspace_path;// 工作空間不需要配置,自動獲取工作空間目錄 public UiAutomatorHelper() {// 如果類有帶參構造方法,必須把隱藏的空參構造方法寫出來 output("歡迎使用自定義除錯類!"); } /** * 構造方法 * * @param jarName * jar包的名字 * @param testClass * 類名 * @param testName * 方法名Ï */ public UiAutomatorHelper(String jarName, String testClass, String testName) { output("歡迎使用自定義除錯類!"); workspace_path = getWorkSpase(); jar_name = jarName; test_class = testClass; test_name = testName; // Common.getInstance().setMobileInputMethodToUtf();//設定輸入法為utf7 runUiautomator(); // Common.getInstance().setMobileInputMethodToQQ();//設定輸入法為QQ輸入法 output(Common.LINE + "---FINISH DEBUG----" + Common.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() { // System.out.println"android create uitest-project -n " + jar_name + " -t " + // android_id + " -p " + workspace_path); execCmd(ANDROID_PATH + "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(ANT_PATH + "ant"); } /** * 把jar包push到手機上 * @param localPath jar包的絕對路徑 */ public void pushTestJar(String localPath) { String pushCmd = ADB_PATH + "adb push " + localPath + " /data/local/tmp/"; execCmd(pushCmd); } /** * 執行用例方法 * * @param jarName * jar包名字 * @param testName * 執行方法名字 */ public void runTest(String jarName, String testName) { String runCmd = ADB_PATH + "adb shell uiautomator runtest "; 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(); } } }
往期文章精選
- java一行程式碼列印心形
- Linux效能監控軟體netdata中文漢化版
- 介面測試程式碼覆蓋率(jacoco)方案分享
- 效能測試框架
- 如何在Linux命令列介面愉快進行效能測試
- 圖解HTTP腦圖
- 寫給所有人的程式設計思維
- 將json資料格式化輸出到控制檯
- 如何測試概率型業務介面
- 將swagger文件自動變成測試程式碼
- Mac+httpclient高併發配置例項
- httpclient處理多使用者同時線上