一直想着寫篇博客對年前學習UI自動化及項目實戰進行總結,一直沒時間,今天整理一下實戰項目的代碼分享出來,(代碼數據分離做的不太好,項目有幾次大改動,對於一個初學者產生了一些影響)大家共同學習。(注:項目是針對我們公司內部系統的測試,我就不分享鏈接了。)
項目簡介
項目名稱:****轉賬系統
項目目的:實現系統項目自動化測試執行
項目版本:v1.0
項目目錄
Package# 存放第三方插件 HTMLTestRunner.py framfriend #項目文件 Config __init__.py Conf.py# 讀配置文件獲取項目跟目錄路徑 並獲取所有欲使用的目錄文件的路徑 Config.ini# 存放項目跟目錄的路徑 Data TestData __init__.py elementDate.xlsx# 存放項目中所有的元素信息及測試數據 Email_receiver.txt# 存放郵件的接受者信息 Report# 測試報告 Image Fail# 存放用例執行失敗時的截圖 Pass# 存放用例執行成功時的截圖 Log# 存放用例執行過程中的log信息 TestReport# 存放測試用例執行完成后生成的測試報告 Test_case# 測試用例信息 Models # 存放一些公共方法 Doconfini.py# 讀配置文件 Doexcel.py# 讀excel文件 Driver.py# 存放driver Log.py# 生成log Myunit.py# 繼承unittest.Testcase Sendmail.py# 發送郵件 Strhandle.py# 字符串處理 Tcinfo.py# 測試用例基本信息 Testreport.py# 測試報告 Page_obj# 測試模塊
runTc.py# 執行測試用例
項目框架
unittest單元測試框架
pageobject 設計模式
項目設計
1.一個模塊(被測項目的頁面)對應一個py文件及一個測試類(測試文件)
2.每一個測試頁面(系統的頁面)中存儲頁面元素及此頁面中涉及到的功能
3.每一個用例組合在一個測試類里面生成一個py文件
項目目標
1. 生成測試用例執行結果報告
2.生成測試用例執行日志
3.用例執行失敗或者執行完成后自動發送郵件報告
4.數據驅動(讀取測試數據,減少腳本維護成本)
項目代碼
config.ini # 存放項目根路徑

[project] project_path = F:\python_test\framfriend_Test_Project [tesesection] name = hello word
elementData.xlsx # 存放所有的測試數據及元素
mail_receiver.txt# 存放郵件接收者的賬號 , 可以添加多個賬號以‘,’號分割
**@qq.com,**@qq.com
conf.py#獲取各種路徑

''' Code description:read config.ini, get path Create time: Developer: ''' import os import sys from framfriend.test_case.models.doconfIni import DoConfIni # 獲取當前路徑 currPath= \ os.path.split(os.path.realpath(__file__))[0] # 讀配置文件獲取項目路徑 readConfig = \ DoConfIni() proPath = \ readConfig.getConfValue(os.path.join(currPath,'config.ini'),'project','project_path') # 獲取日志路徑 logPath= \ os.path.join(proPath,'framfriend','report','Log') # 測試用例路徑 tcPath = \ os.path.join(proPath,'framfriend','test_case') # 獲取報告路徑 reportPath= \ os.path.join(proPath,'framfriend','report','TestReport') # 獲取測試數據路徑 dataPath= \ os.path.join(proPath,'framfriend','data','TestData') # 保存截圖路徑 # 錯誤截圖 failImagePath = os.path.join(proPath, 'framfriend', 'report', 'image','fail') # 成功截圖 passImagePath = os.path.join(proPath, 'framfriend', 'report', 'image','pass') # 被調函數名稱 funcName = sys._getframe().f_code.co_name # 被調函數所在行號 funcNo = sys._getframe().f_back.f_lineno # 被調函數所在文件名稱 funcFile= sys._getframe().f_code.co_filename
公共方法models
doconfini.py #讀寫ini文件

''' Code description:read conf file Create time: Developer: ''' import logging import configparser from framfriend.config.conf import * from framfriend.test_case.models.log import Logger log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO) class DoConfIni(object): def __init__(self): """ :param filename: """ self.cf = configparser.ConfigParser() # 從ini文件中讀數據 def getConfValue(self,filename,section,name): """ :param config: :param name: :return: """ try: self.cf.read(filename) value = self.cf.get(section,name) except Exception as e: log.logger.exception('read file [%s] for [%s] failed , did not get the value' %(filename,section)) raise e else: log.logger.info('read excel value [%s] successed! ' %value) return value # 向ini文件中寫數據 def writeConfValue(self,filename, section, name, value): """ :param section: section :param name: value name :param value: value :return: none """ try: self.cf.add_section(section) self.cf.set(section, name, value) self.cf.write(open(filename, 'w')) except Exception : log.logger.exception('section %s has been exist!' %section) raise configparser.DuplicateSectionError(section) else: log.logger.info('write section'+section+'with value '+value+' successed!') if __name__ == '__main__': file_path = currPath print(file_path) read_config = DoConfIni() value = read_config.getConfValue(os.path.join(currPath,'config.ini'),'project','project_path') print(value) read_config.writeConfValue(os.path.join(currPath,'config.ini'),'tesesection', 'name', 'hello word')
doexcel.py #讀取excel文件數據

