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()