#encoding=utf-8
import xlrd,time,os
from xlutils.copy import copy
from selenium import webdriver def getTestData(excelPath,sheetName):
'''
定义从excel文件中获取数据
:param excelPath: excel文件路径
:param sheetName: 表格中的页签名
:return: 返回测试数据字段
'''
# 打开存有测试数据的excel
xl = xlrd.open_workbook(excelPath)
# 指定打开某个页签的table
table = xl.sheet_by_name(sheetName)
# 获取表中的第一行,用来做字典的key进行存储,返回的是列表从第一列到最后一列
listKey = table.row_values(0)
# 用于存放测试数据
listTestData = []
# 外围for循环取到的是行
for i in range(1,table.nrows):
# 将存取的每次数据存在空字典内
dicData = {}
# 内部for循环取到的是列
for j in range(0,table.ncols):
# key为第一行的每列,value为每行的列值
dicData.update({listKey[j]:table.cell_value(i,j)})
listTestData.append(dicData)
print('取到的数据为:')
# 遍历取到的每行数据
for rowData in listTestData:
print(rowData)
# 返回测试数据
return listTestData def writeResultToExcel(excelPath,sheetName,listRe,reResultFiles):
'''
定义函数,先复制测试用例表格模板,再往里面写入实际结果,测试结果以及截图路径
:param excelPath: 需要复制的excel模板路径
:param sheetName: 被复制末班中的页签名
:param listRe: 列表类型,其内部数据为字典类型,列表中包含实际结果,测试结果,截图路径的存取数据字典
:param reResultFiles: 写入完成后保存的excel路径
:return:
'''
# 打开指定路径的excel文件
xl = xlrd.open_workbook(excelPath,encoding_override='utf-8')
# 打开对应页签的表
table = xl.sheet_by_name(sheetName)
# 复制模板
excelMudle = copy(xl)
# 获取到sheetName对应的表
mudleTable = excelMudle.get_sheet(sheetName)
# 获取模板表中有多少列数
cols = table.ncols
# 获取模板表中有多少行数
rows = table.nrows
for rowsName in listRe[0].keys():
# 每次往第一行最新的列写入表头
mudleTable.write(0,cols,rowsName)
# 列索引往后移动一位
cols+=1
#逐行写数据,从第2行开始写,写到最后一行,每行是一次测试结果,每次测试结果放在字典中
for i in range(1,rows):
'''
listRe[0]是第二行索引为1的测试结果,listRe[1]是第三行索引为2的测试结果,行值和数据存储存字典索引相差1
每次往第i行写数据 写 listRe[i-1]的数据
实际结果,i是行索引,cols-3是列的倒数第3个列,cols-2是列的倒数第2个列,cols-1是列的倒数第1个列
'''
mudleTable.write(i,cols-3,listRe[i-1]['realyResult'])
# 测试结果
mudleTable.write(i,cols-2,listRe[i-1]['testResult'])
# 截图路径
mudleTable.write(i,cols-1,listRe[i-1]['pngPath'])
# 保存测试结果
excelMudle.save(reResultFiles) def removeDir(dirPath):
'''
删除Windows下文件夹里面的所有文件和子文件夹
:param dirPath: 要删除的文件夹路径
:return: None
'''
# 读取要删除的目录下所有文件和子目录
listTopDir = os.listdir(dirPath)
for item in listTopDir:
# 如果是子目录则递归删除
if os.path.isdir(dirPath+'\\'+item):
# 删除子目录中的文件
removeDir(dirPath+'\\'+item)
# 删除子目录
os.rmdir(dirPath+'\\'+item)
# 如果是文件则直接删除
else:
os.remove(dirPath+'\\'+item) def bugfreeLogin(driver,dic):
'''
bugfree登录功能
:param driver: 浏览器对象
:param dic: dic数据字典
:return: 返回dicRe,字典内的键值对与
'''
dicRe = {}
realyResult,testResult,pngPath='','',''
# 打开登录页面
driver.get(str(dic['url']))
driver.find_element_by_id('LoginForm_username').clear()
# 输入用户名
driver.find_element_by_id('LoginForm_username').send_keys(str(dic['username']))
driver.find_element_by_id('LoginForm_password').clear()
# 输入密码
driver.find_element_by_id('LoginForm_password').send_keys(str(dic['password']))
# 点击登录按钮
driver.find_element_by_id('SubmitLoginBTN').click()
time.sleep(3)
#获取提示信息用于判断测试结果,如果登录成功则判断页面展示"欢迎, 系统管理员",如果登录失败则判断提示信息
try:
# 登录成功
realyResult = driver.find_element_by_css_selector('.user-info').text
except:
# 登录失败,取提示信息
realyResult = driver.find_element_by_id('login-error-div').text
else:
#登录成功,退出系统
driver.find_element_by_link_text('退出').click() #判断结果
if (dic['yuqiResult'] in realyResult): # 预期结果与实际结果一致
# 记录测试结果
testResult = 'PASS'
else: ##预期结果与实际结果不一致
# 记录测试结果
testResult = 'FAIL'
# 保存路径
pngPath = os.getcwd() + '\\errorPng\\' + time.strftime('%Y-%m-%d %H-%M-%S', time.localtime()) + '.png'
# 截图保存在pngPath变量存储的路径中
driver.get_screenshot_as_file(pngPath)
# 往测试结果字典中插入一条测试数据,存储的内容以realyResult、testResult、pngPath为键值
dicRe.update({'realyResult': realyResult, 'testResult': testResult, 'pngPath': pngPath})
return dicRe if __name__ == '__main__':
# 调用removeDir删除report目录下的所有文件或目录
removeDir(os.getcwd()+'\\report')
# 调用removeDir删除errorpng目录下的所有文件或目录
removeDir(os.getcwd()+'\\errorpng')
# 启动Firefox驱动
driver = webdriver.Firefox()
# 设置driver驱动的全局定时等待最长时间为5秒
driver.implicitly_wait(5)
# 定义空的列表,用于存储测试字典数据
listRe= []
# 取到测试数据的excel文档路径
fpath = os.getcwd()+'\\testData\\bugfree_login.xls'
# 取到excel表中页签为login的表
sheetName = 'login'
# 结果文档的路径
resultPath= os.getcwd()+'\\report\\test_result '+time.strftime('%Y-%m-%d %H-%M-%S',time.localtime())+'.xls'
# 读取测试数据
list1 = getTestData(fpath,sheetName)
# 此循环用于遍历测试用例中的用例数
for i in list1:
# 每一条测试数据,执行一次登录
dicResult = bugfreeLogin(driver,i)
# 往列表中存储我们测试结果中的字典数据
listRe.append(dicResult)
print listRe
#往测试结果文档写数据:复制测试数据文档+写入:实际结果、测试结果、截图路径
writeResultToExcel(fpath, sheetName, listRe, resultPath)
# 关闭所有浏览器
driver.quit()