''' Code description:read excel.xlsx, get values Create time: Developer: ''' import xlrd import os import logging from framfriend.config import conf from framfriend.test_case.models.log import Logger log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO) class ReadExcel(object): def __init__(self,fileName='elementDate.xlsx',sheetName='elementsInfo'): """ :param fileName: :param sheetName: """ try: self.dataFile = os.path.join(conf.dataPath, fileName) self.workBook = xlrd.open_workbook(self.dataFile) self.sheetName = self.workBook.sheet_by_name(sheetName) except Exception: log.logger.exception('init class ReadExcel fail', exc_info=True) raise else: log.logger.info('initing class ReadExcel') # 讀excel中的數據 def readExcel(self,rownum,colnum): """ :param rownum: :param colnum: :return: """ try: value = self.sheetName.cell(rownum,colnum).value except Exception: log.logger.exception('read value from excel file fail', exc_info=True) raise else: log.logger.info('reading value [%s] from excel file [%s] completed' %(value, self.dataFile)) return value if __name__ == '__main__': cellValue = ReadExcel().readExcel(11,3) print((cellValue))
driver.py #瀏覽器啟動

''' Code description:save all driver info Create time: Developer: ''' import time from selenium import webdriver import logging import sys from framfriend.test_case.models.log import Logger log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO) class WDriver(object): # Firefox driver def fireFoxDriver(self): """ :return: """ try: self.driver = webdriver.Firefox() except Exception as e: log.logger.exception('FireFoxDriverServer.exe executable needs to be in PATH. Please download!', exc_info=True) raise e else: log.logger.info('%s:found the Firefox driver [%s] successed !' %(sys._getframe().f_code.co_name,self.driver)) return self.driver # chrom driver def chromeDriver(self): """ :return: """ try: chromeOptions = webdriver.ChromeOptions() prefs = {"download.default_directory": "F:\\TestDownloads"} chromeOptions.add_experimental_option("prefs", prefs) self.driver = webdriver.Chrome(options=chromeOptions) time.sleep(10) except Exception as e: log.logger.exception('ChromeDriverServer.exe executable needs to be in PATH. Please download!', exc_info=True) raise e else: log.logger.info('%s:found the chrome driver [%s] successed !' % (sys._getframe().f_code.co_name, self.driver)) return self.driver # Ie driver def ieDriver(self): """ :return: """ try: self.driver = webdriver.Ie() except Exception as e: log.logger.exception('IEDriverServer.exe executable needs to be in PATH. Please download!', exc_info=True) raise e else: log.logger.info('%s:found the IE driver [%s] successed !' % (sys._getframe().f_code.co_name, self.driver)) return self.driver if __name__ == '__main__': WDrive=WDriver() WDrive.chromeDriver()
log.py # 輸出日志文件

''' Code description:log info Create time: Developer: ''' import logging import time class Logger(object): def __init__(self, logger, CmdLevel=logging.INFO, FileLevel=logging.INFO): """ :param logger: :param CmdLevel: :param FileLevel: """ self.logger = logging.getLogger(logger) self.logger.setLevel(logging.DEBUG) # 設置日志輸出的默認級別 # 日志輸出格式 fmt = logging.Formatter('%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s') # 日志文件名稱 # self.LogFileName = os.path.join(conf.log_path, "{0}.log".format(time.strftime("%Y-%m-%d")))# %H_%M_%S currTime = time.strftime("%Y-%m-%d") self.LogFileName = r'F:\python_test\framfriend_Test_Project\framfriend\report\Log\log'+currTime+'.log' # 設置控制台輸出 # sh = logging.StreamHandler() # sh.setFormatter(fmt) # sh.setLevel(CmdLevel)# 日志級別 # 設置文件輸出 fh = logging.FileHandler(self.LogFileName) fh.setFormatter(fmt) fh.setLevel(FileLevel)# 日志級別 # self.logger.addHandler(sh) self.logger.addHandler(fh) def debug(self, message): """ :param message: :return: """ self.logger.debug(message) def info(self,message): """ :param message: :return: """ self.logger.info(message) def warn(self,message): """ :param message: :return: """ self.logger.warning(message) def error(self,message): """ :param message: :return: """ self.logger.error(message) def criti(self,message): """ :param message: :return: """ self.logger.critical(message) if __name__ == '__main__': logger = Logger("fox",CmdLevel=logging.DEBUG, FileLevel=logging.DEBUG) logger.logger.debug("debug") logger.logger.log(logging.ERROR,'%(module)s %(info)s',{'module':'log日志','info':'error'}) #ERROR,log日志 error
myunittest.py # 設置前置后置操作(一個測試類(文件)執行一次打開瀏覽器, 節約每個用例打開一次瀏覽器的時間)

