環(huán)境準(zhǔn)備
python3.7
新建python工程
chromedriver.exe
pip install xlrd
pip install xlutils
pip install selenium
項(xiàng)目結(jié)構(gòu)

項(xiàng)目結(jié)構(gòu)

項(xiàng)目結(jié)構(gòu)
一、獲取測(cè)試用例
Excel用例分為兩部分
元素

image.png
獲取頁(yè)面元素信息:
def getPages(path):
book = xlrd.open_workbook(path) # 打開(kāi)要讀取的Excel
sheet = book.sheet_by_index(0)
rows = sheet.nrows # sheet頁(yè)里面的行數(shù)
webPages = []##存放webPage類(lèi)
webpage = webPageClass()
for i in range(1, rows):
cells = sheet.row_values(i)
# print(cells)
if i == 1:
webpage.pageName = cells[0]
elif cells[0] != '':
##如果當(dāng)?shù)谝桓裼兄?,那么將上一個(gè)webpage對(duì)象加入到webpages集合中,并創(chuàng)建一個(gè)新的webpage類(lèi)
webPages.append(webpage)
webpage = webPageClass()
webpage.pageName = cells[0]
webelement = pageElementClass(cells[1], cells[2], cells[3])
webpage.pageElements.append(webelement)
if i == rows - 1:
##當(dāng)?shù)竭_(dá)最后一行時(shí),將webpage對(duì)象添加到webpages中
webPages.append(webpage)
return webPages
用例

image.png
獲取用例信息
def getcase(path):
book = xlrd.open_workbook(path) # 打開(kāi)要讀取的Excel
sheet = book.sheet_by_index(1)
rows = sheet.nrows # sheet頁(yè)里面的行
webpages = webpage.getPages(path)
testcaseList = []##存放case對(duì)象
testcase = TestCaseClass("")
for i in range(1, rows):
cells = sheet.row_values(i)
if i == 1:
testcase.casename = cells[0]
elif cells[0] != "":
##當(dāng)?shù)谝粋€(gè)格子有值值時(shí)創(chuàng)建一個(gè)新的case對(duì)象,并將上一個(gè)case對(duì)象添加到數(shù)組中
testcaseList.append(testcase)
testcase = TestCaseClass(cells[0])
##檢查用例元素是否存在再頁(yè)面中
element = findpageelement(webpages, cells[3], cells[4])
##floatTostring()excel表中會(huì)出現(xiàn)純數(shù)字內(nèi)容,py會(huì)將其默認(rèn)為float類(lèi)型;
##所以需根據(jù)該值具體情況,轉(zhuǎn)化為str類(lèi)型
step = CaseStepClass(stepname=cells[2], element=element, action=cells[5], parm=floatTostring(cells[6]),
expect=cells[7], row=i)
testcase.steps.append(step)
testcaseList.append(testcase)
return testcaseList
def floatTostring(value):
if type(value) == float:
if value - int(value) == 0:
##如果value為整數(shù)則需轉(zhuǎn)化為int在轉(zhuǎn)化為str
return str(int(value))
else:
##如果value為小數(shù)則直接轉(zhuǎn)化為str
return str(value)
return str(value)
def findpageelement(webElements, pagename, elementname):
##根據(jù)頁(yè)面名稱(chēng)、元素名稱(chēng)尋找具體的元素屬性,如果尋到了則返回pageelement對(duì)象
##如果沒(méi)有找到則直接退出程序
print("尋找的頁(yè)面" + pagename + "尋找的元素" + elementname)
for webPage in webElements:
print("進(jìn)入頁(yè)面" + webPage.pageName)
if webPage.pageName != pagename:
continue
elif webPage.pageName == pagename:
for pageElement in webPage.pageElements:
if pageElement.elemnetNmae != elementname:
continue
elif pageElement.elemnetNmae == elementname:
print("找到了元素")
print(pageElement.say())
return pageElement
else:
print("findpageelement:elementerr")
else:
print("findpageelement:pageerr")
print("!!!!!!!!尋找不到元素")
exit()
webdriver操作
元素定位
def find_element(self, type, value):
###只是添加了一些打印信息
print("方法" + type + "目標(biāo)值:" + value + "查找元素")
try:
webElment = self.webdriver.find_element(type, value)
except BaseException:
print("尋找元素錯(cuò)誤")
else:
print("尋找元素daole")
return webElment
元素操作
def elementAction(self, step):
##根據(jù)step.action的值,執(zhí)行相應(yīng)的webdriver方法
if step.action == "get":
print("瀏覽器打開(kāi)了url:" + step.element.value)
self.webdriver.get(step.element.value)
return
element = self.find_element(step.element.by, step.element.value)
if step.action == "click":
print("點(diǎn)擊了元素:" + step.element.value)
element.click()
elif step.action == "text":
print("預(yù)期值:" + step.expect)
print("實(shí)際值:" + element.text)
# assert step.expect == element.text
if step.expect == element.text:
# record(result="T", row=step.row)
return "T"
else:
return "F"
elif step.action == "send_keys":
print("send_keys元素:" + str(step.parm))
element.send_keys(step.parm)
elif step.action == "clear":
element.clear()
else:
print("action值錯(cuò)誤")
用例執(zhí)行
##執(zhí)行用例
def run(self):
for testCase in self.testCases:
print("==============開(kāi)始執(zhí)行用例<<" + testCase.casename + ">>==============")
self.docase(testCase)
print("==============用例執(zhí)行完畢<<" + testCase.casename + ">>==============")
self.close()
##關(guān)閉瀏覽器
def close(self):
self.webDriver.webdriver.close()
##執(zhí)行用例步驟
def docase(self, case):
for step in case.steps:
try:
if step.action == "text":
##當(dāng)步驟方法為text時(shí),設(shè)想為校驗(yàn)步驟
##執(zhí)行elementAction方法會(huì)返回校驗(yàn)結(jié)果
result = self.webDriver.elementAction(step)
##記錄校驗(yàn)結(jié)果
self.record(result=result, row=step.row)
else:
##其它動(dòng)作類(lèi)型
self.webDriver.elementAction(step)
except BaseException:
print("err:步驟異常提前記錄,并結(jié)束這一次用例")
self.record("F", case.steps[len(case.steps)-1].row)
break
def record(self, result, row):
###只支持xls
print("***寫(xiě)入用例結(jié)果****")
print("用例通過(guò)情況:" + result)
book = xlrd.open_workbook(self.casepath)
wtbook = xlutils.copy.copy(book)
wtsheet = wtbook.get_sheet(1)
wtsheet.write(row, 8, result)
wtbook.save(self.casepath)
程序啟動(dòng)
# 遍歷文件夾
def walkFile(file):
filelist = []
for root, dirs, files in os.walk(file):
# root 表示當(dāng)前正在訪(fǎng)問(wèn)的文件夾路徑
# dirs 表示該文件夾下的子目錄名list
# files 表示該文件夾下的文件list
# 遍歷文件
for f in files:
print(os.path.join(root, f))
filelist.append(f)
# # 遍歷所有的文件夾
# for d in dirs:
# print(os.path.join(root, d))
return filelist
def main():
##獲取用例文件信息
filelist = walkFile("./excelcase/")
for casefile in filelist:
##根據(jù)用例文件創(chuàng)建多個(gè)測(cè)試任務(wù)
print("==============獲取用例數(shù)據(jù)==============")
casefile = './excelcase/'+casefile
caselist = testcase.getcase(casefile)
print("==============用例數(shù)據(jù)獲取完成==============")
testtask = test.testClass(caselist, casefile)
testtask.run()
if __name__ == '__main__':
main()