def case_music_favorite(self): self.case_if_music_base(True) time.sleep(1) if self.test.find_byclass(TextView, '歌曲', isText=True) is None: self.test.find_byacc(music_video_music_menu).click() time.sleep(0.2) self.test.find_list_byid(music_video_music_menu_title, '歌曲').click() time.sleep(1) tmp_int = random.randint(1, 8) test_name = f'music_{tmp_int}' self._find_music(test_name).click() time.sleep(1) self.test.find_byid(music_video_music_list_nowplay_icon).click() time.sleep(1) self.test.find_byid(music_video_music_list_song_name).click() time.sleep(1) self.test.find_byid(music_video_music_favorite).click() if self.test.if_toast_text('歌曲已添加到播放列表') is None: log('error', '添加到 收藏,未找到 toast') self.driver.press_keycode(4, 0, 0) time.sleep(1) self.test.find_byacc(music_video_music_menu).click() time.sleep(1) self.test.find_list_byid(music_video_music_menu_title, '播放列表').click() time.sleep(1) self._checK_play_list('我的收藏').click() time.sleep(1) tmp = self.test.find_byclass(TextView, test_name) if tmp is None: self.Case.fail(f'列表中没有音乐 {test_name}')
def case_record_and_save(self): """录音与保存文件""" if TestResult.getTestFail(self.failkey): self.Case.skipTest('case_if_base test fail,skip this') self.case_if_base() record = self.test.find_byid(record_recordbutton) if self.case_check_record_state() == 0: record.click() while self.test.wait_if_activity(Permissions_Activity, 5): self.test.find_byid(Permission_allow_button).click() time.sleep(3) log('info', f'开始录音') time.sleep(3) # 录音3s elif self.case_check_record_state() == 1: log('info', f'正在录音中') record_stop = self.test.find_byid(record_stopbutton) record_stop.click() time.sleep(3) record_name = self.test.find_byid(record_filename).text record_name = record_name + '.amr' record_save = self.test.find_byid(record_savebutton) record_save.click() time.sleep(3) file = self.test.find_list_byid(record_listfilename, record_name, True) self.Case.assertIsNotNone(file, '文件未保存')
def addFailure(self, test: unittest.case.TestCase, err: sys.exc_info()) -> None: """测试fail时调用""" global testFail case = self.getTestCase(test) try: log('error', f'{case} : : fail : : {err[1]}') except UnicodeEncodeError: pass if self.log_text is not None: self.log_text.insert( "insert", f'[{TimeUtils.strTime()}]{case} : : fail : : {err[1]}\n') self.log_text.see("insert") testFail.append(str(test)) self.testFail += 1 self.report.bug_report(case, log=err[1], result='FAIL', id=self.testsRun) Utils.save_logcat(case, Dvicer.get_log('logcat')) pkg = Dvicer.current_package if pkg != PKG: Dvicer.terminate_app(pkg) Dvicer.press_keycode(3, 0, 0)
def _send_AT(com_port, strAT='AT'): try: com_port.write(strAT.encode('utf-8') + b'\r\n') return True except (serial.SerialTimeoutException , serial.serialutil.SerialException) as error: log('ERROR',f'_send_AT : {error}') return False
def ExceptionApi(code, e): """ 接口异常处理 :param code: :param e: :return: """ exc_type, exc_value, exc_traceback = sys.exc_info() if DEBUG_LOG: # 文件形式 if SAVE_LOG == 1: log().exception(e) # 数据库形式 elif SAVE_LOG == 2: # 日志服务 LogService().add(e, 1, 3) body = {} body['error_code'] = code body['error'] = True body['show'] = False body['debug_id'] = Utils.unique_id() dbSession.close() body['trackback'] = traceback.format_exception(exc_type, exc_value, exc_traceback) return make_response(jsonify(body))
def addError(self, test: unittest.case.TestCase, err: sys.exc_info()) -> None: """测试用例出错时调用,一般是代码错误""" case = self.getTestCase(test) """""" "" tmp_list = traceback.format_tb(err[2]) tmp_log = '' for x in tmp_list: if 'TestCases' in x: tmp_log = x tmp_log = re.sub('\n', '', tmp_log) tmp_log = tmp_log.split(",") tmp_log = tmp_log[len(tmp_log) - 1] tmp_text = f'{err[1]}|-|{tmp_log}' """""" """""" log('error', f'{case} : : error : : {tmp_list}') if self.log_text is not None: self.log_text.insert( "insert", f'[{TimeUtils.strTime()}]{case} : : error : :{err[0]}::{err[1]}\n' ) self.log_text.see("insert") self.testError += 1 self.report.bug_report(case, log=tmp_text, result='ERROR', id=self.testsRun) Utils.save_logcat(case, Dvicer.get_log('logcat')) pkg = Dvicer.current_package if pkg != PKG: Dvicer.terminate_app(pkg) Dvicer.press_keycode(3, 0, 0)
def case_music_add_play_list(self): time_name = TimeUtils.str_HMS_Name() self.case_if_music_base(True) time.sleep(1) if self.test.find_byclass(TextView, '歌曲', isText=True) is None: self.test.find_byacc(music_video_music_menu).click() time.sleep(0.2) self.test.find_list_byid(music_video_music_menu_title, '歌曲').click() time.sleep(1) tmp_list = self.test.find_byid_list(music_video_music_indicator_list) tmp_int = random.randint(2, len(tmp_list) - 2) tmp_list[tmp_int].click() time.sleep(0.5) self.test.find_list_byid(ID_title, '添加到播放列表').click() time.sleep(0.5) self.test.find_list_byid(ID_title, '新建播放列表').click() time.sleep(0.5) tmp_el = self.test.find_byid(music_video_music_playlist_edit) tmp_el.clear() tmp_el.send_keys(f'list_{time_name}') self.test.find_byid(music_video_music_create_playlist).click() if self.test.if_toast_text('歌曲已添加到播放列表') is None: log('error', '添加到 收藏,未找到 toast') self.test.find_byacc(music_video_music_menu).click() time.sleep(1) self.test.find_list_byid(music_video_music_menu_title, '播放列表').click() time.sleep(1) self._checK_play_list(f'list_{time_name}').click() time.sleep(1) tmp = self.test.find_byclass(TextView, 'music_') if tmp is None: self.Case.fail('列表中没有音乐 {music_}')
def if_toast_text(self,text): toast = ('xpath',".//*[contains(@text,'"+text+"')]") try: return WebDriverWait(self.device,10,0.5).until(EC.presence_of_element_located(toast)) except (NoSuchElementException,TimeoutException) as err: log('error', f'if_toast_text {text} : {err}') return None
def check_element(self, element): """检查 元素是否显示/存在""" try: return element.is_displayed() except NoSuchElementException as err: log('error', f'check_element {element} : {err}') return False
def find_byid(self, element_str): """根据ID 寻找元素""" try: return self.device.find_element_by_id(element_str) except NoSuchElementException as err: log('error', f'find_byid {element_str} : {err}') return None
def open_Uart(com, baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=1): try: com_port = serial.Serial(com, baudrate, bytesize, parity, stopbits, timeout) return True , com_port except (serial.SerialException, ValueError) as error: log('ERROR',f'open_Uart : {error}') return False , None
def check_element_enabled(self, element): """检查 元素是否显示/存在""" if element is None: return False try: return element.is_enabled() except NoSuchElementException as err: log('error', f'check_element {element} : {err}') return False
def push_video_to_device(self): """ push 视频 到设备 """ for x in range(2): name = f'video_{x+1}.mp4' dest_path = f'/sdcard/{name}' data_path = f'{Utils.get_sys_path()}\\Resources\\{name}' try: with open(data_path,'rb') as f: data = f.read() self.device.push_file(dest_path, base64.b64encode(data).decode('utf-8')) except (IOError, WebDriverException) as err: log('ERROR',f'push_video_to_device : {err}')
def addSuccess(self, test: unittest.case.TestCase) -> None: """测试pass时调用""" case = self.getTestCase(test) log('info', f'{case} : : pass') if self.log_text is not None: self.log_text.insert("insert", f'[{TimeUtils.strTime()}]{case} : : pass\n') self.log_text.see("insert") self.testPass += 1 self.report.bug_report(case, log="*****", result='PASS', id=self.testsRun)
def find_list_byclass(self, element_str): """ 根据class寻找元素 :param element_str: 元素class名称 :return: 元素 list """ try: tmp = self.device.find_elements_by_class_name(element_str) if len(tmp) == 0: return None return tmp except NoSuchElementException as err: log('error',f'find_byclass {element_str} : {err}') return None
def cv_FileManager_A_CallBack(self): global is_select_FileManager_A if is_select_FileManager_A % 2 == 0: is_select_FileManager_A += 1 Utils.config_write('FileManager_A', True) log('info', 'FileManager_A test is_select') self.text.insert("insert", '文件管理器 测试已选择\n') self.text.see("insert") else: is_select_FileManager_A += 1 Utils.config_write('FileManager_A', False) log('info', 'FileManager_A test not_is_select') self.text.insert("insert", '文件管理器 测试未选择\n') self.text.see("insert")
def find_byid_list(self, element_str): """ 根据 同ID 的元素集合找到对应 text元素 :param element_str: 元素ID :return: 元素控件 list """ try: els = self.device.find_elements_by_id(element_str) if len(els) == 0: return None return els except NoSuchElementException as err: log('error', f'find_list_byid {element_str}: {err}') return None
def cv_camera_CallBack(self): global is_select_camera if is_select_camera % 2 == 0: is_select_camera += 1 Utils.config_write('CAMERA_A', True) log('info', 'camera A test is_select') self.text.insert("insert", '相机 测试已选择\n') self.text.see("insert") else: is_select_camera += 1 Utils.config_write('CAMERA_A', False) log('info', 'camera A test not_is_select') self.text.insert("insert", '相机 测试未选择\n') self.text.see("insert")
def cv_gallery_CallBack(self): global is_select_gallery if is_select_gallery % 2 == 0: is_select_gallery += 1 Utils.config_write('GALLERY_A', True) log('info', 'GALLERY A test is_select') self.text.insert("insert", '图库 测试已选择\n') self.text.see("insert") else: is_select_gallery += 1 Utils.config_write('GALLERY_A', False) log('info', 'GALLERY A test not_is_select') self.text.insert("insert", '图库 测试未选择\n') self.text.see("insert")
def cv_MESSAGING_CallBack(self): global is_select_MESSAGING if is_select_MESSAGING % 2 == 0: is_select_MESSAGING += 1 Utils.config_write('MESSAGING', True) log('info', 'MESSAGING test is_select') self.text.insert("insert", '短信 测试已选择\n') self.text.see("insert") else: is_select_MESSAGING += 1 Utils.config_write('MESSAGING', False) log('info', 'MESSAGING test not_is_select') self.text.insert("insert", '短息 测试未选择\n') self.text.see("insert")
def cv_SETTINGS_A_CallBack(self): global is_select_SETTINGS_A if is_select_SETTINGS_A % 2 == 0: is_select_SETTINGS_A += 1 Utils.config_write('SETTINGS_A', True) log('info', 'SETTINGS_A test is_select') self.text.insert("insert", '设置 测试已选择\n') self.text.see("insert") else: is_select_SETTINGS_A += 1 Utils.config_write('SETTINGS_A', False) log('info', 'SETTINGS_A test not_is_select') self.text.insert("insert", '设置 测试未选择\n') self.text.see("insert")
def cv_video_A_CallBack(self): global is_select_VIDEO_A if is_select_VIDEO_A % 2 == 0: is_select_VIDEO_A += 1 Utils.config_write('VIDEO_A', True) log('info', 'VIDEO_A test is_select') self.text.insert("insert", '视频 测试已选择\n') self.text.see("insert") else: is_select_VIDEO_A += 1 Utils.config_write('VIDEO_A', False) log('info', 'VIDEO_A test not_is_select') self.text.insert("insert", '视频 测试未选择\n') self.text.see("insert")
def select_d(self): global is_select_D if is_select_D % 2 == 0: is_select_D += 1 Utils.config_write('D', True) log('info', 'level D test is_select') self.text.insert("insert", '优先级 D 测试已选择\n') self.text.see("insert") else: is_select_D += 1 Utils.config_write('D', False) log('info', 'level D not_is_select') self.text.insert("insert", '优先级 D 测试未选择\n') self.text.see("insert")
def select_b(self): global is_select_B if is_select_B % 2 == 0: is_select_B += 1 Utils.config_write('B', True) log('info', 'level B test is_select') self.text.insert("insert", '优先级 B 测试已选择\n') self.text.see("insert") else: is_select_B += 1 Utils.config_write('B', False) log('info', 'level B test not_is_select') self.text.insert("insert", '优先级 B 测试未选择\n') self.text.see("insert")
def select_c(self): global is_select_C if is_select_C % 2 == 0: is_select_C += 1 Utils.config_write('C', True) log('info', 'level C test is_select') self.text.insert("insert", '优先级 C 测试已选择\n') self.text.see("insert") else: is_select_C += 1 Utils.config_write('C', False) log('info', 'level C not_is_select') self.text.insert("insert", '优先级 C 测试未选择\n') self.text.see("insert")
def cv_Music_A_CallBack(self): global is_select_Music_A if is_select_Music_A % 2 == 0: is_select_Music_A += 1 Utils.config_write('MUSIC_A', True) log('info', 'MUSIC_A test is_select') self.text.insert("insert", '音乐 测试已选择\n') self.text.see("insert") else: is_select_Music_A += 1 Utils.config_write('MUSIC_A', False) log('info', 'MUSIC_A test not_is_select') self.text.insert("insert", '音乐 测试未选择\n') self.text.see("insert")
def select_a(self): global is_select_A if is_select_A % 2 == 0: is_select_A += 1 Utils.config_write('A', True) log('info', 'level A test is_select') self.text.insert("insert", '优先级 A 测试已选择\n') self.text.see("insert") else: is_select_A += 1 Utils.config_write('A', False) log('info', 'level A test not_is_select') self.text.insert("insert", '优先级 A 测试未选择\n') self.text.see("insert")
def addSkip(self, test: unittest.case.TestCase, reason: str) -> None: """跳过的测试时调用""" case = self.getTestCase(test) log('debug', f'{case} : : skip: : {reason}') if self.log_text is not None: self.log_text.insert( "insert", f'[{TimeUtils.strTime()}]{case} : : skip: : {reason}\n') self.log_text.see("insert") self.testSkip += 1 self.report.bug_report(case, log=reason, result='SKIP', id=self.testsRun) #Dvicer.terminate_app(Dvicer.current_package) Dvicer.press_keycode(3, 0, 0)
def find_byacc(self, element_str): """ 根据 accessibility_id 寻找元素 :param element_str: 元素 accessibility_id :return: 元素控件 """ for x in range(3): try: el = self.device.find_element_by_accessibility_id(element_str) if self.check_element(el): return el else: time.sleep(1) except NoSuchElementException as err: log('error', f'find_byacc {element_str} : {err}') return None return None
def find_number_byid(self, element_str ,keytext): """ 根据 同ID 的元素集合找到对应 text元素 :param element_str: 元素ID :param keytext: 元素 text :return: 该控件存在的数量 """ tmp = 0 try: els = self.device.find_elements_by_id(element_str) except NoSuchElementException as err: log('error', f'find_list_byid {element_str} {keytext}: {err}') return tmp for el in els: if keytext in el.text: tmp += 1 return tmp