''' Code description:unittest framwork Create time: Developer: ''' from selenium import webdriver from framfriend.test_case.models.driver import WDriver import logging import unittest from framfriend.test_case.page_obj.login_page import LoginPage from framfriend.test_case.models.log import Logger log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO) class MyunitTest(unittest.TestCase): """ """ @classmethod def setUpClass(cls): # 一個測試類(文件)執行一次打開瀏覽器, 節約每個用例打開一次瀏覽器的時間 cls.driver = WDriver().chromeDriver() cls.driver.maximize_window() log.logger.info('opened the browser successed!') # ---------------------------- def setUp(self): """ :return: """ self.login = LoginPage(self.driver) self.login.open() log.logger.info('************************starting run test cases************************') def tearDown(self): """ :return: """ self.driver.refresh() log.logger.info('************************test case run completed************************') @classmethod def tearDownClass(cls): cls.driver.quit() log.logger.info('quit the browser success!') #---------------------------- if __name__ == '__main__': unittest.main()
sendmail.py # 發送郵件

''' Code description:send email Create time: Developer: ''' import smtplib from email.mime.text import MIMEText from email.header import Header import os from framfriend.config import conf from framfriend.test_case.models.log import Logger log = Logger(__name__) # 郵件發送接口 class SendMail(object): ''' 郵件配置信息 ''' def __init__(self, receiver, subject='framfriend 系統測試報告', server='smtp.qq.com', fromuser='******@qq.com', frompassword='yryyintgafnubded', sender='******@qq.com'): """ :param receiver: :param subject: :param server: :param fromuser: :param frompassword: :param sender: """ self._server = server self._fromuser = fromuser self._frompassword = frompassword self._sender = sender self._receiver = receiver self._subject = subject def sendEmail(self, fileName): """ :param filename: :return: """ # 打開報告文件讀取文件內容 try: f = open(os.path.join(conf.reportPath, fileName), 'rb') fileMsg = f.read() except Exception: log.logger.exception('open or read file [%s] failed,No such file or directory: %s' %(fileName, conf.reportPath)) log.logger.info('open and read file [%s] successed!' %fileName) else: f.close() # 郵件主題 subject = 'Python test report' # # 郵件設置 msg = MIMEText(fileMsg, 'html', 'utf-8') msg['subject'] = Header(subject, 'utf-8') msg['from'] = self._sender # 連接服務器,登錄服務器,發送郵件 try: smtp = smtplib.SMTP() smtp.connect(self._server) smtp.login(self._fromuser, self._frompassword) except Exception: log.logger.exception('connect [%s] server failed or username and password incorrect!' %smtp) else: log.logger.info('email server [%s] login success!' %smtp) try: smtp.sendmail(self._sender, self._receiver, msg.as_string()) except Exception: log.logger.exception('send email failed!') else: log.logger.info('send email successed!') # 從文件中讀取郵件接收人信息 def getReceiverInfo(fileName): ''' :param filename: 讀取接收郵件人信息 :return: 接收郵件人信息 ''' try: openFile = open(os.path.join(conf.dataPath, fileName)) except Exception: log.logger.exception('open or read file [%s] failed,No such file or directory: %s' %(fileName, conf.dataPath)) else: log.logger.info('open file [%s] successed!' %fileName) for line in openFile: msg = [i.strip() for i in line.split(',')] log.logger.info('reading [%s] and got receiver value is [%s]' %(fileName, msg)) return msg if __name__ == '__main__': readMsg=getReceiverInfo('mail_receiver.txt') sendmail = SendMail(readMsg) sendmail.sendEmail('report2019-10-21 15_55_26.html')
testreport.py #輸出測試報告html文件

''' Code description:test report Create time: Developer: ''' import time import logging import unittest from BeautifulReport import BeautifulReport from framfriend.config import conf from framfriend.test_case.models.log import Logger from package import HTMLTestRunner log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO) # 用HTMLTestRunner 實現的測試報告 def testreport(): """ :return: """ currTime = time.strftime('%Y-%m-%d %H_%M_%S') fileName = conf.reportPath + r'\report' + currTime + '.html' try: fp = open(fileName, 'wb') except Exception : log.logger.exception('[%s] open error cause Failed to generate test report' %fileName) else: runner = HTMLTestRunner.HTMLTestReportCN \ (stream=fp, title='framfriend sys測試報告', description='處理器:Intel(R) Core(TM) ' 'i5-5200U CPU @ 2.20GHz 2.20 GHz ' '內存:8G 系統類型: 64位 版本: windows 10 專業版') log.logger.info('successed to generate test report [%s]' %fileName) return runner, fp, fileName # def addTc(TCpath = conf.tcPath, rule = '*TC.py'): """ :param TCpath: 測試用例存放路徑 :param rule: 匹配的測試用例文件 :return: 測試套件 """ discover = unittest.defaultTestLoader.discover(TCpath, rule) return discover # 用BeautifulReport模塊實現測試報告 def runTc(discover): """ :param discover: 測試套件 :return: """ currTime = time.strftime('%Y-%m-%d %H_%M_%S') fileName = currTime+'.html' try: result = BeautifulReport(discover) result.report(filename=fileName, description='測試報告', log_path=conf.reportPath) except Exception: log.logger.exception('Failed to generate test report', exc_info=True) else: log.logger.info('successed to generate test report [%s]' % fileName) return fileName if __name__ == '__main__': testreport() suite = addTc(rule = '*TC.py') runTc(suite)
#測試用例(測試用例我就展出一個了,如果想看其他的可以上我的github下載查看)
base_page.py # 封裝頁面公共方法

