1 #encoding=utf-8 2 import xlrd,time,os 3 from xlutils.copy import copy 4 from selenium import webdriver 5 6 def getTestData(excelPath,sheetName): 7 ''' 8 定义从excel文件中获取数据 9 :param excelPath: excel文件路径 10 :param sheetName: 表格中的页签名 11 :return: 返回测试数据字段 12 ''' 13 # 打开存有测试数据的excel 14 xl = xlrd.open_workbook(excelPath) 15 # 指定打开某个页签的table 16 table = xl.sheet_by_name(sheetName) 17 # 获取表中的第一行,用来做字典的key进行存储,返回的是列表从第一列到最后一列 18 listKey = table.row_values(0) 19 # 用于存放测试数据 20 listTestData = [] 21 # 外围for循环取到的是行 22 for i in range(1,table.nrows): 23 # 将存取的每次数据存在空字典内 24 dicData = {} 25 # 内部for循环取到的是列 26 for j in range(0,table.ncols): 27 # key为第一行的每列,value为每行的列值 28 dicData.update({listKey[j]:table.cell_value(i,j)}) 29 listTestData.append(dicData) 30 print('取到的数据为:') 31 # 遍历取到的每行数据 32 for rowData in listTestData: 33 print(rowData) 34 # 返回测试数据 35 return listTestData 36 37 def writeResultToExcel(excelPath,sheetName,listRe,reResultFiles): 38 ''' 39 定义函数,先复制测试用例表格模板,再往里面写入实际结果,测试结果以及截图路径 40 :param excelPath: 需要复制的excel模板路径 41 :param sheetName: 被复制末班中的页签名 42 :param listRe: 列表类型,其内部数据为字典类型,列表中包含实际结果,测试结果,截图路径的存取数据字典 43 :param reResultFiles: 写入完成后保存的excel路径 44 :return: 45 ''' 46 # 打开指定路径的excel文件 47 xl = xlrd.open_workbook(excelPath,encoding_override='utf-8') 48 # 打开对应页签的表 49 table = xl.sheet_by_name(sheetName) 50 # 复制模板 51 excelMudle = copy(xl) 52 # 获取到sheetName对应的表 53 mudleTable = excelMudle.get_sheet(sheetName) 54 # 获取模板表中有多少列数 55 cols = table.ncols 56 # 获取模板表中有多少行数 57 rows = table.nrows 58 for rowsName in listRe[0].keys(): 59 # 每次往第一行最新的列写入表头 60 mudleTable.write(0,cols,rowsName) 61 # 列索引往后移动一位 62 cols+=1 63 #逐行写数据,从第2行开始写,写到最后一行,每行是一次测试结果,每次测试结果放在字典中 64 for i in range(1,rows): 65 ''' 66 listRe[0]是第二行索引为1的测试结果,listRe[1]是第三行索引为2的测试结果,行值和数据存储存字典索引相差1 67 每次往第i行写数据 写 listRe[i-1]的数据 68 实际结果,i是行索引,cols-3是列的倒数第3个列,cols-2是列的倒数第2个列,cols-1是列的倒数第1个列 69 ''' 70 mudleTable.write(i,cols-3,listRe[i-1]['realyResult']) 71 # 测试结果 72 mudleTable.write(i,cols-2,listRe[i-1]['testResult']) 73 # 截图路径 74 mudleTable.write(i,cols-1,listRe[i-1]['pngPath']) 75 # 保存测试结果 76 excelMudle.save(reResultFiles) 77 78 def removeDir(dirPath): 79 ''' 80 删除Windows下文件夹里面的所有文件和子文件夹 81 :param dirPath: 要删除的文件夹路径 82 :return: None 83 ''' 84 # 读取要删除的目录下所有文件和子目录 85 listTopDir = os.listdir(dirPath) 86 for item in listTopDir: 87 # 如果是子目录则递归删除 88 if os.path.isdir(dirPath+'\'+item): 89 # 删除子目录中的文件 90 removeDir(dirPath+'\'+item) 91 # 删除子目录 92 os.rmdir(dirPath+'\'+item) 93 # 如果是文件则直接删除 94 else: 95 os.remove(dirPath+'\'+item) 96 97 def bugfreeLogin(driver,dic): 98 ''' 99 bugfree登录功能 100 :param driver: 浏览器对象 101 :param dic: dic数据字典 102 :return: 返回dicRe,字典内的键值对与 103 ''' 104 dicRe = {} 105 realyResult,testResult,pngPath='','','' 106 # 打开登录页面 107 driver.get(str(dic['url'])) 108 driver.find_element_by_id('LoginForm_username').clear() 109 # 输入用户名 110 driver.find_element_by_id('LoginForm_username').send_keys(str(dic['username'])) 111 driver.find_element_by_id('LoginForm_password').clear() 112 # 输入密码 113 driver.find_element_by_id('LoginForm_password').send_keys(str(dic['password'])) 114 # 点击登录按钮 115 driver.find_element_by_id('SubmitLoginBTN').click() 116 time.sleep(3) 117 #获取提示信息用于判断测试结果,如果登录成功则判断页面展示"欢迎, 系统管理员",如果登录失败则判断提示信息 118 try: 119 # 登录成功 120 realyResult = driver.find_element_by_css_selector('.user-info').text 121 except: 122 # 登录失败,取提示信息 123 realyResult = driver.find_element_by_id('login-error-div').text 124 else: 125 #登录成功,退出系统 126 driver.find_element_by_link_text('退出').click() 127 128 #判断结果 129 if (dic['yuqiResult'] in realyResult): # 预期结果与实际结果一致 130 # 记录测试结果 131 testResult = 'PASS' 132 else: ##预期结果与实际结果不一致 133 # 记录测试结果 134 testResult = 'FAIL' 135 # 保存路径 136 pngPath = os.getcwd() + '\errorPng\' + time.strftime('%Y-%m-%d %H-%M-%S', time.localtime()) + '.png' 137 # 截图保存在pngPath变量存储的路径中 138 driver.get_screenshot_as_file(pngPath) 139 # 往测试结果字典中插入一条测试数据,存储的内容以realyResult、testResult、pngPath为键值 140 dicRe.update({'realyResult': realyResult, 'testResult': testResult, 'pngPath': pngPath}) 141 return dicRe 142 143 if __name__ == '__main__': 144 # 调用removeDir删除report目录下的所有文件或目录 145 removeDir(os.getcwd()+'\report') 146 # 调用removeDir删除errorpng目录下的所有文件或目录 147 removeDir(os.getcwd()+'\errorpng') 148 # 启动Firefox驱动 149 driver = webdriver.Firefox() 150 # 设置driver驱动的全局定时等待最长时间为5秒 151 driver.implicitly_wait(5) 152 # 定义空的列表,用于存储测试字典数据 153 listRe= [] 154 # 取到测试数据的excel文档路径 155 fpath = os.getcwd()+'\testData\bugfree_login.xls' 156 # 取到excel表中页签为login的表 157 sheetName = 'login' 158 # 结果文档的路径 159 resultPath= os.getcwd()+'\report\test_result '+time.strftime('%Y-%m-%d %H-%M-%S',time.localtime())+'.xls' 160 # 读取测试数据 161 list1 = getTestData(fpath,sheetName) 162 # 此循环用于遍历测试用例中的用例数 163 for i in list1: 164 # 每一条测试数据,执行一次登录 165 dicResult = bugfreeLogin(driver,i) 166 # 往列表中存储我们测试结果中的字典数据 167 listRe.append(dicResult) 168 print listRe 169 #往测试结果文档写数据:复制测试数据文档+写入:实际结果、测试结果、截图路径 170 writeResultToExcel(fpath, sheetName, listRe, resultPath) 171 # 关闭所有浏览器 172 driver.quit()