def get_Elements(self, section, key, efg, index): """@note:获取配置文件中的页面元素,@section:元素模块,@key:元素id,name,classname,xpath,@efg:页面元素,@index:元素索引,@return 返回找到的元素集合""" data = efg.Read_config(section, key) by = data.split('>')[0] value = data.split('>')[1] logger.info("locate by:[" + by + "] value:[" + value + '] is number ' + str(index + 1)) try: if by == 'id': return WebDriverWait( self.driver, 10).until(lambda x: x.find_elements_by_id(value)[index]) elif by == 'name': return WebDriverWait( self.driver, 10).until(lambda x: x.find_elements_by_name(value)[index]) elif by == 'classname': return WebDriverWait(self.driver, 10).until( lambda x: x.find_elements_by_class_name(value)[index]) else: return WebDriverWait( self.driver, 10).until(lambda x: x.find_elements_by_xpath(value)[index]) except Exception: raise
def run(suite): report = '' test_description = "<p>[ORACLE 数据库]</p><p style='text-indent:0.5'><strong>DB_Connection:</strong> {}</p> " \ "<p style='text-indent:0.5'><strong>DB_User:</strong> {}</p> " \ "<strong><p style='text-indent:0.5'>DB_Password:</strong> {}</p> " \ "<br><p>[接口]</p> <p style='text-indent:0.5'><strong>Api:</strong> {}</p> " \ "<p style='text-indent:0.5'><strong>Api_Key:</strong> {}</p>"\ .format(database_connection_url, database_user, database_password, api_url, api_key) cur_time = time.strftime('%Y%m%d_%H%M%S', time.localtime()) if report_path is '' or report_path is None: project_path = cur_path() mkdir(os.path.join(project_path, 'report')) report = os.path.join( project_path, 'report', 'ESPOS82_Promotion_AutoTest_{}.html'.format(cur_time)) elif not report_path.endswith('.html'): logger.info( 'report path: {}配置有误,正确格式如: D:\\report.html'.format(report_path)) return else: report = re.sub(r'\.html', '_{}.html'.format(cur_time), report_path) with open(report, 'wb') as fp: HTMLTestRunner(stream=fp, verbosity=2, title="测试报告", description="", test_description=test_description).run(suite)
def setUp(self): logger.info('Test case running...') self.driver = setDriver() self.busiNess = LoginBusiness(self.driver) self.baseFunc = BaseOperation(self.driver) self.imgs = [] self.busiNess.openWeb()
def assemble(self): """ according to different params to find self method to control """ self_json = self.unit.base() if 'param_bc' in self.common_params and 'param_bx' in self.common_params: self.common_params.remove('param_bx') self.common_params.remove('param_bc') self.common_params.append('param_bc_bx') elif 'param_bc' in self.common_params: pass elif 'param_bx' in self.common_params: self.common_params.remove('param_bx') for param in self.common_params: if hasattr(self.unit, param): func = getattr(self.unit, param) self_json = func(self_json) else: param = param.upper() param = param.replace('PARAM_', '-') self.cls._testMethodDoc += "<br><font color='red' style='font-weight:bold'>confit.ini 中 " \ "本程序没有提供对该参数 {} 的处理</font>".format(param) self.cls.skipTest('本程序没有提供对该参数 {} 的处理'.format(param)) if 'param_bc_bx' in self.common_params: self.common_params.remove('param_bc_bx') self_json = json_dumps(self_json, indent=4) logger.info('REQUEST:\n {}'.format(self_json)) return self_json
def send_email(): """执行发送邮件""" report_path = os.path.dirname(os.path.dirname(__file__)) + '/report/' report_name = new_report(report_path) try: pre_send_mail(report_name) logger.info("自动化测试执行完成,邮件发送成功") except Exception as e: logger.info("邮件发送失败!" + e)
def is_exist(self, method, exp): """@note: 判断元素是否存在, @method:定位方法, @exp:元素路径或名称""" try: self.driver.find_element(by=method, value=exp) logger.info('查找到%s元素' % exp) except NoSuchElementException: logger.info('未找到%s元素' % exp) return False else: return True
def save_csv_data(self, filename, data): """保存数据到.csv文件中""" path = os.path.dirname(os.path.dirname(__file__)) data_path = path + '/data/' + filename logger.info('写入数据到%s中' % filename) with open(data_path, 'w', encoding='utf-8', newline='') as p: csv_write = csv.writer(p) for i in data: csv_write.writerow(i) logger.info('数据保存成功')
def get_csv_data(self, filename, line): """读取.csv文件中的数据""" path = os.path.dirname(os.path.dirname(__file__)) data_path = path + '/data/' + filename logger.info('读取%s中的测试数据' % filename) with open(data_path, 'r', encoding='utf-8') as p: reader = csv.reader(p) for index, row in enumerate(reader, 1): if index == line: return row
def test_03_login_pwd_error(self): """输入错误的密码登录系统""" try: self.busiNess.loginAction(3) time.sleep(2) assert self.baseFunc.readNotice() == '密码错误' assert self.baseFunc.is_exist('name', 'user') == True logger.info('Test case 03 pass') except AssertionError as e: self.imgs.append(self.driver.get_screenshot_as_base64()) logger.info('Test case 03 fail' + e) raise
def loginAction(self, line): """登录的操作""" data = self.get_csv_data('testLogin.csv', line) account = self.get_element('loginView', 'user', self.efg) pwd = self.get_element('loginView', 'pwd', self.efg) account.clear() account.send_keys(data[0]) logger.info('输入测试数据' + data[0]) pwd.clear() pwd.send_keys(data[1]) logger.info('输入测试数据' + data[1]) self.get_element('loginView', 'button', self.efg).click()
def scoll(self, element, index=None): """@note:滚动页面, @path:滚动时参考的元素,路径或者元素对象,@index:up 元素在最上,down 元素在最下""" if index == 'up': self.driver.execute_script("arguments[0].scrollIntoView(true);", element) elif index == 'down': self.driver.execute_script("arguments[0].scrollIntoView(false);", element) else: self.driver.execute_script("arguments[0].scrollIntoView();", element) logger.info('页面滚动到选中元素位置')
def test_01_user_login(self): """输入正确的信息登录系统""" try: self.busiNess.loginAction(1) time.sleep(2) assert self.baseFunc.readNotice() == '登录成功' time.sleep(2) assert self.baseFunc.is_exist('name', 'user') == False logger.info('Test case 01 pass') except AssertionError as e: self.imgs.append(self.driver.get_screenshot_as_base64()) logger.info('Test case 01 fail' + e) raise
def test_all(self): """ @note:执行testSuite目录下以test开头的测试用例 """ # 执行用例路径 logger.info('') base_path = os.path.dirname(os.path.dirname(__file__)) case_path = os.path.join(base_path, "testSuite") suite = unittest.defaultTestLoader.discover(case_path, 'test*.py') # 写入测试报告 # report_name = "Report_" + datetime.datetime.now().strftime("%Y-%m-%d") + ".html" report_name = "JC_AutoTest_Report.html" file_path = os.path.join(base_path + "/report/" + report_name) report_title = "自动化测试报告" with open(file_path, 'wb') as test_report: runner = HTMLTestRunner_Chart.HTMLTestRunner(stream=test_report, title=report_title, verbosity=2, retry=0, save_last_try=True) runner.run(suite)
def loop_query(ip, pause_second, force_loop): """ 轮训 """ if api.connect(ip, 7709): logger.info("connected. ip=%s, pause_second=%ss start loop query " % (ip, pause_second)) while True: # 非强制模型下(正常情况),不是交易时间停止查询 if force_loop is False and is_trading_hour() is False: time.sleep(10) return execute_query(api) time.sleep(pause_second) api.disconnect() logger.info("disconnected... ") else: logger.info("connect %s failed." % ip)
def execute_query(api): """ 执行查询 :param api: :return: """ logger.info("get_security_quotes start ") start = time.time() data = api.get_security_quotes([(0, '000001'), (1, '600300')]) end = time.time() logger.info("get_security_quotes finished, cost=" + str(int((end - start) * 1000)) + "ms") data_df = api.to_df(data) display_columns = [ 'code', 'reversed_bytes0', 'active1', 'price', 'last_close', ] logger.info("\r\n" + str(data_df[display_columns]))
time.sleep(pause_second) api.disconnect() logger.info("disconnected... ") else: logger.info("connect %s failed." % ip) if __name__ == '__main__': ip = '119.147.212.81' # 默认轮训服务器地址 second = 0.5 # 500ms一次轮训 force_loop = False # 非强制查询的时候会在停盘期间停止轮训 opts, args = getopt.getopt(sys.argv[1:], '-i:-s:-f') for opt_name, opt_value in opts: if opt_name == '-i': ip = opt_value if opt_name == '-s': second = int(opt_value) if opt_name == '-f': force_loop = True while True: try: logger.info("start loop query") loop_query(ip, second, force_loop) time.sleep(1) logger.info("finish loop query") except Exception as e: logger.error("something wrong...", e)
def test_demo(cls, testcaseid): testcase_sql = "select * from testcase where testcaseid = '{}' order by serialno".format( testcaseid) testcase = oracle.dict_fetchall(testcase_sql) testcase_desci = '<font style="font-weight:bold">[CASE DESCRIPTION]:' + ' ' * 2 + '</font>' promparam_desci = '<font style="font-weight:bold">[PROMPARAMETER]:' + ' ' * 2 + '</font>' promid_desci = '<font style="font-weight:bold">[PROMID DESCRIPTION]:' + ' ' * 2 + '</font>' remarks = "<font style='font-weight:bold'>[REMARK]:</font>  " \ "<font color='CC0066' style='font-weight:bold'>" caseid = '' casedesci_count = 0 remarks_count = 0 if prom_param == '': prom_param_ = 'BC,BX' else: prom_param_ = prom_param + ',BC,BX' for i, case in enumerate(testcase): if case['TESTCASEDESCI'] is not None and case[ 'TESTCASEDESCI'] != '': if casedesci_count == 0: testcase_desci += case['TESTCASEDESCI'] casedesci_count += 1 if case['REMARKS'] is not None and case['REMARKS'] != '': if remarks_count == 0: remarks += case['REMARKS'] remarks_count += 1 casedesci_count += 1 if case['PROMPARAMETER'] is not None and case[ 'PROMPARAMETER'] != '': promparam_desci += case['PROMPARAMETER'] + ';  ' if case['PROMLESSDETAIL'] is None: caseid = 'None' else: caseid = re.sub(r'=\d+[.]?\d*', '', case['PROMLESSDETAIL']) if i == len(testcase) - 1: promid_desci += 'ITEMCODE={}, PROMIDS={}'.format( case['ITEMCODE'], caseid) else: promid_desci = promid_desci + 'ITEMCODE={}, PROMIDS={}  ||   '\ .format(case['ITEMCODE'], caseid) space = ' ' * 41 remarks = '{}</font>'.format(remarks) testcase_desci = """{}<br>{} ;<br>{}<br>{}""".format( promid_desci, testcase_desci, promparam_desci, remarks) cls._testMethodDoc = testcase_desci if only_test_caseids != '': only_test_case(cls, testcaseid, only_test_caseids, cls._testMethodDoc) elif skip_caseids != '': exclude_case(cls, testcaseid, skip_caseids) # TODO START CHANGE # to extract common promtion param list _promless_detail = {} prom_param_list = [] tmp = [] for case in testcase: if case['PROMLESSDETAIL'] != None: tmp.append(case['PROMLESSDETAIL']) promless_str = ','.join(tmp) # _promless_detail['PROMLESSDETAIL'] = promless_str tmp = to_dict(cls, 'PROMLESSDETAIL', promless_str) if tmp is not None: promids = list(tmp.keys()) prom_param_list = param_extractors(promids, prom_param_) else: if prom_param_list == []: if 'PROMPARAMETER' in testcase[0]: promparam_str = '' for case in testcase: if case['PROMPARAMETER'] is None: pass elif case['PROMPARAMETER'].strip() == '': pass else: promparam_str += case['PROMPARAMETER'] prom_param_list = param_extractor(promparam_str, prom_param_) exclude_param_case(cls, exclude_promparam, prom_param_list) # TODO END # add description for testcase # TODO 增加 promparam description # promparam_desci = '' # if 'PROMPARAMETER' in testcase[0]: # for desci in testcase: # if desci is not None or desci.stirp() != '': # promparam_desci = desci['PROMPARAMETER'] # testcase_desci = """{} ;<br>【PROMPARAMETER】: {}""".format(testcase_desci, promparam_desci) # # testcase_desci = """{} ;""".format(testcase_desci) # cls._testMethodDoc = testcase_desci # assemble a complete request json assembler = Assembler(cls, testcase, prom_param_list) request_json = assembler.assemble() res = cls.requester.post(request_json) response = '' if res.status_code != 200: cls.fail('【 response status_code :{}, response text: {} 】'.format( res.status_code, res.text)) try: response = json.dumps(json.loads(res.text), indent=4, ensure_ascii=False) except Exception: cls.fail('【Response】: {}'.format(res.text)) logger.info('================================================') logger.info('RESPONSE:\n {}'.format(response)) checker = Checker(cls) checker.check(testcaseid, response, prom_param_list)
def closeWindow(self): """关闭系统窗口""" self.driver.close() self.driver.quit() logger.info('Test case finished, system close...')
def OpenSystem(self): """AW: 登录系统""" try: efg = ReadIni(file_name='loginView.ini') url = self.cfg.Read_config('ALL_URL', 'test_url') user = self.cfg.Read_config('test_account', 'user_name') pd = self.cfg.Read_config('test_account', 'pass_word') self.driver.get(url) self.driver.maximize_window() account = self.get_element('loginView', 'user', efg) pwd = self.get_element('loginView', 'pwd', efg) account.clear() account.send_keys(user) logger.info('输入账号信息') pwd.clear() pwd.send_keys(pd) logger.info('输入密码信息') self.get_element('loginView', 'button', efg).click() time.sleep(5) try: self.closeNotice() time.sleep(3) logger.info('关闭公告弹窗') logger.info('成功登陆系统') except: logger.info('无弹窗,成功登陆系统') except Exception as e: logger.info('系统登陆失败' + e)