''' Code description: base page 封裝一些公共方法 Create time: Developer: ''' from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import os import logging import sys from framfriend.test_case.models.log import Logger from framfriend.config import conf from framfriend.test_case.models.doexcel import ReadExcel eleData = ReadExcel() # 存儲系統所有的元素數據 testLoginData = ReadExcel('elementDate.xlsx', 'userNamePw') # 登錄模塊測試數據 userData = ReadExcel('elementDate.xlsx','userData') queryData = ReadExcel('elementDate.xlsx', 'queryData') log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO) class BasePage(object): """主菜單""" menuList = \ [(By.ID, eleData.readExcel(11, 3)), #左側菜單欄 (By.ID, eleData.readExcel(12, 3)), # 功能開發 (By.ID, eleData.readExcel(13, 3)), # 基本功能維護 (By.ID, eleData.readExcel(14, 3)), # 銀農直聯系統 (By.ID, eleData.readExcel(15, 3)), # 財務系統 (By.ID, eleData.readExcel(16, 3)), # 審批流程 (By.ID, eleData.readExcel(17, 3))] # 合同管理 def __init__(self, driver,url='http://localhost:8080/farmfriend/login/main.do'): """ :param driver: :param url: """ self.driver = driver self.base_url = url def _open(self,url): """ :param url: :return: """ try: self.driver.get(url) self.driver.implicitly_wait(10) except Exception as e: log.logger.exception(e, exc_info=True) raise ValueError('%s address access error, please check!' %url) else: log.logger.info('%s is accessing address %s at line[46]' %(sys._getframe().f_code.co_name,url)) def open(self): """ :return: """ self._open(self.base_url) log.logger.info('%s loading successed!' %self.base_url) return self.base_url # *loc 代表任意數量的位置參數 def findElement(self, *loc): """ 查找單一元素 :param loc: :return: """ try: WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc)) # log.logger.info('The page of %s had already find the element %s'%(self,loc)) # return self.driver.find_element(*loc) except Exception as e: log.logger.exception('finding element timeout!, details' ,exc_info=True) raise e else: log.logger.info('The page of %s had already find the element %s' % (self, loc)) return self.driver.find_element(*loc) def findElements(self, *loc): """ 查找一組元素 :param loc: :return: """ try: WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc)) # log.logger.info('The page of %s had already find the element %s' % (self, loc)) # return self.driver.find_elements(*loc) except Exception as e: log.logger.exception('finding element timeout!, details', exc_info=True) raise e else: log.logger.info('The page of %s had already find the element %s' % (self, loc)) return self.driver.find_elements(*loc) #輸入數據 def inputValue(self, inputBox, value): """ 后期修改其他頁面直接調用這個函數 :param inputBox: :param value: :return: """ inputB = self.findElement(*inputBox) try: inputB.clear() inputB.send_keys(value) except Exception as e: log.logger.exception('typing value error!', exc_info=True) raise e else: log.logger.info('inputValue:[%s] is receiveing value [%s]' % (inputBox, value)) # 獲取元素數據 def getValue(self, *loc): """ :param loc: :return: """ element = self.findElement(*loc) try: value = element.text #return value except Exception: #element = self.find_element_re(*loc) value = element.get_attribute('value') log.logger.info('reading the element [%s] value [%s]' % (loc, value)) return value except: log.logger.exception('read value failed', exc_info=True) raise Exception else: log.logger.info('reading the element [%s] value [%s]' % (loc,value)) return value def getValues(self, *loc): """ :param loc: :return: """ value_list = [] try: for element in self.findElements(*loc): value = element.text value_list.append(value) except Exception as e: log.logger.exception('read value failed', exc_info=True) raise e else: log.logger.info('reading the element [%s] value [%s]'% (loc,value_list)) return value_list # 執行js腳本 def jScript(self,src): """ :param src: :return: """ try: self.driver.execute_script(src) except Exception as e: log.logger.exception('execute js script [%s] failed ' %src) raise e else: log.logger.info('execute js script [%s] successed ' %src) # 判斷元素是否存在 def isElementExist(self, element): """ :param element: :return: """ try: WebDriverWait(self.driver, 10).until(EC.presence_of_element_located(element)) except: # log.logger.exception('The element [%s] not exist', exc_info=True) return False else: # log.logger.info('The element [%s] have existed!' %element) return True # 截圖 def saveScreenShot(self, filename): """ :param filename: :return: """ list_value = [] list = filename.split('.') for value in list: list_value.append(value) if list_value[1] == 'png' or list_value[1] == 'jpg' or list_value[1] == 'PNG' or list_value[1] == 'JPG': if 'fail' in list_value[0].split('_'): try: self.driver.save_screenshot(os.path.join(conf.failImagePath, filename)) except Exception: log.logger.exception('save screenshot failed !', exc_info=True) else: log.logger.info('the file [%s] save screenshot successed under [%s]' % (filename, conf.failImagePath)) elif 'pass' in list_value[0]: try: self.driver.save_screenshot(os.path.join(conf.passImagePath, filename)) except Exception: log.logger.exception('save screenshot failed !', exc_info=True) else: log.logger.info( 'the file [%s] save screenshot successed under [%s]' % (filename, conf.passImagePath)) else: log.logger.info('save screenshot failed due to [%s] format incorrect' %filename) else: log.logger.info('the file name of [%s] format incorrect cause save screenshot failed, please check!' % filename) # 接受錯誤提示框 def accept(self, *loc): """ :return: """ self.findElement(*loc).click() log.logger.info('closed the error information fram successed!') # 點擊按鈕 def cBtn(self,button): btn = self.findElement(*button) try: btn.click() except Exception: log.logger.exception( 'can not click the button' ,exc_info=True) else: log.logger.info( 'page [%s] :clicking the button [%s]' % (sys._getframe().f_code.co_name ,button)) def clearValue(self,clear): ''' 清空輸入項 :param clear: :return: ''' input_clear = self.findElement(*clear) try: input_clear.clear() except Exception: log.logger.exception( 'can not clear input', exc_info=True) else: log.logger.info( 'page [%s] :clearing input [%s]' % (sys._getframe().f_code.co_name, clear)) if __name__ == '__main__': pass
#單筆轉賬頁面

