python+xlrd+xlutils+selenium简单实现excel自动化测试

环境准备

python3.7
新建python工程
chromedriver.exe

  pip install xlrd
  pip install xlutils
  pip install selenium

项目结构

项目结构

项目结构

一、获取测试用例

Excel用例分为两部分
元素


image.png

获取页面元素信息:

def getPages(path):
    book = xlrd.open_workbook(path)  # 打开要读取的Excel
    sheet = book.sheet_by_index(0)
    rows = sheet.nrows  # sheet页里面的行数
    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] != '':
            ##如果当第一格有值,那么将上一个webpage对象加入到webpages集合中,并创建一个新的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:
            ##当到达最后一行时,将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] != "":
            ##当第一个格子有值值时创建一个新的case对象,并将上一个case对象添加到数组中
            testcaseList.append(testcase)
            testcase = TestCaseClass(cells[0])
            ##检查用例元素是否存在再页面中
        element = findpageelement(webpages, cells[3], cells[4])
        ##floatTostring()excel表中会出现纯数字内容,py会将其默认为float类型;
        ##所以需根据该值具体情况,转化为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为整数则需转化为int在转化为str
            return str(int(value))
        else:
            ##如果value为小数则直接转化为str
            return str(value)
    return str(value)


def findpageelement(webElements, pagename, elementname):
    ##根据页面名称、元素名称寻找具体的元素属性,如果寻到了则返回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):
        ##根据step.action的值,执行相应的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("预期值:" + 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值错误")

用例执行

 ##执行用例
    def run(self):
        for testCase in self.testCases:
            print("==============开始执行用例<<" + testCase.casename + ">>==============")
            self.docase(testCase)
            print("==============用例执行完毕<<" + testCase.casename + ">>==============")
        self.close()
    ##关闭浏览器
    def close(self):
        self.webDriver.webdriver.close()
    ##执行用例步骤
    def docase(self, case):
        for step in case.steps:
            try:
                if step.action == "text":
                    ##当步骤方法为text时,设想为校验步骤
                    ##执行elementAction方法会返回校验结果
                    result = self.webDriver.elementAction(step)
                    ##记录校验结果
                    self.record(result=result, row=step.row)
                else:
                    ##其它动作类型
                    self.webDriver.elementAction(step)
            except BaseException:
                print("err:步骤异常提前记录,并结束这一次用例")
                self.record("F", case.steps[len(case.steps)-1].row)
                break

    def record(self, result, row):
        ###只支持xls
        print("***写入用例结果****")
        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:
        ##根据用例文件创建多个测试任务
        print("==============获取用例数据==============")
        casefile = './excelcase/'+casefile
        caselist = testcase.getcase(casefile)
        print("==============用例数据获取完成==============")
        testtask = test.testClass(caselist, casefile)
        testtask.run()

if __name__ == '__main__':
    main()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容