def init_app(plat, package_name, app_path, sleep_time, serialno=None): dev = None if plat.lower().find('android') >= 0: if serialno: if re.search('127.0.0.1:\d+', serialno): dev = connect_device('Android:///{}?cap_method=JAVACAP&ori_method=ADBORI'.format(serialno)) else: dev = connect_device('Android:///{}'.format(serialno)) else: dev = connect_device('Android:///') wake() install_android_app(current_device().adb, app_path) stop_app(package_name) start_app(package_name) sleep(sleep_time / 1.5) elif plat == 'PC_editor': w = Windows() dev = UnityEditorWindow() w.keyevent('^P') # Ctrl+P运行 sleep(sleep_time / 2) dev.stop_app = w.app # 用于获取进程id,结束进程用 elif plat == 'PC_win': w = Windows() w.start_app(app_path) sleep(sleep_time) w.connect(process=w.app.process) dev = connect_device("Windows:///?class_name=UnityWndClass") dev.stop_app = w.app # elif plat == 'iOS': # pass # elif plat == 'MAC_editor': # pass return dev
def setUp(self): if not current_device(): connect_device('Android:///') self.package_name = 'com.google.android.calculator' apk_path = self.R('res/app/com.google.android.calculator.apk') install_android_app(current_device().adb, apk_path) start_app(self.package_name)
def start_app(self, activity=None): """ 启动app :param activity: 启用的页面 only android :return: """ self.check_device() start_app(self.app_name, activity)
def setUp(self): stop_app("com.gameholic.drawsomethingbyspider") clear_app("com.gameholic.drawsomethingbyspider") wake() home() start_app("com.gameholic.drawsomethingbyspider") sleep(7) self.poco = UnityPoco() print("handBook test start")
def setUp(self): stop_app("com.gameholic.drawsomethingbyspider") clear_app("com.gameholic.drawsomethingbyspider") wake() home() start_app("com.gameholic.drawsomethingbyspider") sleep(7) self.poco = UnityPoco() print("test reward level no coins start")
def __init__(self, device, logging_level=logging.ERROR): logger = logging.getLogger("airtest") logger.setLevel(logging_level) auto_setup(__file__, devices=[device]) start_app('com.tencent.qqlite') self.poco = AndroidUiautomationPoco( use_airtest_input=True, screenshot_each_action=False) self.normalize_qqlite()
def setUp(self): # connect_device("android:///") # self.poco1 = AndroidUiautomationPoco(force_restart=False) stop_app("com.gameholic.drawsomethingbyspider") clear_app("com.gameholic.drawsomethingbyspider") wake() home() start_app("com.gameholic.drawsomethingbyspider") sleep(7) self.poco = UnityPoco()
def check_poco_service(stopped, client_thread): """ 每隔150 启动 poco_service :param stopped: :param client_thread: :return: """ while not stopped: if client_thread is not None and client_thread.stopped: return time.sleep(150) start_app('com.netease.open.pocoservice', 'TestActivity')
def restart_app_by_scan(): try: stop_app("com.taobao.qianniu") # 如果应用存在后台,先停止,保证能够进入千牛工作台首页 finally: start_app('com.taobao.qianniu') # 启动千牛工作台 try: poco('com.taobao.qianniu:id/workbench_title_scan').click() poco('com.taobao.qianniu:id/btn_album').click() poco(name='显示根目录').click() poco(text='图库').click() poco(text='trade').click() poco('com.android.gallery3d:id/iv_thumbnail').click() poco(desc='确定').click() except PocoNoSuchNodeException: restart_app_by_scan()
def connect_iOS(): """ 连接 iOS 手机 :return: 是否连接设备并启动了 app """ try: iOS_device = 'IOS:http://127.0.0.1:8100' connect_device(iOS_device) Data.device_type = 'iOS' start_app(Data.iOS_package) return True except Exception as e: print('连接 iOS 失败:', e) return False
def init_app(plat=SD.PLAT, package_name=SD.PACKAGE_NAME, app_path=SD.APP_PATH[SD.PLAT], sleep_time=SD.SLEEP_TIME, serialno=SD.SERIALNO): dev = None if plat == 'android': if SD.USE_ATX_SERVER2: atx_server2 = AtxServer2() device_info = atx_server2.get_usable_device_info() SD.UDID = device_info['udid'] serialno = device_info['source']['remoteConnectAddress'] if serialno and serialno.strip() != '': if re.search(r'127.0.0.1:\d+', serialno): logger.debug('模拟器用JAVACAP和ADBORI') dev = connect_device(f'Android:///{serialno}?cap_method=JAVACAP&ori_method=ADBORI') else: logger.debug(f'指定连接serialno: {serialno}') dev = connect_device(f'Android:///{serialno}') else: dev = connect_device('Android:///') wake() install_android_app(current_device().adb, app_path) stop_app(package_name) logger.debug(f'启动app:{package_name}') start_app(package_name) sleep(sleep_time / 1.5) elif plat == 'pc_editor': w = Windows() dev = UnityEditorWindow() w.keyevent('^P') # Ctrl+P运行 sleep(sleep_time / 2) dev.stop_app = w.app # 用于获取进程id,结束进程用 elif plat == 'pc_win': w = Windows() w.start_app(app_path) sleep(sleep_time) w.connect(process=w.app.process) dev = connect_device("Windows:///?class_name=UnityWndClass") dev.stop_app = w.app # elif plat == 'ios': # pass # elif plat == 'mac_editor': # pass return dev
def connect_android(): """ 连接 Android 手机 :return: 是否连接设备并启动了 app """ adb = ADB() device_list = adb.devices() if len(device_list) >= 1: try: androd_device = 'Android://127.0.0.1:5037/' + device_list[0][0] connect_device(androd_device) Data.device_type = 'android' start_app(Data.android_package) return True except Exception as e: print('连接 android 失败:', e) return False else: return False
def inner(*args, **kwargs): print(f"测试开始 {test_name}") start_case(test_name) from airtest.core.api import start_app, stop_app stop_app(app_package) start_app(app_package) recorder_queue.put(test_name) # 这里启动监控 result = None try: result = func(*args, **kwargs) except Exception as e: logger.error(e) logger.error(traceback.format_exc()) recorder_queue.put(DefaultConfig.RECORD_CASE_END_MARK) time.sleep(1) stop_app(app_package) print(f"测试结束 {test_name}") stop_case(test_name) time.sleep(5) return result
def login(self, username, password): self.poco1 = AndroidUiautomationPoco() if self.poco1(text="Sign in").exists(): self.poco1(text="Sign in").click() sleep(1.0) self.poco1("android.widget.LinearLayout").offspring("android.widget.RelativeLayout").child("android.widget.LinearLayout").child("android.widget.LinearLayout").child("android.widget.LinearLayout").child("android.widget.ImageView").click() sleep(1) self.poco1(text="Username").click() sleep(1) text(username) sleep(1) self.poco1("android.widget.LinearLayout").offspring("android.widget.RelativeLayout").child("android.widget.LinearLayout").child("android.widget.LinearLayout")[2].child("android.widget.EditText").click() sleep(1) #有的手机text()方法不起作用 shell("input keyboard text %s"%password) shell("input keyevent 4") sleep(1) self.poco1("android.widget.LinearLayout").offspring("android.widget.RelativeLayout").child("android.widget.LinearLayout").child("android.widget.LinearLayout")[3].child("android.widget.TextView").click() sleep(7) else: print("登录弹框未出现") start_app("com.gameholic.drawsomethingbyspider")
def runTest(): stop_app("com.gameholic.drawsomethingbyspider") clear_app("com.gameholic.drawsomethingbyspider") wake() home() start_app("com.gameholic.drawsomethingbyspider") sleep(7) permissionClick() autoUpdate() login("wn10001", "z123456") waitLogin() sleep(5) poco = UnityPoco() #进入商店 poco("Shop").click() sleep(1) #关闭购买去广告提示弹框 if poco("BitchPopup").child("Image").child("Image").exists(): print("弹出支付去广告成功") poco("Button").child("Text").click() if not poco("BitchPopup").child("Image").child("Image").exists(): print("关闭弹框成功") sleep(1) #关闭商店 poco("Return").click() sleep(1) if not poco(text="Limited").exists(): print("退出商店成功") poco("Shop").click() sleep(1) #关闭购买去广告提示弹框 if poco("BitchPopup").child("Image").child("Image").exists(): print("弹出支付去广告成功") poco("Button").child("Text").click() sleep(1) #切换标签和购买 #切换所有标签 poco(text="Gift").click() sleep(1) if poco("PropName").get_text() == "Marvellous Gift": print("切换礼物标签成功") poco("Text (2)").click() sleep(1) if poco("PropName").get_text() == "Speed-up": print("切换到道具标签成功") poco(text="Diamonds").click() sleep(1) if poco(text="Super Gems Pack").get_text() == "Super Gems Pack": print("切换钻石标签成功") poco(text="Limited").click() sleep(1) if not poco("PropName").exists(): print("切换到礼包标签成功") poco(text="Monster").click() sleep(1) if poco(text="Green Fluffy").get_text() == "Green Fluffy": print("切换到怪物标签成功") #滑动列表 poco(texture="monster_A1_1").wait_for_appearance() poco(texture="monster_A1_1").click() beforSwipe = poco(texture="monster_A1_1").get_position() poco.swipe([300.0/576, 850.0/1024],[300.0/576, 150.0/1024]) sleep(2) afterSwipe = poco(texture="monster_A1_1").get_position() if beforSwipe != afterSwipe: print("滑动列表成功") else: print("滑动列表失败") #滑动回顶部 poco.swipe([300.0/576, 150.0/1024],[300.0/576, 850.0/1024]) sleep(2) #购买逻辑 poco("Tree").child("ShopProp(Clone)")[0].child("BuyIt").child("Text").click() sleep(2) buyConfirm = poco("lable").get_text() if buyConfirm == "Confirm to purchase": print("打开确认购买弹框成功") #取消购买 poco(text="Cancel").click() sleep(1) if not poco(text="Confirm to purchase").exists(): print("取消购买成功") #wn10001购买怪物成功 buy() #切换到钻石标签查看sdk调出 poco(text="Diamonds").click() sleep(1) if poco(text="Super Gems Pack").get_text() == "Super Gems Pack": print("切换钻石标签成功") buy() #完成测试 stop_app("com.gameholic.drawsomethingbyspider") sleep(2.0) snapshot(msg="app stopped") print("shop finish test")
def poco(request, driver_class): # connect_device() from poco.drivers.android.uiautomation import AndroidUiautomationPoco case_name = request.node._nodeid airtestlog = request.config.getoption("airtestlog") if airtestlog: split_path = request.module.__file__.split(PROJ_NAME) log_parentdir = split_path[0] + PROJ_NAME + '\\' + GL.REPORT_DIR if not os.path.exists(log_parentdir): os.mkdir(log_parentdir) jkbuildid = request.config.getoption("--jkbuildid") jkjobname = request.config.getoption("--jkjobname") if jkbuildid != -1 and jkjobname: logdir = os.path.join(log_parentdir, jkjobname) if not os.path.exists(logdir): os.mkdir(logdir) logdir = os.path.join(logdir, jkbuildid) if not os.path.exists(logdir): os.mkdir(logdir) else: logdir = log_parentdir #log_subdir = request.module.__name__+' '+request.function.__name__ logdir = os.path.join(logdir, request.module.__name__) if not os.path.exists(logdir): os.mkdir(logdir) logdir = os.path.join(logdir, request.function.__name__) if not os.path.exists(logdir): os.mkdir(logdir) print(' logdir: ', logdir) #request.logdir=logdir G.LOGGING.debug('logdir: %s' % logdir) set_logdir(logdir) airtesthtml = request.config.getoption("airtesthtml") if airtesthtml and airtestlog: from airtest.report.report import custom_report from airttest_settings import jk_server, static_server case_info = {"name": case_name, "desc": request.node.function.__doc__} if jkbuildid != -1 and jkjobname: #'http://xx.xx.x.x:8080/jenkins/job/JOBNAME/ws/report/JOBNAME/' print('jk jk_server: ', jk_server) #jk_logdir=logdir.split(PROJ_NAME)[1] #print('jk log dir: ',jk_logdir) #online_report=jk_server+'/job/'+jkjobname+'ws'+jk_logdir.replace('\\','/')+'/' online_path = jk_server + '/job/' + jkjobname + '/ws/' static_root = jk_server + '/job/' + jkjobname + '/ws/files/statics/' else: online_path = None static_root = None startapp = request.config.getoption("startapp") print('startapp: ', startapp) print('type(startapp): ', type(startapp)) if startapp == True or startapp == 'True': clear_app(APP_PACKAGE) print('conftest: start app') start_app(APP_PACKAGE) poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=True) yield poco #yield driver_class def dr_finalizer(): stopapp = request.config.getoption("stopapp") if stopapp == True or stopapp == 'True': stop_app(APP_PACKAGE) clear_app(APP_PACKAGE) print() print('conftest: stop app') if airtesthtml and airtestlog: custom_report(case_info, logdir, online_path=online_path, proj_name=PROJ_NAME, static_root=static_root) request.addfinalizer(dr_finalizer)
def startApp(self,package,device): if G.DEVICE == None: connect_device(device) print("start_app(package)") print(start_app(package))
def tests_runner(main_script, file_config): # читаем конфиг из config-файла package, data_config = read_data_from_config(file_config) gl_report = [] # на сколько я понял это каждый раз открывает новое соединение ''' # подключаемся к девайсу if run_on_emulator: # для эмулятора init_device(platform='Android', cap_method='JAVACAP', ori_method='ADBORI') else: # для девайса init_device(platform='Android') log('Init Device') ''' init_device(platform='Android') dev = device() poco = UnityPoco() # вроде всё готово для тестов: t0 = time.time(); out('Cases::tests_runner()... started') # выставляем значения по умолчанию потому что предыдущего теста не было last_test_stop_app = False need_wake = True # for line in data_csv: for line in data_config: # из config-файла test_id, f_wake, f_stop_before, f_clear_app, f_push_saves, \ f_start_app, f_stop_after = parse_line_from_config(line) if need_wake: f_wake = True need_wake = False if last_test_stop_app: f_stop_before = True f_start_app = True last_test_stop_app = False # создаём логирование log_path = 'report(' + test_id + ')' set_logdir(log_path) # пробуждаем устройство if f_wake: wake() # останавливаем приложение if f_stop_before: stop_app(package); time.sleep(1) # отчистить даные приложения if f_clear_app: clear_app(package) # подсовываем сэйвы if f_push_saves != '': push_my_saves(f_push_saves, package) # стартуем приложение if f_start_app: start_app(package) time.sleep(10) poco = UnityPoco() # запускаем тест tt0 = time.time(); result, runned = test_runner(dev, poco, test_id) dtt = time.time() - tt0 print('test: ' + test_id + '; ' + \ 'runned: ' + str(runned) + '; ' + \ 'result: ' + str(result) + '; ' + \ 'time(sec): ' + str(int(dtt))) print('-----------------------') if not result: last_test_stop_app = True f_stop_after = True gl_report.append([test_id, runned, result, dtt]) # останавливаем приложение if f_stop_after: last_test_stop_app = True stop_app(package) # далее обязательная секция чтобы сгенерить отчёт report_path = get_log_path(main_script, log_path) print(report_path) simple_report(main_script, report_path, output='report(' + test_id + ').html') t1 = time.time() out('Cases::tests_runner()... complete (' + str(t1 - t0) + ' sec)') # заключительный репорт gl_report log_path = 'report' set_logdir(log_path) for gl_data in gl_report: txt = gl_data[0] + ' ' prop = '' if not gl_data[1]: prop += 'тест не найден' else: txt += '(' + str(int(gl_data[3])) + ' sec)' if not gl_data[2]: prop += 'тест не пройден' out(txt, prop) # далее обязательная секция чтобы сгенерить отчёт report_path = get_log_path(main_script, log_path) print(report_path) simple_report(main_script, report_path, output='global_report.html')
def setUpClass(cls): super(CalculatorCase, cls).setUpClass() cls.package_name = 'com.google.android.calculator' apk_path = cls.R('res/app/com.google.android.calculator.apk') install_android_app(current_device().adb, apk_path) start_app(cls.package_name)
def test_my(self, ios_poco): """ 测试'我的' """ start_app(self.PACKAGENAME) self.page = MainPage(ios_poco) self.page.my() assert self.page.poco("立即登录")
def _start_app(self,package:Key, activity=None): ''' 启动指定app :return: ''' start_app(package.value, activity)
def init_app(package: str): if package_opened(package): stop_app(package) start_app(package)
def setUpModule(): connect_device("Android://127.0.0.1:5037/DA08196340368") start_app('com.caibaopay.cashier')