python+xlrd+xlutils+selenium簡單實現(xiàn)excel自動化測試

環(huán)境準備

python3.7
新建python工程
chromedriver.exe

  pip install xlrd
  pip install xlutils
  pip install selenium

項目結(jié)構(gòu)

項目結(jié)構(gòu)

項目結(jié)構(gòu)

一、獲取測試用例

Excel用例分為兩部分
元素


image.png

獲取頁面元素信息:

def getPages(path):
    book = xlrd.open_workbook(path)  # 打開要讀取的Excel
    sheet = book.sheet_by_index(0)
    rows = sheet.nrows  # sheet頁里面的行數(shù)
    webPages = []##存放webPage類
    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] != '':
            ##如果當?shù)谝桓裼兄捣沧剩敲磳⑸弦粋€webpage對象加入到webpages集合中渴肉,并創(chuàng)建一個新的webpage類
            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:
            ##當?shù)竭_最后一行時冗懦,將webpage對象添加到webpages中
            webPages.append(webpage)
    return webPages

用例

image.png

獲取用例信息

def getcase(path):
    book = xlrd.open_workbook(path)  # 打開要讀取的Excel
    sheet = book.sheet_by_index(1)
    rows = sheet.nrows  # sheet頁里面的行
    webpages = webpage.getPages(path)
    testcaseList = []##存放case對象
    testcase = TestCaseClass("")
    for i in range(1, rows):
        cells = sheet.row_values(i)
        if i == 1:
            testcase.casename = cells[0]
        elif cells[0] != "":
            ##當?shù)谝粋€格子有值值時創(chuàng)建一個新的case對象,并將上一個case對象添加到數(shù)組中
            testcaseList.append(testcase)
            testcase = TestCaseClass(cells[0])
            ##檢查用例元素是否存在再頁面中
        element = findpageelement(webpages, cells[3], cells[4])
        ##floatTostring()excel表中會出現(xiàn)純數(shù)字內(nèi)容仇祭,py會將其默認為float類型批狐;
        ##所以需根據(jù)該值具體情況,轉(zhuǎn)化為str類型
        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ù)頁面名稱前塔、元素名稱尋找具體的元素屬性嚣艇,如果尋到了則返回pageelement對象
    ##如果沒有找到則直接退出程序
    print("尋找的頁面" + pagename + "尋找的元素" + elementname)
    for webPage in webElements:
        print("進入頁面" + 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 + "目標值:" + value + "查找元素")
        try:
            webElment = self.webdriver.find_element(type, value)
        except BaseException:
            print("尋找元素錯誤")
        else:
            print("尋找元素daole")
            return webElment

元素操作

    def elementAction(self, step):
        ##根據(jù)step.action的值,執(zhí)行相應(yīng)的webdriver方法
        if step.action == "get":
            print("瀏覽器打開了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("點擊了元素:" + step.element.value)
            element.click()
        elif step.action == "text":
            print("預(yù)期值:" + step.expect)
            print("實際值:" + 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值錯誤")

用例執(zhí)行

 ##執(zhí)行用例
    def run(self):
        for testCase in self.testCases:
            print("==============開始執(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":
                    ##當步驟方法為text時华弓,設(shè)想為校驗步驟
                    ##執(zhí)行elementAction方法會返回校驗結(jié)果
                    result = self.webDriver.elementAction(step)
                    ##記錄校驗結(jié)果
                    self.record(result=result, row=step.row)
                else:
                    ##其它動作類型
                    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("***寫入用例結(jié)果****")
        print("用例通過情況:" + 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)

程序啟動

# 遍歷文件夾
def walkFile(file):
    filelist = []
    for root, dirs, files in os.walk(file):
        # root 表示當前正在訪問的文件夾路徑
        # 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)建多個測試任務(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()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寂屏,隨后出現(xiàn)的幾起案子贰谣,更是在濱河造成了極大的恐慌,老刑警劉巖迁霎,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吱抚,死亡現(xiàn)場離奇詭異,居然都是意外死亡考廉,警方通過查閱死者的電腦和手機秘豹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昌粤,“玉大人既绕,你說我怎么就攤上這事′套” “怎么了凄贩?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長袱讹。 經(jīng)常有香客問我疲扎,道長,這世上最難降的妖魔是什么捷雕? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任椒丧,我火速辦了婚禮,結(jié)果婚禮上非区,老公的妹妹穿的比我還像新娘瓜挽。我一直安慰自己,他們只是感情好征绸,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布久橙。 她就那樣靜靜地躺著俄占,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淆衷。 梳的紋絲不亂的頭發(fā)上缸榄,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音祝拯,去河邊找鬼甚带。 笑死,一個胖子當著我的面吹牛佳头,可吹牛的內(nèi)容都是我干的鹰贵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼康嘉,長吁一口氣:“原來是場噩夢啊……” “哼碉输!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亭珍,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤敷钾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肄梨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阻荒,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年众羡,在試婚紗的時候發(fā)現(xiàn)自己被綠了侨赡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纱控,死狀恐怖辆毡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甜害,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布球昨,位于F島的核電站尔店,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏主慰。R本人自食惡果不足惜嚣州,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望共螺。 院中可真熱鬧该肴,春花似錦、人聲如沸藐不。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涎嚼,卻和暖如春阱州,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背法梯。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工苔货, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人立哑。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓夜惭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铛绰。 傳聞我的和親對象是個殘疾皇子滥嘴,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容