def auto_app_test(adb, app_info): print u'\n[INFO] 开始自动化测试...' # monkey script 测试,用于进入初始化界面 monkey_script_test(adb, app_info) packagename = app_info['packagename'] # monkey 测试,输出太多,重定向输出 p = subprocess.Popen([ adb, '-s', get_identifier(), 'shell', 'monkey', '-p', packagename, '--ignore-crashes', '--ignore-timeouts', '--monitor-native-crashes', '-v', '-v', '-v', '1000' ], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 设置超时检查 start_time = time.time() while True: if p.poll() is not None: #useless_out, useless_err = p.communicate() break if time.time() - start_time > 60: p.terminate() break time.sleep(0.5) # TODO: 添加其他测试方法 return
def get_packages(toolsdir): """Get List of Pacakges""" adb = getADB(toolsdir) args = [adb, "-s", get_identifier(), "shell", "ls", "/data/data"] # prolly a better way to get packages is needed try: return subprocess.check_output(args) except: return "error"
def avd_load_wait(adb): """Wait for AVD Load""" try: emulator = get_identifier() print "[INFO] Wait for emulator to load" args = [adb, "-s", emulator, "wait-for-device"] subprocess.call(args) print "[INFO] Wait for dev.boot_complete loop" while True: args = [ adb, "-s", emulator, "shell", "getprop", "dev.bootcomplete" ] try: result = subprocess.check_output(args) except: result = None if result is not None and result.strip() == "1": break else: time.sleep(1) print "[INFO] Wait for sys.boot_complete loop" while True: args = [ adb, "-s", emulator, "shell", "getprop", "sys.boot_completed" ] try: result = subprocess.check_output(args) except: result = None if result is not None and result.strip() == "1": break else: time.sleep(1) print "[INFO] Wait for svc.boot_complete loop" while True: args = [ adb, "-s", emulator, "shell", "getprop", "init.svc.bootanim" ] try: result = subprocess.check_output(args) except: result = None if result is not None and result.strip() == "stopped": break else: time.sleep(1) time.sleep(5) # Remount the partitions for RW subprocess.call([adb, "-s", emulator, "remount"]) return True except: PrintException("[ERROR] emulator did not boot properly") return False
def stop_avd(adb): """Stop AVD""" print "\n[INFO] Stopping MobSF Emulator" try: # adb -s emulator-xxxx emu kill FNULL = open(os.devnull, 'w') args = [adb, '-s', get_identifier(), 'emu', 'kill'] subprocess.call(args, stderr=FNULL) except: PrintException("[ERROR] Stopping MobSF Emulator")
def download_logs(adb, download_dir): subprocess.call([ adb, "-s", get_identifier(), "pull", "/data/data/de.robv.android.xposed.installer/log/error.log", download_dir + "x_logcat_temp.txt" ]) print "\n[INFO] Downloading Droidmon API Monitor Logcat logs" # TODO: 下载其他有用文件 return
def avd_load_wait(adb): """Wait for AVD Load""" try: emulator = get_identifier() print "[INFO] Wait for emulator to load" args = [adb, "-s", emulator, "wait-for-device"] subprocess.call(args) print "[INFO] Wait for dev.boot_complete loop" while True: args = [adb, "-s", emulator, "shell", "getprop", "dev.bootcomplete"] try: result = subprocess.check_output(args) except: result = None if result is not None and result.strip() == "1": break else: time.sleep(1) print "[INFO] Wait for sys.boot_complete loop" while True: args = [adb, "-s", emulator, "shell", "getprop", "sys.boot_completed"] try: result = subprocess.check_output(args) except: result = None if result is not None and result.strip() == "1": break else: time.sleep(1) print "[INFO] Wait for svc.boot_complete loop" while True: args = [adb, "-s", emulator, "shell", "getprop", "init.svc.bootanim"] try: result = subprocess.check_output(args) except: result = None if result is not None and result.strip() == "stopped": break else: time.sleep(1) time.sleep(5) # Remount the partitions for RW subprocess.call([adb, "-s", emulator, "remount"]) return True except: PrintException("[ERROR] emulator did not boot properly") return False
def monkey_script_test(adb, app_info): monkey_script_pattern = ''' type=user count=10 speed=1.0 start data >> captureDispatchPointer(0,0,0,200,600,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,200,600,1,1,-1,1,1,0,0) UserWait(1000) captureDispatchPointer(0,0,0,400,600,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,400,600,1,1,-1,1,1,0,0) UserWait(1000) captureDispatchPointer(0,0,0,600,600,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,600,600,1,1,-1,1,1,0,0) UserWait(1000) captureDispatchPointer(0,0,0,200,800,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,200,800,1,1,-1,1,1,0,0) UserWait(1000) captureDispatchPointer(0,0,0,600,1000,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,600,1000,1,1,-1,1,1,0,0) UserWait(3000) LaunchActivity({packagename}, {mainactivity}) UserWait(5000) Drag({screen_x_right},{screen_y_middle},{screen_x_left},{screen_y_middle},70) UserWait({drag_wait}) Drag({screen_x_right},{screen_y_middle},{screen_x_left},{screen_y_middle},70) UserWait({drag_wait}) Drag({screen_x_right},{screen_y_middle},{screen_x_left},{screen_y_middle},70) UserWait({drag_wait}) Drag({screen_x_right},{screen_y_middle},{screen_x_left},{screen_y_middle},70) UserWait({drag_wait}) Drag({screen_x_right},{screen_y_middle},{screen_x_left},{screen_y_middle},70) UserWait({drag_wait}) Drag({screen_x_right},{screen_y_middle},{screen_x_left},{screen_y_middle},70) UserWait({drag_wait}) Drag({screen_x_right},{screen_y_middle},{screen_x_left},{screen_y_middle},70) UserWait({drag_wait}) Drag({screen_x_right},{screen_y_middle},{screen_x_left},{screen_y_middle},70) UserWait({drag_wait}) Drag({screen_x_right},{screen_y_middle},{screen_x_left},{screen_y_middle},70) UserWait({drag_wait}) Drag({screen_x_right},{screen_y_middle},{screen_x_left},{screen_y_middle},70) UserWait({drag_wait}) Drag({screen_x_right},{screen_y_middle},{screen_x_left},{screen_y_middle},70) UserWait({drag_wait}) Drag({screen_x_right},{screen_y_middle},{screen_x_left},{screen_y_middle},70) UserWait({drag_wait}) captureDispatchPointer(0,0,0,{screen_x_middle},100,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,{screen_x_middle},100,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,0,{screen_x_middle},200,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,{screen_x_middle},200,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,0,{screen_x_middle},300,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,{screen_x_middle},300,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,0,{screen_x_middle},400,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,{screen_x_middle},400,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,0,{screen_x_middle},500,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,{screen_x_middle},500,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,0,{screen_x_middle},600,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,{screen_x_middle},600,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,0,{screen_x_middle},700,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,{screen_x_middle},700,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,0,{screen_x_middle},800,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,{screen_x_middle},800,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,0,{screen_x_middle},900,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,{screen_x_middle},900,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,0,{screen_x_middle},1000,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,{screen_x_middle},1000,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,0,{screen_x_middle},1100,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,{screen_x_middle},1100,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,0,{screen_x_middle},1200,1,1,-1,1,1,0,0) captureDispatchPointer(0,0,1,{screen_x_middle},1200,1,1,-1,1,1,0,0) UserWait(1000) captureDispatchPress(4) captureDispatchPress(4) captureDispatchPress(4) ''' drag_wait = 750 packagename = app_info['packagename'] mainactivity = app_info['mainactivity'] if mainactivity.startswith('.'): mainactivity = packagename + mainactivity screen_x_right = 750 screen_y_middle = 640 screen_x_left = 50 screen_x_middle = 400 monkey_script_data = monkey_script_pattern.format( drag_wait=drag_wait, packagename=packagename, mainactivity=mainactivity, screen_x_right=screen_x_right, screen_y_middle=screen_y_middle, screen_x_left=screen_x_left, screen_x_middle=screen_x_middle) monkey_script_file_name = os.path.join( os.path.join(UPLOAD_DIR, app_info['file_md5']), 'monkey_script.txt') with open(monkey_script_file_name, 'w') as f: f.write(monkey_script_data) subprocess.call([ adb, "-s", get_identifier(), "push", monkey_script_file_name, "/data/local/tmp" ]) subprocess.call([ adb, "-s", get_identifier(), "shell", "monkey", "-f", "/data/local/tmp/monkey_script.txt", "1" ]) print u'\n[INFO] 跳过初始化界面' return