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
Example #2
0
 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
Example #3
0
 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
Example #4
0
 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
Example #5
0
 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
Example #6
0
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
Example #7
0
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
Example #8
0
 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
Example #9
0
 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