1. 程式人生 > >如何在Mac OS上使用UiAutomator快速除錯類

如何在Mac OS上使用UiAutomator快速除錯類

本人最近在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();
		}
 
	}
}

往期文章精選

  1. java一行程式碼列印心形
  2. Linux效能監控軟體netdata中文漢化版
  3. 介面測試程式碼覆蓋率(jacoco)方案分享
  4. 效能測試框架
  5. 如何在Linux命令列介面愉快進行效能測試
  6. 圖解HTTP腦圖
  7. 寫給所有人的程式設計思維
  8. 將json資料格式化輸出到控制檯
  9. 如何測試概率型業務介面
  10. 將swagger文件自動變成測試程式碼
  11. Mac+httpclient高併發配置例項
  12. httpclient處理多使用者同時線上

公眾號地圖 ☢️