''' Code description: Pay_Page Create time: Developer: ''' import time import sys import logging from selenium.webdriver.common.by import By from framfriend.test_case.models.log import Logger from framfriend.test_case.page_obj.base_page import BasePage,eleData log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO) class Pay_Page(BasePage): ''' 單筆支付 ''' #銀農直聯系統 Silverfarmers = (By.XPATH,eleData.readExcel(14,3)) #銀農直聯列表 Silverfarmersul = (By.XPATH,'//*[@id="sidebarTree_23_ul"]') #轉賬功能 pay = (By.XPATH,'//*[@id="sidebarTree_24"]') #轉賬功能列表 payul = (By.XPATH,'//*[@id="sidebarTree_24_ul"]') #單筆支付 singlePay = (By.XPATH,eleData.readExcel(226,3)) #按鈕 button_list = \ [(By.XPATH, eleData.readExcel(238, 3)),#村居0 (By.XPATH, eleData.readExcel(239, 3)),#選擇一項村居1 (By.XPATH, eleData.readExcel(240, 3)),#收款方2 (By.XPATH, eleData.readExcel(241, 3)),#選擇一項收款方3 (By.XPATH, eleData.readExcel(242, 3)),#添加新收款方4 (By.XPATH, eleData.readExcel(243, 3)),#開始支付5 (By.XPATH, eleData.readExcel(244, 3)),#關閉支付6 (By.XPATH, eleData.readExcel(245, 3))]#確定支付7 #輸入框 input_list = \ [(By.XPATH, eleData.readExcel(246, 3)),#收款方名稱0 (By.NAME, eleData.readExcel(247, 3)),#收款方賬號1 (By.NAME, eleData.readExcel(248, 3)),#收款方戶名2 (By.XPATH, eleData.readExcel(249, 3)),#聯行號3 (By.XPATH, eleData.readExcel(250, 3)),#金額4 (By.XPATH, eleData.readExcel(251, 3)),#摘要5 (By.XPATH, eleData.readExcel(252, 3))]#支付密碼6 #驗證信息 msg_list = \ [(By.XPATH, eleData.readExcel(253, 3)),#村居為空提示0 (By.XPATH, eleData.readExcel(254, 3)),#賬號為空提示1 (By.XPATH, eleData.readExcel(255, 3)),#收款賬號為空提示2 (By.XPATH, eleData.readExcel(256, 3)),#金額為空錯誤提示3 (By.XPATH, eleData.readExcel(257, 3)),#摘要為空提示4 (By.XPATH, eleData.readExcel(258, 3)),#收款賬號錯誤提示5 (By.XPATH, eleData.readExcel(259, 3)),#收款賬號為空提示6 (By.XPATH, eleData.readExcel(260, 3)),#收款戶名為空提示7 (By.XPATH, eleData.readExcel(261, 3)),#聯行號為空錯誤提示8 (By.XPATH, eleData.readExcel(262, 3)),#右上提示9 (By.XPATH, eleData.readExcel(263, 3)),#選擇村居驗證10 (By.XPATH, eleData.readExcel(264, 3)),#選擇村居驗證11 (By.XPATH, eleData.readExcel(265, 3)),#選擇村居驗證12 (By.XPATH, eleData.readExcel(266, 3)),#選擇收款方驗證13 (By.XPATH, eleData.readExcel(267, 3)),#選擇收款方驗證14 (By.XPATH, eleData.readExcel(268, 3)),#選擇收款方驗證15 (By.XPATH, eleData.readExcel(269, 3)),#選擇收款方驗證16 (By.XPATH, eleData.readExcel(270, 3)),#收款方為空提示17 (By.XPATH, eleData.readExcel(271, 3)),#確定支付窗口18 (By.XPATH, eleData.readExcel(272, 3)),#關閉支付驗證19 (By.XPATH, eleData.readExcel(273, 3)),#點擊添加新收款方驗證20 (By.XPATH, '//*[@id="hasntOtherBank"]/div[4]/div/small[2]')]#新增收款方聯行號錯誤 # 測試數據 valueList = ['967687572875767575', '811247857857', '1','123456','測試'] reason = time.strftime('%Y-%m-%d:%H-%M-%S') + '測試' def insinglePay(self): ''' 進入單筆支付頁面 :return: ''' leftMenu = self.findElement(*self.menuList[0]) # 左側菜單欄 leftMenu.find_element_by_id('sidebarTree_23_a').click() # 點擊銀農直聯系統 time.sleep(1) Silverfarmersul = self.findElement(*self.Silverfarmersul) Silverfarmersul.find_element_by_xpath('//*[@id="sidebarTree_24_a"]').click() # 點擊支付功能 time.sleep(1) payul = self.findElement(*self.payul) payul.find_element_by_xpath('//*[@id="sidebarTree_25_a"]').click()#點擊單筆支付 time.sleep(1) log.logger.info('page[%s] :found the menu [%s] and [%s]' % ( sys._getframe().f_code.co_name, self.menuList[0], self.payul)) def cBtn(self, button): ''' 點擊按鈕 :return: ''' btn = self.findElement(*button) try: btn.click() except Exception: log.logger.exception('can not the button ', exc_info=True) raise else: log.logger.info( 'page[%s]:clicking the button [%s]' % (sys._getframe().f_code.co_name, button)) if __name__ == '__main__': pass
#單筆轉賬測試用例

