def appRank(): driver = webdriver.Remote('http://localhost:4723/wd/hub', getDesiredcaps()) try: excelObj = ParseExcel() excelObj.loadWorkBook(dataFilePath) appRankSheet = excelObj.getSheetByName("应用") isExecute = excelObj.getColumn(appRankSheet, app_isExecute) appRankStringCols = excelObj.getColumn(appRankSheet, app_assertKeyWord) for idx, i in enumerate(isExecute[1:]): appRankString = appRankStringCols[idx + 1].value logger.info("----------应用排行“{}”开始执行".format(appRankString)) if i.value == 'y': try: AppRankAction.appRank(driver, appRankString) except Exception as e: excelObj.writeCellCurrentTime(appRankSheet, rowNo=idx + 2, colsNo=app_runTime, style="red") excelObj.writeCell(appRankSheet, "Faild", rowNo=idx + 2, colsNo=app_testResult, style="red") logger.error( "在“应用”模块,断言排列前三的APP“{}”失败\n异常信息:{}".format(appRankString, traceback.format_exc())) else: excelObj.writeCellCurrentTime(appRankSheet, rowNo=idx + 2, colsNo=app_runTime, style="green") excelObj.writeCell(appRankSheet, "Pass", rowNo=idx + 2, colsNo=app_testResult, style="green") logger.info("在“应用”模块,断言排列前三的APP“{}”成功".format(appRankString)) else: excelObj.writeCell(appRankSheet, "", rowNo=idx + 2, colsNo=app_runTime, ) excelObj.writeCell(appRankSheet, "", rowNo=idx + 2, colsNo=app_testResult) logger.info("排列前三的用例“{}”被忽略执行".format(appRankString)) except Exception as e: logger.error("数据驱动框架主程序发生异常\n异常信息:{}".format(traceback.format_exc())) finally: driver.quit()
def calc_lens_sf(data): length = int(len(data) / 2) if length < 128: length = num2big(length, 1) elif 127 <= length < 16256: quotient = length // 128 remainder = length % 128 length = num2big(remainder | 0x80, 1) + num2big(quotient, 1) elif 16256 <= length < 2097152: quotient1 = (length // 128) // 128 quotient2 = (length // 128) % 128 quotient2 = 0x80 | quotient2 remainder = length % 128 length = num2big(remainder | 0x80, 1) + num2big( quotient2, 1) + num2big(quotient1, 1) elif 2019152 <= length <= 268435455: quotient1 = ((length // 128) // 128) // 128 quotient2 = (length // 128) // 128 quotient2 = 0x80 | quotient2 quotient3 = (length // 128) % 128 quotient3 = 0x80 | quotient3 remainder = length % 128 length = num2big(remainder | 0x80, 1) + num2big( quotient3, 1) + num2big(quotient2, 1) + num2big(quotient1, 1) else: logger.error('长度范围超出。') return length
def parseLoadTestConfig(): # 获取配置文件中执行的用例的函数名 # 规则自行定义 allTestFunsList = getTestFunNames() testCaseFunList = [] executeTestCaseFuns = [] with open(loadTestConfigFilePath,encoding="utf-8") as fp: lines = fp.readlines() for line in lines: if line.strip() and (not line.strip().startswith("#")): if line.strip() == "*": testCaseFunList += allTestFunsList break else: testCaseFunList.append(line.strip()) testCaseFunList = list(set(testCaseFunList)) if "*" in testCaseFunList: return allTestFunsList else: for fun in testCaseFunList: if fun in allTestFunsList: executeTestCaseFuns.append(fun) else: logger.error("需要执行的用例函数名“{}”配置错误".format(fun)) return executeTestCaseFuns
def handle(self): time.sleep(0.5) address, port = self.client_address logger.debug('【 Data Server 】 Connected by {} {} ...'.format(address, port)) TCPRequestHandler.isAlive = True logger.debug('【 Data Server 】 Producer Thread Start ...') send_thread = SendData('【 Data Server 】 Send Thread Start ...', self) send_thread.setDaemon(True) send_thread.start() if conf.get_protocol_type() == 1: if conf.get_sync_flag(): from Util.Sync_SU import SyncThread sync_thread = SyncThread('【 Data Server 】 Sync Thread Start ...', self) sync_thread.setDaemon(True) sync_thread.start() global fetch_media_flag fetch_media_flag = True elif conf.get_protocol_type() == 5: dog_thread = DogThread('【 Data Server 】 Dog Thread Start ...', self) dog_thread.setDaemon(True) dog_thread.start() while True: try: buf = b'' if self.remain: self.remain = ParseData.produce(buf, self.remain) try: buf = self.request.recv(1024) except TimeoutError: self.isAlive = False time.sleep(0.3) logger.debug('【 Data Server 】 Receiving ack timeout,connection is interrupted.') except ConnectionResetError: self.isAlive = False time.sleep(0.3) logger.debug('【 Data Server 】 ConnectionResetError,connection is interrupted.') except ConnectionAbortedError: self.isAlive = False time.sleep(0.3) logger.debug('【 Data Server 】 ConnectionAbortedError,connection is interrupted.') except Exception as e: logger.error('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') logger.error(e) except socket.timeout: self.isAlive = False time.sleep(0.3) logger.debug('【 Data Server 】 Receiving data timeout,connection is interrupted.') break if not buf: self.isAlive = False time.sleep(0.3) logger.debug('【 Data Server 】 Receive empty data,connection is interrupted.') break self.remain = ParseData.produce(buf, self.remain) time.sleep(0.001)
def searchApp(): driver = webdriver.Remote('http://localhost:4723/wd/hub', getDesiredcaps()) try: excelObj = ParseExcel() excelObj.loadWorkBook(dataFilePath) searchSheet = excelObj.getSheetByName("搜索") isExecute = excelObj.getColumn(searchSheet, search_isExecute) searchKeyWordCols = excelObj.getColumn(searchSheet, search_searchKeyWord) for idx, i in enumerate(isExecute[1:]): searchKeyWord = searchKeyWordCols[idx + 1].value logger.info("----------搜索APP“{}”开始执行".format(searchKeyWord)) if i.value == 'y': searchRow = excelObj.getRow(searchSheet, idx + 2) assertKeyWord = searchRow[search_assertKeyWord - 1].value try: SearchAction.search(driver, searchKeyWord, assertKeyWord) except Exception as e: excelObj.writeCellCurrentTime(searchSheet, rowNo=idx + 2, colsNo=search_runTime, style="red") excelObj.writeCell(searchSheet, "Faild", rowNo=idx + 2, colsNo=search_testResult, style="red") logger.error("搜索APP“{}”失败\n异常信息:{}".format( searchKeyWord, traceback.format_exc())) else: excelObj.writeCellCurrentTime(searchSheet, rowNo=idx + 2, colsNo=search_runTime, style="green") excelObj.writeCell(searchSheet, "Pass", rowNo=idx + 2, colsNo=search_testResult, style="green") logger.info("搜索APP“{}”成功".format(searchKeyWord)) else: excelObj.writeCell( searchSheet, "", rowNo=idx + 2, colsNo=search_runTime, ) excelObj.writeCell(searchSheet, "", rowNo=idx + 2, colsNo=search_testResult) logger.info("搜索APP“{}”的用例被忽略执行".format(searchKeyWord)) except Exception as e: logger.error("数据驱动框架主程序发生异常\n异常信息:{}" % (traceback.format_exc())) finally: driver.quit()
def small2num(para_length): length = '' for i in range(len(para_length), 0, -2): length += para_length[i - 2:i] try: length = int(length, 16) return length except ValueError: logger.error('十六进制转整型数据出错。')
def find_element(self, selctor): """ 这个地方为什么根据=>来切割字符串,请看页面里定位元素的方法 如果采用等号,结果很多xpath表达式中包含一个=,这样会造成切割不准确,影响元素定位 :param selctor: :return: """ element = '' if '=>' not in selctor: return self.driver.find_element_by_id(selctor) selctor_by = selctor.split('=>')[0] selctor_value = selctor.split('=>')[1] if selctor_by == "i" or selctor_by == "id": try: element = self.driver.find_element_by_id(selctor_value) logger.info("找到了元素 %s 成功" "%s 该值为: %s" % (element.text, selctor_by, selctor_value)) except NoSuchElementException as e: logger.error("NoSuchElementException: %s" % e) elif selctor_by == "n" or selctor_by == "name": element = self.driver.find_element_by_name(selctor_value) elif selctor_by == "class" or selctor_by == "class_name": element = self.driver.find_element_by_class_name(selctor_value) elif selctor_by == "link" or selctor_by == "link_text": element = self.driver.find_element_by_link_text(selctor_value) elif selctor_by == "partial" or selctor_by == "partial_link_text": element = self.driver.find_element_by_partial_link_text( selctor_value) elif selctor_by == "tag" or selctor_by == "tag_name": element = self.driver.find_element_by_tag_name(selctor_value) elif selctor_by == "x" or selctor_by == "xpath": try: element = self.driver.find_element_by_xpath(selctor_value) logger.info("找到了元素 %s 成功" "%s 该值为: %s" % (element.text, selctor_by, selctor_value)) except NoSuchElementException as e: logger.error("NoSuchElementException:%s" % e) elif selctor_by == "s" or selctor_by == "selector_selector": element = self.driver.find_element_by_css_selector(selctor_value) else: raise NameError("请输入有效的定位元素类型") return element
def parse_get_media_su(data): serial_num = data[2:4] peripheral = data[6:7] media_type = data[8:9] media_id = data[9:13] pkg_total = data[13:15] pkg_num = data[15:17] if byte2str(pkg_total) == '0000' and byte2str(pkg_num) == '0000': if byte2str(media_type) == '02': logger.info('—————— 告警视频未录制完 {} ——————'.format( byte2str(data))) query_media_body = '%s%s%s%s%s' % ( COMPANY_NO, byte2str(peripheral), '50', byte2str(media_type), byte2str(media_id)) query_media = '%s%s%s%s%s' % ( SU_FLAG, calc_check_code(query_media_body), num2big( GlobalVar.get_serial_no()), query_media_body, SU_FLAG) query_msg_queue.put(query_media) send_queue.put(query_msg_queue.get(block=False)) elif byte2str(media_type) == '00': logger.error('—————— 告警数据不存在 {} ——————'.format( byte2str(data))) else: return_state = '00' img_return_body = '%s%s%s%s%s%s%s%s' % ( COMPANY_NO, byte2str(peripheral), '51', byte2str(media_type), byte2str(media_id), byte2str(pkg_total), byte2str(pkg_num), return_state) img_return = '%s%s%s%s%s' % ( SU_FLAG, calc_check_code(img_return_body), byte2str(serial_num), img_return_body, SU_FLAG) send_queue.put(img_return) media_queue.put(data) total_pkg = int(byte2str(data[13:15]), 16) rec_pkg = int(byte2str(data[15:17]), 16) if rec_pkg == total_pkg - 1: try: send_queue.put(query_msg_queue.get(block=False)) except queue.Empty: global fetch_media_flag fetch_media_flag = True
def big2num(length): try: length = int(length, 16) return length except ValueError: logger.error('十六进制转整型数据出错。')
def searchApp(excelObj, stepSheet, dataSheet): try: dataIsExecuteCols = excelObj.getColumn(dataSheet, dataSource_isExecute) appNameCols = excelObj.getColumn(dataSheet, dataSource_appName) requiredDataNum = 0 successfulDataNum = 0 for idx, i in enumerate(dataIsExecuteCols[1:]): if i.value == "y": requiredDataNum += 1 successfulStepNum = 0 logger.info("开始搜索APP“{}”".format(appNameCols[idx + 1].value)) stepNum = excelObj.getRowsNumber(stepSheet) for j in range(2, stepNum + 1): # 用例步骤中的第一行为标题,无须执行 stepRow = excelObj.getRow(stepSheet, j) # 获取用例步骤中描述 stepDescription = stepRow[caseStep_caseStepDescription - 1].value # 获取函数名 keyWord = stepRow[caseStep_keyWord - 1].value # 获取操作元素的定位方式 locationType = stepRow[caseStep_locationType - 1].value # 获取操作元素定位方式的表达式 locatorExpression = stepRow[caseStep_locatorExpression - 1].value # 获取函数中的参数 operatorValue = stepRow[caseStep_operatorValue - 1].value if isinstance(operatorValue, int): # 数值类数据从excel取出后为int型数据,转换为字符串,方便拼接 operatorValue = str(operatorValue) if operatorValue and operatorValue.isalpha(): # 如果operatorValue为字母时,则根据坐标在数据源工作表中取操作值 operatorValue = excelObj.getCellOfValue( dataSheet, coordinate=operatorValue + str(idx + 2)) if keyWord and locationType and locatorExpression and operatorValue: step = keyWord + "('{}','{}','{}')".format( locationType, locatorExpression, operatorValue) elif keyWord and locationType and locatorExpression: step = keyWord + "('{}','{}')".format( locationType, locatorExpression) elif keyWord and operatorValue: step = keyWord + "('{}')".format(operatorValue) else: step = keyWord + "()" try: # 用例步骤执行执行成功,写入执行结果和日志 eval(step) successfulStepNum += 1 logger.info("执行步骤“{}”成功".format(stepDescription)) except Exception as e: # 用例步骤执行执行失败 logger.error(u"执行步骤“{}”失败\n异常信息:{}".format( stepDescription, traceback.format_exc())) if successfulStepNum == stepNum - 1: writeResult(excelObj, dataSheet, "Pass", idx + 2, "dataSheet") successfulDataNum += 1 else: writeResult(excelObj, dataSheet, "Faild", idx + 2, "dataSheet") else: # 清空不需要执行的数据源中的执行时间和执行结果 writeResult(excelObj, dataSheet, "", idx + 2, "dataSheet") logger.info("APP“{}”被设置为忽略执行".format(appNameCols[idx + 1].value)) if requiredDataNum == successfulDataNum: return 1 return 0 except Exception as e: logger.info("数据驱动框架主程序发生异常\n异常信息:{}" % (traceback.format_exc()))
def parse_alarm(data): if conf.get_protocol_type() == 1: peripheral = data[6:7] function_no = data[7:8] serial_num = data[2:4] alarm_return_body = '%s%s%s' % (COMPANY_NO, byte2str(peripheral), byte2str(function_no)) alarm_return = '%s%s%s%s%s' % ( SU_FLAG, calc_check_code(alarm_return_body), byte2str(serial_num), alarm_return_body, SU_FLAG) send_queue.put(alarm_return) num = int(byte2str(data[38:39]), 16) alarm_type = data[13:14] video_id = data[-5:-1] speed = data[19:20] height = data[20:22] latitude = data[22:26] longitude = data[26:30] alarm_time = data[30:36] state = data[36:38] if peripheral == b'\x65': logger.debug('') logger.debug('========== 收到DSM告警信息 ==========') logger.debug('') logger.debug( '—————— 视频ID {} 告警类型 -------------------- {} ——————'. format(byte2str(video_id), alarm_type_code_su_dsm.get(alarm_type))) elif peripheral == b'\x64': logger.debug('') logger.debug('========== 收到ADAS告警信息 ==========') logger.debug('') logger.debug( '—————— 视频ID {} 告警类型 -------------------- {} ——————'. format(byte2str(video_id), alarm_type_code_su_adas.get(alarm_type))) logger.debug( '—————— 速度 {} 高程 {} 纬度 {} 经度 {} 告警时间 {} 车辆状态 {} ——————'.format( big2num(byte2str(speed)), big2num(byte2str(height)), big2num(byte2str(latitude)), big2num(byte2str(longitude)), byte2str(alarm_time), byte2str(state))) if conf.get_get_media_flag(): for x in range(num): media_id = byte2str(data[39 + x * 5 + 1:39 + x * 5 + 5]) media_type = byte2str(data[39 + x * 5:39 + x * 5 + 1]) media_alarm_code[media_id] = alarm_type if data[6:8] == DSM_ALARM_SU: if media_type == '00' or '02': query_media_body = '%s%s%s%s' % ( COMPANY_NO, '6550', media_type, media_id) else: logger.error('数据解析出错{}'.format(byte2str(data))) elif data[6:8] == ADAS_ALARM_SU: if media_type == '00' or '02': query_media_body = '%s%s%s%s' % ( COMPANY_NO, '6450', media_type, media_id) else: logger.error('数据解析出错{}'.format(byte2str(data))) else: logger.error('不存在的告警{}'.format(byte2str(data))) query_media = '%s%s%s%s%s' % ( SU_FLAG, calc_check_code(query_media_body), num2big(GlobalVar.get_serial_no()), query_media_body, SU_FLAG) query_msg_queue.put(query_media) global fetch_media_flag if fetch_media_flag: fetch_media_flag = False if not query_msg_queue.empty(): send_queue.put(query_msg_queue.get(block=False))
def appRankAndSearchApp(): try: excelObj = ParseExcel() excelObj.loadWorkBook(dataFilePath) caseSheet = excelObj.getSheetByName("测试用例") caseNum = excelObj.getRowsNumber(caseSheet) isExecuteCaseCols = excelObj.getColumn(caseSheet, testCase_isExecute) # 记录需要执行的用例个数 requiredCaseNum = 0 # 记录执行成功的用例个数 successfulCaseNum = 0 for idx, i in enumerate(isExecuteCaseCols[1:]): caseName = excelObj.getCellOfValue(caseSheet, rowNo=idx + 2, colsNo=testCase_testCaseName) logger.info("----------" + caseName) # 测试用例sheet中第一行为标题,无须执行 if i.value == "y": requiredCaseNum += 1 caseRow = excelObj.getRow(caseSheet, idx + 2) frameworkName = caseRow[testCase_frameworkName - 1].value stepSheetName = caseRow[testCase_testStepSheetName - 1].value if frameworkName == "关键字": logger.info("**********调用关键字驱动**********") # 根据用例的sheet名获取用例的sheet对象 stepSheet = excelObj.getSheetByName(stepSheetName) # 记录用例步骤的个数 stepNum = excelObj.getRowsNumber(stepSheet) # 记录用例步骤执行成功的个数 successfulStepNum = 0 for j in range(2, stepNum + 1): # 用例步骤中的第一行为标题,无须执行 stepRow = excelObj.getRow(stepSheet, j) # 获取用例步骤中描述 StepDescription = stepRow[caseStep_caseStepDescription - 1].value # 获取函数名 keyWord = stepRow[caseStep_keyWord - 1].value print("keyWord = ", keyWord) # 获取操作元素的定位方式 locationType = stepRow[caseStep_locationType - 1].value # 获取操作元素定位方式的表达式 locatorExpression = stepRow[caseStep_locatorExpression - 1].value # 获取函数中的参数 operatorValue = stepRow[caseStep_operatorValue - 1].value # 数值类数据从excel取出后为long型数据,转换为字符串,方便拼接 if isinstance(operatorValue, int): operatorValue = str(operatorValue) if keyWord and locationType and locatorExpression and operatorValue: step = keyWord + "('%s','%s','%s')" % ( locationType, locatorExpression, operatorValue) elif keyWord and locationType and locatorExpression: step = keyWord + "('%s','%s')" % ( locationType, locatorExpression) elif keyWord and operatorValue: step = keyWord + "('%s')" % operatorValue elif keyWord: step = keyWord + "()" try: # 用例步骤执行执行成功,写入执行结果和日志 print(step) eval(step) successfulStepNum += 1 writeResult(excelObj, stepSheet, "Pass", j, "caseStep") logger.info("执行步骤“%s”成功" % StepDescription) except Exception as err: #用例步骤执行执行成功 errPicPath = capture_screen() errMsg = traceback.format_exc() writeResult(excelObj, stepSheet, "Faild", j, "caseStep", errMsg=errMsg, errPicPath=errPicPath) logger.error( "执行步骤“%s”失败\n异常信息:%s" % (StepDescription, str(traceback.format_exc()))) if successfulStepNum == stepNum - 1: successfulCaseNum += 1 writeResult(excelObj, caseSheet, "Pass", idx + 2, "testCase") logger.info("用例“%s”执行成功" % caseName) else: writeResult(excelObj, caseSheet, "Faild", idx + 2, "testCase") logger.info("用例“%s”执行失败" % caseName) elif frameworkName == "数据": logger.info("**********调用数据驱动**********") dataSourceSheetName = caseRow[testCase_dataSourceSheetName - 1].value # print dataSourceSheetName,stepSheetName stepSheet = excelObj.getSheetByName(stepSheetName) dataSheet = excelObj.getSheetByName(dataSourceSheetName) result = searchApp(excelObj, stepSheet, dataSheet) if result: successfulCaseNum += 1 writeResult(excelObj, caseSheet, "Pass", idx + 2, "testCase") logger.info("用例“%s”执行成功" % caseName) else: writeResult(excelObj, caseSheet, "Faild", idx + 2, "testCase") logger.info("用例“%s”执行失败" % caseName) else: # 清空不需要执行用例的执行时间和执行结果, writeResult(excelObj, caseSheet, "", idx + 2, "testCase") logger.info("用例“%s”被设置为忽略执行" % caseName) logger.info("共%s条用例,%s条需要被执行,本次执行通过%s条" % (caseNum - 1, requiredCaseNum, successfulCaseNum)) except Exception as err: logger.error("驱动框架主程序发生异常\n异常信息:%s" % str(traceback.format_exc()))
def input_string(self, selector, inputContent): try: self.find_element(selector).send_keys(inputContent) logger.info("在输入框输入 %s" % inputContent) except NameError as e: logger.error("输入框无法输入 %s" % inputContent)
def createContacts(): try: excelObj = ParseExcel() excelObj.loadWorkBook(dataFilePath) userSheet = excelObj.getSheetByName("126账号") isExecute = excelObj.getColumn(userSheet, account_isExecute) userNameCols = excelObj.getColumn(userSheet, account_userName) for idx, i in enumerate(isExecute[1:]): if i.value == 'y': userRow = excelObj.getRow(userSheet, idx + 2) userName = userRow[account_userName - 1].value passWord = str(userRow[account_passWord - 1].value) contactSheetName = userRow[account_dataSourceSheetName - 1].value driver = webdriver.Chrome() driver.maximize_window() driver.get("https://mail.126.com/") LoginAction.login(driver, userName, passWord) #断言前停顿3秒,防止页面跳转太快,断言失败 time.sleep(3) try: assert "收 信" in driver.page_source except Exception as e: logger.error("用户“{}”登录后,断言页面关键字“退出”失败\n异常信息:{}".format( userName, traceback.format_exc())) else: logger.info("用户“{}”登录后,断言页面关键字“退出”成功".format(userName)) contactSheet = excelObj.getSheetByName(contactSheetName) isExecuteAddContact = excelObj.getColumn( contactSheet, contacts_isExecute) contactNum = 0 successAddContactNum = 0 coutactPersonNameCols = excelObj.getColumn( contactSheet, contacts_contactPersonName) for id, j in enumerate(isExecuteAddContact[1:]): if j.value == 'y': contactNum += 1 contactRow = excelObj.getRow(contactSheet, id + 2) coutactPersonName = coutactPersonNameCols[id + 1].value coutactPersonEmail = contactRow[ contacts_contactPersonEmail - 1].value isStar = contactRow[contacts_isStar - 1].value countactPersonPhone = str( contactRow[contacts_contactPersonPhone - 1].value) countactPersonComment = contactRow[ contacts_contactPersonComment - 1].value assertKeyWords = contactRow[contacts_assertKeyWords - 1].value logger.info("**********开始添加联系人“%s”**********" % coutactPersonName) AddContactAction.addContact(driver, coutactPersonName, coutactPersonEmail, isStar, countactPersonPhone, countactPersonComment) time.sleep(3) try: assert assertKeyWords in driver.page_source except Exception as e: excelObj.writeCell(contactSheet, "faild", rowNo=id + 2, colsNo=contacts_testResult, style="red") excelObj.writeCellCurrentTime( contactSheet, rowNo=id + 2, colsNo=contacts_runTime, style="red") logger.error("添加联系人“{}”失败\n异常信息:{}".format( coutactPersonName, traceback.format_exc())) else: successAddContactNum += 1 excelObj.writeCell(contactSheet, "pass", rowNo=id + 2, colsNo=contacts_testResult, style="green") excelObj.writeCellCurrentTime( contactSheet, rowNo=id + 2, colsNo=contacts_runTime, style="green") logger.info( "添加联系人“{}”成功".format(coutactPersonName)) else: excelObj.writeCell(contactSheet, "", rowNo=id + 2, colsNo=contacts_runTime) excelObj.writeCell(contactSheet, "", rowNo=id + 2, colsNo=contacts_testResult) logger.info("联系人“{}”被忽略执行".format( coutactPersonNameCols[idx + 1].value)) driver.quit() if contactNum == successAddContactNum: excelObj.writeCell(userSheet, "Pass", rowNo=idx + 2, colsNo=account_testResult, style="green") else: excelObj.writeCell(userSheet, "Faild", rowNo=idx + 2, colsNo=account_testResult, style="red") else: excelObj.writeCell(userSheet, "", rowNo=idx + 2, colsNo=account_testResult) logger.info("账号“{}”被忽略执行".format(userNameCols[idx + 1].value)) except Exception as e: logger.error("数据驱动框架主程序发生异常\n异常信息:{}".format(traceback.format_exc()))
def appstore(): try: excelObj = ParseExcel() excelObj.loadWorkBook(dataFilePath) caseSheet = excelObj.getSheetByName("测试用例") caseNameCols = excelObj.getColumn(caseSheet, testCase_testCaseName) isExecuteCaseCols = excelObj.getColumn(caseSheet, testCase_isExecute) # 记录需要执行的用例个数 requiredCaseNum = 0 # 记录执行成功的用例个数 successfulCaseNum = 0 for idx, i in enumerate(isExecuteCaseCols[1:]): # 测试用例sheet中第一行为标题,无须执行 if i.value == "y": requiredCaseNum += 1 caseRow = excelObj.getRow(caseSheet, idx + 2) caseName = caseNameCols[idx + 1].value stepSheetName = caseRow[testCase_testStepSheetName - 1].value # 根据用例的sheet名获取用例的sheet对象 stepSheet = excelObj.getSheetByName(stepSheetName) # 记录用例步骤的个数 stepNum = excelObj.getRowsNumber(stepSheet) # 记录用例步骤执行成功的个数 successfulStepNum = 0 logger.info("----------" + caseName) for j in range(2, stepNum + 1): # 用例步骤中的第一行为标题,无须执行 stepRow = excelObj.getRow(stepSheet, j) # 获取用例步骤中描述 StepDescription = stepRow[caseStep_caseStepDescription - 1].value # 获取函数名 keyWord = stepRow[caseStep_keyWord - 1].value # 获取操作元素的定位方式 locationType = stepRow[caseStep_locationType - 1].value # 获取操作元素定位方式的表达式 locatorExpression = stepRow[caseStep_locatorExpression - 1].value # 获取函数中的参数 operatorValue = stepRow[caseStep_operatorValue - 1].value # 数值类数据从excel取出后为int型数据,转换为字符串,方便拼接 if isinstance(operatorValue, int): operatorValue = str(operatorValue) if keyWord and locationType and locatorExpression and operatorValue: step = keyWord + "('{}','{}','{}')".format( locationType, locatorExpression, operatorValue) elif keyWord and locationType and locatorExpression: step = keyWord + "('{}','{}')".format( locationType, locatorExpression) elif keyWord and operatorValue: step = keyWord + "('{}')".format(operatorValue) else: step = keyWord + "()" try: # 用例步骤执行执行成功,写入执行结果和日志 eval(step) successfulStepNum += 1 writeResult(excelObj, stepSheet, "Pass", j, "caseStep") logger.info("执行步骤“{}”成功".format(StepDescription)) except Exception as e: # 用例步骤执行执行成功 errPicPath = capture_screen() errMsg = traceback.format_exc() writeResult(excelObj, stepSheet, "Faild", j, "caseStep", errMsg=errMsg, errPicPath=errPicPath) logger.error("执行步骤“{}”失败\n异常信息:{}".format( StepDescription, traceback.format_exc())) if successfulStepNum == stepNum - 1: successfulCaseNum += 1 writeResult(excelObj, caseSheet, "Pass", idx + 2, "testCase") else: writeResult(excelObj, caseSheet, "Faild", idx + 2, "testCase") else: writeResult(excelObj, caseSheet, "", idx + 2, "testCase") logger.info("用例“{}”被设置为忽略执行".format(caseNameCols[idx + 1].value)) logger.error("共{}条用例,{}条需要被执行,本次执行通过{}条".format( len(isExecuteCaseCols) - 1, requiredCaseNum, successfulCaseNum)) except Exception as e: logger.info("关键字驱动框架主程序发生异常\n异常信息:{}".format(traceback.format_exc()))