自动化测试-18.selenium之bugFree代码注释的更多相关文章

  1. 自动化测试-20.selenium常用JS代码执行

    前言: 在工作中有些控件定位不到,需要操作,使用JS代码去修改或者操作达到selenium不能做的操作. 1.Web界面的滑动 1 #coding:utf-8 2 from selenium impo ...

  2. 小白学 Python 爬虫(28):自动化测试框架 Selenium 从入门到放弃(下)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  3. 《零成本实现Web自动化测试--基于Selenium》 第五章 Selenium-RC

    一. 简介 Selenium-RC可以适应更复杂的自动化测试需求,而不仅仅是简单的浏览器操作和线性执行.Selenium-RC能够充分利用编程语言来构建更复杂的自动化测试案例,例如读写文件.查询数据库 ...

  4. C++统计代码注释行数 & 有效代码行数 & 代码注释公共行 & 函数个数

    问题来源,在14年的暑假的一次小项目当中遇到了一个这样的问题,要求统计C++代码的注释行数,有效代码行数,代码注释公共行数,以及函数个数. 下面稍微解释一下问题, 1)注释行数:指有注释的行,包括有代 ...

  5. 篇5 python自动化测试应用-Selenium环境篇

    篇5                            python自动化测试应用-Selenium环境篇 --lamecho 1.1概要 大家好!我是lamecho(辣么丑),从本篇开始我将开始 ...

  6. eoLinker 新功能发布,增加了识别代码注释自动生成文档功能

    产品地址:https://www.eolinker.com开源代码:https://www.eolinker.com/#/os/download在线生成代码注释工具:http://tool.eolin ...

  7. Python用户输入和代码注释

    一.用户输入 若你安装的是Python3.x版本,当你在Python IDLE(编辑器) 中输入以下代码: name = input('用户名:') print('Hello',name) 保存并执行 ...

  8. Kotlin------函数和代码注释

    定义函数 Kotlin定义一个函数的风格大致如下 访问控制符 fun 方法名(参数,参数,参数) : 返回值类型{ ... ... } 访问控制符:与Java有点差异,Kotlin的访问范围从大到小分 ...

  9. linux内核代码注释 赵炯 第三章引导启动程序

    linux内核代码注释 第三章引导启动程序 boot目录中的三个汇编代码文件   bootsect.s和setup.s采用近似intel的汇编语法,需要8086汇编器连接器as86和ld86 head ...

随机推荐

  1. Jquery回到顶部效果

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  2. 从路由器镜像中提取uImage头信息

    uImage header为64字节,文件头为27 05 19 56 hexdump -C a.bin | grep "27 05 19 56" 或者 hd aa.bin | gr ...

  3. mysql-5.7.17-winx64压缩版的安装包下载和安装配置

    网上有很多的安装配置步骤,但是一个跟一个遇到的问题不一样,总之越是写的完整的人,遇到的错误越多,在安装过程中也就越悲催!第一步:下载mysql安装包---下载网址https://downloads.m ...

  4. topcoder srm 585 div1

    problem1 link 最优的策略就是从最低下一层开始,每两层的三个节点的子树都可以用一次遍历覆盖. problem2 link 从大到小依次放置每一种数字,并记录已经放置的数字一共有多少个$m$ ...

  5. topcoder srm 580 div1

    problem1 link 最优选择一定是在$2n$个端点中选出两个. problem2 link 分开考虑每个区间.设所有区间的左端点的最大值为$lc$,所有区间的右端点的最小值为$rc$.对于某个 ...

  6. Bootstrap 可视化HTML编辑器,summernote

    Bootstrap 可视化HTML编辑器之summernote,用其官网上的介绍就是"Super Simple WYSIWYG editor",不过在我看来,与bootstrap中 ...

  7. 3、基于多播、安全认证的corosync集群(VIP、Httpd、Filesystem)

    Messaging Layer --> CRM --> RA systemd:/usr/lib/systemd/system     systemd有一个特性,即便一个服务开机启动,但是在 ...

  8. _recruit

  9. 基于虹软的Android的人脸识别SDK使用测试

    现在有很多人脸识别的技术我们可以拿来使用:但是个人认为还是离线端的SDK比较实用:所以个人一直在搜集人脸识别的SDK:原来使用开源的OpenCV:最近有个好友推荐虹软的ArcFace, 闲来无事就下来 ...

  10. mysql数据库通过二进制 -【恢复数据记录】

    1.修改配置文件 vi /etc/my.cnf log-bin = binlog systemctl restart mysqld mysql -uroot -p123456 mysql> sh ...