''' Code description:單筆支付模塊 testcase Create time: Developer: ''' import time from framfriend.test_case.models.myunittest import MyunitTest from framfriend.test_case.page_obj.pay_page import Pay_Page class Pay_Tc(MyunitTest): '''單筆支付模塊用例''' def test_singlePay_1(self): '''選擇村居驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1])#選擇村居 msg1_1 = menu.isElementExist(menu.msg_list[10]) self.assertTrue(msg1_1,'顯示賬號') msg1_2 = menu.isElementExist(menu.msg_list[11]) self.assertTrue(msg1_2,'顯示戶名') msg1_3 = menu.isElementExist(menu.msg_list[12]) self.assertTrue(msg1_3,'顯示聯行號') def test_singlePay_2(self): '''選擇收款方驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1])#選擇村居 menu.cBtn(menu.button_list[2]) menu.cBtn(menu.button_list[3])#選擇收款方 msg2_1 = menu.isElementExist(menu.msg_list[13]) self.assertTrue(msg2_1, '顯示收款賬號') msg2_2 = menu.isElementExist(menu.msg_list[14]) self.assertTrue(msg2_2, '顯示戶名') msg2_3 = menu.isElementExist(menu.msg_list[15]) self.assertTrue(msg2_3, '顯示聯行號') msg2_4 = menu.isElementExist(menu.msg_list[16]) self.assertTrue(msg2_4, '顯示是否農商行') def test_singlePay_3(self): '''不輸入內容點擊開始支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[5])#點擊開始支付 msg3_1 = menu.isElementExist(menu.msg_list[0]) if msg3_1: msgInfo3 = menu.getValue(*menu.msg_list[0]) self.assertEqual(msgInfo3,'不能為空','提示信息正確') msg3_2 = menu.isElementExist(menu.msg_list[3]) self.assertTrue(msg3_2, '出現提示信息') if msg3_2: msgInfo4 = menu.getValue(*menu.msg_list[3]) self.assertEqual(msgInfo4,'請輸入有效的數字','提示信息正確') msg3_3 = menu.isElementExist(menu.msg_list[4]) self.assertTrue(msg3_3, '出現提示信息') if msg3_3: msgInfo5 = menu.getValue(*menu.msg_list[4]) self.assertEqual(msgInfo5,'不能為空','提示信息正確') def test_singlePay_4(self): '''不選擇村居點擊開始支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.inputValue(menu.input_list[4],menu.valueList[2]) menu.inputValue(menu.input_list[5],menu.reason) menu.cBtn(menu.button_list[5])#點擊開始支付 msg4_1 = menu.isElementExist(menu.msg_list[0]) self.assertTrue(msg4_1, '出現提示信息') if msg4_1: msgInfo1 = menu.getValue(*menu.msg_list[0]) self.assertEqual(msgInfo1,'不能為空','提示信息正確') def test_singlePay_5(self): '''不選擇收款方點擊開始支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 menu.inputValue(menu.input_list[4], menu.valueList[2])#輸入金額 menu.inputValue(menu.input_list[5], menu.reason)#輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 msg5_1 = menu.isElementExist(menu.msg_list[17]) self.assertTrue(msg5_1, '收款方出現提示信息') if msg5_1: msgInfo1 = menu.getValue(*menu.msg_list[17]) self.assertEqual(msgInfo1, '不能為空', '提示信息正確') def test_singlePay_6(self): '''不輸入金額點擊開始支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 menu.cBtn(menu.button_list[2]) menu.cBtn(menu.button_list[3]) # 選擇收款方 menu.inputValue(menu.input_list[5], menu.reason) # 輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 msg6_1 = menu.isElementExist(menu.msg_list[3]) self.assertTrue(msg6_1, '金額出現提醒信息') if msg6_1: msgInfo = menu.getValue(*menu.msg_list[3]) self.assertEqual(msgInfo, '請輸入有效的數字', '提示信息正確') def test_singlePay_7(self): '''不輸入摘要點擊開始支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 menu.cBtn(menu.button_list[2]) menu.cBtn(menu.button_list[3]) # 選擇收款方 menu.inputValue(menu.input_list[4], menu.valueList[2]) # 輸入金額 menu.cBtn(menu.button_list[5]) # 點擊開始支付 msg7_1 = menu.isElementExist(menu.msg_list[4]) self.assertTrue(msg7_1, '摘要出現提示信息') if msg7_1: msgInfo = menu.getValue(*menu.msg_list[4]) self.assertEqual(msgInfo, '不能為空', '提示信息正確') def test_singlePay_8(self): '''輸入錯誤金額點擊開始支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 menu.cBtn(menu.button_list[2]) menu.cBtn(menu.button_list[3]) # 選擇收款方 menu.inputValue(menu.input_list[4], menu.reason) # 輸入錯誤金額 menu.inputValue(menu.input_list[5], menu.valueList[4]) # 輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 msg8_1 = menu.isElementExist(menu.msg_list[3]) self.assertTrue(msg8_1, '金額出現提示信息') if msg8_1: msgInfo = menu.getValue(*menu.msg_list[3]) self.assertEqual(msgInfo, '請輸入有效的數字', '提示信息正確') def test_singlePay_9(self): '''正確輸入點擊開始支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 menu.cBtn(menu.button_list[2]) menu.cBtn(menu.button_list[3]) # 選擇收款方 menu.inputValue(menu.input_list[4], menu.valueList[2]) # 輸入金額 menu.inputValue(menu.input_list[5], menu.valueList[4]) # 輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 msg9_1 = menu.isElementExist(menu.msg_list[18]) self.assertTrue(msg9_1, '彈出確認支付窗口') def test_singlePay_10(self): '''不輸入支付密碼確定驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 menu.cBtn(menu.button_list[2]) menu.cBtn(menu.button_list[3]) # 選擇收款方 menu.inputValue(menu.input_list[4], menu.valueList[2]) # 輸入金額 menu.inputValue(menu.input_list[5], menu.valueList[4]) # 輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 menu.cBtn(menu.button_list[7])#點擊確定按鈕 msg10_1 = menu.isElementExist(menu.msg_list[9]) self.assertTrue(msg10_1, '提示信息') def test_singlePay_11(self): '''輸入錯誤支付密碼確定驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 menu.cBtn(menu.button_list[2]) menu.cBtn(menu.button_list[3]) # 選擇收款方 menu.inputValue(menu.input_list[4], menu.valueList[2]) # 輸入金額 menu.inputValue(menu.input_list[5], menu.valueList[4]) # 輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 menu.inputValue(menu.input_list[6],menu.valueList[2])#輸入錯誤密碼驗證 menu.cBtn(menu.button_list[7]) # 點擊確定按鈕 msg11_1 = menu.isElementExist(menu.msg_list[9]) self.assertTrue(msg11_1, '提示信息') def test_singlePay_12(self): '''輸入正確支付密碼確定驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 menu.cBtn(menu.button_list[2]) menu.cBtn(menu.button_list[3]) # 選擇收款方 menu.inputValue(menu.input_list[4], menu.valueList[2]) # 輸入金額 menu.inputValue(menu.input_list[5], menu.valueList[4]) # 輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 menu.inputValue(menu.input_list[6], menu.valueList[3]) # 輸入密碼 menu.cBtn(menu.button_list[7]) # 點擊確定按鈕 msg12_1 = menu.isElementExist(menu.msg_list[9]) self.assertTrue(msg12_1, '提示信息') def test_singlePay_13(self): '''關閉支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 menu.cBtn(menu.button_list[2]) menu.cBtn(menu.button_list[3]) # 選擇收款方 menu.inputValue(menu.input_list[4], menu.valueList[2]) # 輸入金額 menu.inputValue(menu.input_list[5], menu.reason) # 輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 menu.inputValue(menu.input_list[6], menu.valueList[3]) # 輸入密碼 menu.cBtn(menu.button_list[6]) # 點擊關閉按鈕 msg13_1 = menu.isElementExist(menu.msg_list[19]) self.assertTrue(msg13_1, '關閉支付窗口') def test_singlePay_14(self): '''點擊添加新收款方驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[4])#點擊添加新收款方 msg14_1 = menu.isElementExist(menu.msg_list[20]) self.assertTrue(msg14_1, '窗口驗證') def test_singlePay_15(self): '''不輸入新收款方內容支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 time.sleep(1) menu.cBtn(menu.button_list[4]) # 點擊添加新收款方 menu.inputValue(menu.input_list[4], menu.valueList[2]) # 輸入金額 menu.inputValue(menu.input_list[5], menu.reason) # 輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 msg15_2 = menu.isElementExist(menu.msg_list[6]) self.assertTrue(msg15_2,'收款賬號出現提示信息') if msg15_2: msgInfo2 = menu.getValue(*menu.msg_list[6]) self.assertEqual(msgInfo2, '不能為空', '提示信息正確') msg15_3 = menu.isElementExist(menu.msg_list[7]) self.assertTrue(msg15_3,'收款戶名出現提示信息') if msg15_3: msgInfo3 = menu.getValue(*menu.msg_list[7]) self.assertEqual(msgInfo3, '不能為空', '提示信息正確') msg15_4 = menu.isElementExist(menu.msg_list[8]) self.assertTrue(msg15_4,'聯行號出現提示信息') if msg15_4: msgInfo4 = menu.getValue(*menu.msg_list[8]) self.assertEqual(msgInfo4, '不能為空', '提示信息正確') def test_singlePay_16(self): '''不輸入新收款方賬號支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 time.sleep(1) menu.cBtn(menu.button_list[4]) # 點擊添加新收款方 menu.inputValue(menu.input_list[2], menu.reason) # 輸入戶名 menu.inputValue(menu.input_list[3], menu.valueList[1]) # 輸入聯行號 menu.inputValue(menu.input_list[4], menu.valueList[2]) # 輸入金額 menu.inputValue(menu.input_list[5], menu.reason) # 輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 msg15_2 = menu.isElementExist(menu.msg_list[6]) self.assertTrue(msg15_2, '收款賬號出現提示信息') if msg15_2: msgInfo2 = menu.getValue(*menu.msg_list[6]) self.assertEqual(msgInfo2, '不能為空', '提示信息正確') def test_singlePay_17(self): '''輸入不規則新收款方賬號支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 time.sleep(1) menu.cBtn(menu.button_list[4]) # 點擊添加新收款方 menu.inputValue(menu.input_list[1], menu.reason) # 輸入賬號 menu.inputValue(menu.input_list[2], menu.reason) # 輸入戶名 menu.inputValue(menu.input_list[3], menu.valueList[1]) # 輸入聯行號 menu.inputValue(menu.input_list[4], menu.valueList[2]) # 輸入金額 menu.inputValue(menu.input_list[5], menu.reason) # 輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 msg15_2 = menu.isElementExist(menu.msg_list[5]) self.assertTrue(msg15_2, '收款賬號出現提示信息') if msg15_2: msgInfo2 = menu.getValue(*menu.msg_list[5]) self.assertEqual(msgInfo2, '請輸入有效的數字', '提示信息正確') def test_singlePay_18(self): '''不輸入新收款方戶名支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 time.sleep(1) menu.cBtn(menu.button_list[4]) # 點擊添加新收款方 menu.inputValue(menu.input_list[1], menu.valueList[0]) # 輸入賬號 menu.inputValue(menu.input_list[3], menu.valueList[1]) # 輸入聯行號 menu.inputValue(menu.input_list[4], menu.valueList[2]) # 輸入金額 menu.inputValue(menu.input_list[5], menu.reason) # 輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 msg18_1 = menu.isElementExist(menu.msg_list[7]) self.assertTrue(msg18_1, '收款戶名提示信息') if msg18_1: msgInfo = menu.getValue(*menu.msg_list[7]) self.assertEqual(msgInfo, '不能為空', '提示信息正確') def test_singlePay_19(self): '''輸入錯誤新增聯行號支付驗證''' menu = Pay_Page(self.driver) # 實例化單筆支付頁面 self.login.loginFunc() # 登錄 menu.insinglePay() # 進入單筆支付頁面 time.sleep(2) menu.cBtn(menu.button_list[0]) menu.cBtn(menu.button_list[1]) # 選擇村居 time.sleep(1) menu.cBtn(menu.button_list[4]) # 點擊添加新收款方 menu.inputValue(menu.input_list[1], menu.valueList[0]) # 輸入新增賬號 menu.inputValue(menu.input_list[2], menu.reason) # 輸入戶名 menu.inputValue(menu.input_list[3], menu.reason) # 輸入錯誤聯行號 menu.inputValue(menu.input_list[4], menu.valueList[2]) # 輸入金額 menu.inputValue(menu.input_list[5], menu.reason) # 輸入摘要 menu.cBtn(menu.button_list[5]) # 點擊開始支付 msg20_1 = menu.isElementExist(menu.msg_list[21]) self.assertTrue(msg20_1, '聯行號錯誤信息') if msg20_1: msgInfo = menu.getValue(*menu.msg_list[21]) self.assertEqual(msgInfo, '請輸入有效的數字', '提示信息正確') if __name__ == '__main__': pass
#執行測試用例

