package com.james.uicomparerunner.utils; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.james.uicomparerunner.UICompareRunner; public class ScriptGenerator { public final static String START_FROM_DESKTOP = "START FROM DESKTOP"; public final static String END_BACK_TO_DESKTOP = "END BACK TO DESKTOP"; public final static String CLEAR_DATA = "CLEAR DATA"; private static int index = 0; private static int loopCount = 1; private static String exceptionModels = null; public static String getScriptFilePath(String mrPath) throws IOException { if (mrPath == null) return null; exceptionModels = null; File file = new File("python" + File.separator + "exception_devices.txt"); FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String line = null; while ((line = br.readLine()) != null) { if (exceptionModels == null) { exceptionModels = "'" + line + "'"; } else { exceptionModels = exceptionModels + "," + "'" + line + "'"; } } br.close(); String mrFileName = new File(mrPath).getName(); index = 0; // String scriptFilePath = UICompareRunner.dir_device_script + "/" + mrFileName.replace(".mr", ".py"); Writer wt = new FileWriter(new File(scriptFilePath)); BufferedWriter writer = new BufferedWriter(wt); writer.newLine(); writer.write("import sys,traceback"); writer.newLine(); writer.write("from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage"); writer.newLine(); writer.newLine(); writer.write("def getDevice():"); writer.newLine(); writer.write(" return sys.argv[1]"); writer.newLine(); writer.newLine(); writer.write("def getPath():"); writer.newLine(); writer.write(" return sys.argv[2]"); writer.newLine(); writer.newLine(); // Reader rd = new FileReader(mrPath); BufferedReader reader = new BufferedReader(rd); generateSteps(reader, writer); writer.newLine(); writer.write("print(\"get device name\")"); writer.newLine(); writer.write("device_name = getDevice()"); writer.newLine(); writer.newLine(); writer.write("print(\"get dir of screenshot\")"); writer.newLine(); writer.write("dir_picture = getPath()"); writer.newLine(); writer.newLine(); writer.write("print(\"Connects to the current device, returning a MonkeyDevice object\")"); writer.newLine(); writer.write("device = MonkeyRunner.waitForConnection(5,device_name)"); writer.newLine(); writer.newLine(); writer.write("if not device:"); writer.newLine(); writer.write(" print(\"device connect...fail\")"); writer.newLine(); writer.write(" sys.exit(1)"); writer.newLine(); writer.write("else:"); writer.newLine(); writer.write(" deviceModel = device.getProperty('build.model')"); writer.newLine(); writer.write(" print(\"device connect...success\")"); writer.newLine(); writer.write(" startSteps()"); writer.newLine(); if (exceptionModels != null) { writer.write(" if not deviceModel in [" + exceptionModels + "]:"); writer.newLine(); writer.write(" device.shell(\"stop\")"); writer.newLine(); } writer.write(" sys.exit(0)"); writer.newLine(); writer.newLine(); writer.close(); reader.close(); return scriptFilePath; } private static void generateSteps(BufferedReader reader, BufferedWriter writer) throws IOException { // writer.write("def startSteps():"); writer.newLine(); writer.write(" print (\"start monkey runner.\")"); writer.newLine(); String line = null; while ((line = reader.readLine()) != null) { String tab = " "; for (int i = 1; i < loopCount; i++) { tab = tab + " "; } if (!line.startsWith("#")) writer.write(tab + "print(\"" + line + "\")"); writer.newLine(); // if (line.startsWith("#")) { writer.write(tab + line); writer.newLine(); } else if (line.startsWith(CLEAR_DATA)) { writer.write(tab + "device.shell('pm clear " + UICompareRunner.package_name + "')"); writer.newLine(); writer.write(tab + "MonkeyRunner.sleep(4.0)"); writer.newLine(); writer.newLine(); } else if (line.startsWith(START_FROM_DESKTOP) || line.startsWith(END_BACK_TO_DESKTOP)) { writer.write(tab + "device.shell('am force-stop " + UICompareRunner.package_name + "')"); writer.newLine(); writer.write(tab + "MonkeyRunner.sleep(4.0)"); writer.newLine(); writer.newLine(); } else if (line.startsWith("TOUCH")) { String str = line.replace("TOUCH|", ""); Pattern pattern = Pattern.compile("'x':(\\d+),'y':(\\d+),'type':'(\\S+)',"); Matcher matcher = pattern.matcher(str); if (matcher.find()) { String action = "MonkeyDevice.DOWN_AND_UP"; writer.write(tab + "device.touch(" + matcher.group(1) + "," + matcher.group(2) + "," + action + ")"); writer.newLine(); writer.write(tab + "MonkeyRunner.sleep(4.0)"); writer.newLine(); writer.newLine(); } } else if (line.startsWith("DRAG")) { // DRAG|{'start':(288,947),'end':(288,189),'duration':1.0,'steps':2,} String str = line.replace("DRAG|", ""); Pattern pattern = Pattern.compile("'start':\\((\\d+),(\\d+)\\),'end':\\((\\d+),(\\d+)\\),'duration':(\\d+\\S+\\d+),'steps':(\\d+),"); Matcher matcher = pattern.matcher(str); if (matcher.find()) { writer.write(tab + "start = (" + matcher.group(1) + "," + matcher.group(2) + ")"); writer.newLine(); writer.write(tab + "end = (" + matcher.group(3) + "," + matcher.group(4) + ")"); writer.newLine(); writer.write(tab + "device.drag(start,end," + matcher.group(5) + "," + matcher.group(6) + ")"); writer.newLine(); writer.write(tab + "MonkeyRunner.sleep(4.0)"); writer.newLine(); writer.newLine(); } } else if (line.startsWith("PRESS")) { String str = line.replace("PRESS|", ""); Pattern pattern = Pattern.compile("'name':'(\\S+)','type':'(\\S+)',"); Matcher matcher = pattern.matcher(str); if (matcher.find()) { String action = "MonkeyDevice.DOWN_AND_UP"; writer.write(tab + "device.press('KEYCODE_" + matcher.group(1) + "'," + action + ")"); writer.newLine(); writer.write(tab + "MonkeyRunner.sleep(4.0)"); writer.newLine(); writer.newLine(); } } else if (line.startsWith("TYPE")) { String str = line.replace("TYPE|", ""); Pattern pattern = Pattern.compile("'message':'(\\S+)',"); Matcher matcher = pattern.matcher(str); if (matcher.find()) { writer.write(tab + "device.type('" + matcher.group(1) + "')"); writer.newLine(); writer.newLine(); } } else if (line.startsWith("WAIT")) { String str = line.replace("WAIT|", ""); Pattern pattern = Pattern.compile("'seconds':(\\d+\\S+\\d+),"); Matcher matcher = pattern.matcher(str); if (matcher.find()) { writer.write(tab + "MonkeyRunner.sleep(" + matcher.group(1) + ")"); writer.newLine(); } } else if (line.startsWith("TAKE SNAPSHOT")) { snapshot(writer, tab); } else if (line.startsWith("LOOP")) { String count = line.replace("LOOP(", "").replace(")", ""); writer.write(tab + "for index in range(" + count + "):"); writer.newLine(); loopCount++; } else if (line.startsWith("END LOOP")) { writer.newLine(); loopCount--; } } writer.write(" print(\"end monkey runner.\")"); writer.newLine(); } private static void snapshot(BufferedWriter writer, String append) throws IOException { writer.write(append + "result = device.takeSnapshot()"); writer.newLine(); writer.write(append + "print(\"Writes the screenshot to a file\")"); writer.newLine(); if (append.equalsIgnoreCase(" ")) { writer.write(append + "result.writeToFile(dir_picture+'/screenshot_'+str(0)+'_" + index + ".png','png')"); } else { writer.write(append + "result.writeToFile(dir_picture+'/screenshot_'+str(index)+'_" + index + ".png','png')"); } writer.newLine(); writer.newLine(); index++; } }