def send_specific_keys(self, *args): keys_set = set() redundant_keys = [ 'BACK_SPACE', 'LEFT_SHIFT', 'LEFT_CONTROL', 'LEFT_ALT', 'ARROW_LEFT', 'ARROW_UP', 'ARROW_RIGHT', 'ARROW_DOWN' ] try: keys_mapping = dict( filter(lambda d: d[0] not in redundant_keys, Keys.__dict__.items())) for arg in args: pattern = re.compile(arg, re.IGNORECASE) for attr in keys_mapping: result = re.search(pattern, attr) if result: keys_set.add(attr) if keys_set: self.driver.send_keys(*keys_set) logger.debug( '[Call]: KeyActions >> send_specific_keys >> {0}'.format( ' + '.join(keys_set))) else: self.driver.send_keys('') logger.warning( '[Call]: KeyActions >> send_specific_keys >> empty content' ) except WebDriverException as e: exc_type, _, _ = sys.exc_info() logger.error('[{0}]: {1}'.format(exc_type.__name__, e).rstrip()) raise except Exception: logger.exception('[UnwantedException]:') raise
def on_call(*args, **kwargs): _cls_name = args[0].__class__.__name__ _met_name = func.__name__ _element_name = args[0].name try: result = func(*args, **kwargs) if result is not None: logger.debug( '[Call]: {0} >> {1} >> {2} [Return]: {3}'.format( _cls_name, _met_name, _element_name, result)) else: logger.debug('[Call]: {0} >> {1} >> {2}'.format( _cls_name, _met_name, _element_name)) return result except NoSuchElementException: logger.error( '[NoSuchElementException]: Fail to locate element {0}'. format(_element_name)) except WebDriverException as e: exc_type, _, _ = sys.exc_info() logger.error('[{0}]: {1}'.format(exc_type.__name__, e).rstrip()) raise except Exception: logger.exception('[UnwantedException]:') raise
def __init__(self): try: with open(TEST_DATA_FILE_PATH, 'r', encoding='utf-8') as f: self.data = list(csv.reader(f)) except Exception as e: logger.error('Fail to parse TestData: {0}'.format(e)) raise e
def create_new_sheet(self, new_sheet_name="new_sheet"): try: self.workbook.create_sheet(new_sheet_name) self.workbook.save(self.excel_file_path) except Exception as e: logger.error("Fail to create new sheet: {0}".format(e)[:-1]) raise e
def wrapper(*args, **kwargs): try: result = func(*args, **kwargs) logger.debug('Parse "{0}", get config value "{1}"'.format(func.__name__, result)) return result except Exception as e: logger.error('Fail to parse "{0}": {1}'.format(func.__name__, e)) raise e
def integrate_results(): try: init_backup_folders() if os.path.exists(RESULTS_LOGS_DIR): backup_results("log", RESULTS_LOGS_DIR, backup_logs_path) if os.path.exists(RESULTS_REPORTS_DIR): backup_results("html", RESULTS_REPORTS_DIR, backup_reports_path) if os.path.exists(RESULTS_SCREENSHOTS_DIR): backup_results("png", RESULTS_SCREENSHOTS_DIR, backup_screenshots_path) init_results_folders() except Exception as e: logger.error("Fail to integrate former results: {0}".format(e)) raise e
def make_test_suite(): """ 利用测试集生成PUnittest能识别的TestSuite对象 :return: TestSuite对象 """ test_suite = unittest.TestSuite() # 将原始的测试集做处理,去除CaseParameters字段后再去重,获取真实的测试集, # 这样可以排除DDT参数导致测试集膨胀的问题,DDT模块里会根据该真实测试集和DDT参数, # 重新生成新的测试套件TestSuite test_set = [] for test_case in TEST_SET: # 新生成一份用例字典而不是对原始用例字典进行修改是为了保证TEST_SET的常量属性 _test_case = { k: v for k, v in test_case.items() if k != "CaseParameters" } if _test_case not in test_set: test_set.append(_test_case) if len(test_set) > 0: for test_case in test_set: _dir_name = test_case['TestDir'] if 'TestDir' in test_case else None _file_name = test_case[ 'TestFile'] if 'TestFile' in test_case else None _cls_name = test_case[ 'TestClass'] if 'TestClass' in test_case else None _case_name = test_case[ 'TestCase'] if 'TestCase' in test_case else None try: package = import_module('TestFramework.{0}.{1}'.format( _dir_name, _file_name)) # 加载测试模块,间接加载DDT模块 cls = getattr(package, _cls_name) # 加载测试类 for name, func in list( cls.__dict__.items()): # 遍历测试类中的测试方法(测试用例) _name = re.sub(r'_#.*', '', name) # 将DDT改变后的测试方法名称改成原始测试方法名称 if _name == _case_name: # 如果测试方法名称符合测试集中的名称 case = cls(name) # 获取测试套件中测试用例对象 test_suite.addTest(case) # 将测试用例对象加入测试套件 except Exception as e: logger.warning( 'Fail to load test case <{0}><{1}><{2}>: {3}'.format( _file_name, _cls_name, _case_name, e)) else: logger.error('Fail to load any test case, please check') return test_suite
def on_call(*args, **kwargs): _cls_name = args[0].__class__.__name__ _met_name = func.__name__ try: result = func(*args, **kwargs) _result = True if result else False logger.debug('[Call]: {0} >> {1} [Return]: {2}'.format( _cls_name, _met_name, _result)) return result except TimeoutException as e: logger.warning('[TimeoutException]: {0}'.format(e).rstrip()) except WebDriverException as e: exc_type, _, _ = sys.exc_info() logger.error('[{0}]: {1}'.format(exc_type.__name__, e).rstrip()) raise except Exception: logger.exception('[UnwantedException]:') raise
def on_call(*args, **kwargs): # 失败重跑次数 if rerun is False: rerun_time = 1 elif isinstance(rerun, int): rerun_time = rerun else: rerun_time = 3 # _browser是获取测试用例实例的browser属性,因为跨越了xxxPage属性层,所以用到了循环 _testcase_name = args[0]._testMethodName _testclass_name = args[0].__class__.__name__ _browser = None for attr in dir(args[0]): if hasattr(getattr(args[0], attr), 'browser'): _browser = getattr(getattr(args[0], attr), 'browser') break # 循环执行测试用例 _rerun_time = rerun_time while rerun_time > 0: try: logger.info( (' TestRunNo: >> {0} '.format(_rerun_time - rerun_time + 1)).center( 100, '-')) result = func(*args, **kwargs) # 用例执行完毕抛出所有可能存在的AssertionError异常 args[0].raise_exc() logger.info(' TestResult: '.center(100, '-')) logger.info('[TestSuccess]: {0} >> {1} '.format( _testclass_name, _testcase_name)) return result except Exception: if screenshot: _filename = 'Error_' + _testcase_name _browser.take_screenshot(_filename) rerun_time -= 1 if rerun_time == 0: exc_type, exc_msg, _ = sys.exc_info() logger.info(' TestResult: '.center(100, '-')) logger.error('[TestFail]: {0}: {1}'.format( exc_type.__name__, exc_msg)) raise
def launch_local_browser(self, local_browser_name=BROWSER_NAME, window_size=BROWSER_WINDOW_SIZE, implicity_wait_timeout=IMPLICITY_WAIT_TIME): """启动本地浏览器""" try: # 初始化浏览器 if BROWSER_NAME in ["Chrome", "chrome", "CHORME"]: logger.info("Launch {0} browser".format(local_browser_name)) self.driver = webdriver.Chrome(CHROME_DRIVER_PATH) elif BROWSER_NAME in ["Firefox", "firefox", "FIREFOX", "FireFox"]: logger.info("Launch {0} browser".format(local_browser_name)) self.driver = webdriver.Firefox() elif BROWSER_NAME in ["Ie", "ie", "IE"]: logger.info("Launch {0} browser".format(local_browser_name)) self.driver = webdriver.Ie(IE_DRIVER_PATH) else: raise NameError # 设定浏览器尺寸 if window_size in ["Max", "max", "MAX"]: logger.info("Maximize browser") self.driver.maximize_window() elif window_size in ["Min", "min", "MIN"]: logger.info("Minimize browser") self.driver.minimize_window() # 设定隐式等待时间 logger.info("Set implicity wait time to {0}".format( str(implicity_wait_timeout))) self.driver.implicitly_wait(implicity_wait_timeout) return self.driver except NameError: logger.error( "Fail to launch browser due to incorrect browser name: {0}". format(BROWSER_NAME)) raise except WebDriverException as e: logger.error("Fail to launch browser: {0}".format(e)) raise e except Exception: logger.exception("Fail to launch browser", exc_info=True) raise
def launch_remote_browser(self, _command_executor, _desired_capabilities, implicity_wait_timeout=IMPLICITY_WAIT_TIME): """ 启动远程浏览器 :param _command_executor: 远程server地址,如 "http://192.168.98.106:5555/wd/hub" :param _desired_capabilities: 调用webdriver的DesiredCapabilities的模板 :param implicity_wait_timeout: 隐式等待时间 :return: self.driver """ logger.info("Launch remote browser") try: self.driver = webdriver.Remote(command_executor=_command_executor, desired_capabilities=_desired_capabilities) logger.info("Maximize browser") self.driver.maximize_window() logger.info("Set implicity wait time to {0}".format(str(implicity_wait_timeout))) self.driver.implicitly_wait(implicity_wait_timeout) return self.driver except WebDriverException as e: logger.error("Fail to launch browser: {0}".format(str(e))) raise e except Exception: logger.exception("Fail to launch browser", exc_info=True) raise
_test_case_list = filter(lambda x: x[0] == testCasePriority, _test_case_list) _test_case_list = list(_test_case_list) try: test_set = unittest.TestSuite() for case in _test_case_list: # 根据文件名字符串导入相应的包 package = import_module('TestSuite.{0}'.format(case[1])) # 根据包生成相应的类对象 class_obj = getattr(package, case[2]) # 根据类对象获取相应的测试用例 if case[3] in class_obj.__dict__: _case = class_obj(case[3]) # 将测试用例添加入测试套件 test_set.addTest(_case) else: # 专门处理ddt改变method name的情况,将ddt分类过的test method依次加入test_set for attr in class_obj.__dict__: if attr.startswith(case[3]): _case = class_obj(attr) test_set.addTest(_case) return test_set except Exception as e: logger.error("[Exception]: Make Test Suite Error: {0}".format(e)) raise e if __name__ == '__main__': pass