#! user/bin/python ''' Code description:auto run test case Create time: Developer: ''' import unittest import time from BeautifulReport import BeautifulReport from framfriend.config.conf import * from framfriend.test_case.models.sendmail import SendMail, getReceiverInfo from framfriend.test_case.models.testreport import testreport # TODO : will be use jenkins continuous intergration teachnology manage the auto project if __name__ == '__main__': # currTime = time.strftime('%Y-%m-%d %H_%M_%S') # filename = currTime + '.html' # # 第一種測試報告 # test_suite = unittest.defaultTestLoader.discover(tcPath, pattern='*Tc.py') # result = BeautifulReport(test_suite) # result.report(filename= filename, description='test report', log_psath=reportPath) # # 第二種測試報告 runner, fp, fileName = testreport() test_suite = unittest.defaultTestLoader.discover(tcPath, pattern='registerTc.py') runner.run(test_suite) fp.close() # read_msg = getReceiverInfo(r'E:\python_test\framfriend_Test_Project\framfriend\data\TestData\mail_receiver.txt') # sendmail = SendMail(read_msg) # sendmail.sendEmail(fileName)
報告展示
總結
年前,第一個實戰項目,作為一個初學者學到了不少東西。有很多不足的地方,望大佬指導!現在在學習pytest,就當記筆記啦,過段時間再記錄一下學習pytest心得。