自动化测试-18.selenium之bugFree代码注释
#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代码注释的更多相关文章
- 自动化测试-20.selenium常用JS代码执行
前言: 在工作中有些控件定位不到,需要操作,使用JS代码去修改或者操作达到selenium不能做的操作. 1.Web界面的滑动 1 #coding:utf-8 2 from selenium impo ...
- 小白学 Python 爬虫(28):自动化测试框架 Selenium 从入门到放弃(下)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 《零成本实现Web自动化测试--基于Selenium》 第五章 Selenium-RC
一. 简介 Selenium-RC可以适应更复杂的自动化测试需求,而不仅仅是简单的浏览器操作和线性执行.Selenium-RC能够充分利用编程语言来构建更复杂的自动化测试案例,例如读写文件.查询数据库 ...
- C++统计代码注释行数 & 有效代码行数 & 代码注释公共行 & 函数个数
问题来源,在14年的暑假的一次小项目当中遇到了一个这样的问题,要求统计C++代码的注释行数,有效代码行数,代码注释公共行数,以及函数个数. 下面稍微解释一下问题, 1)注释行数:指有注释的行,包括有代 ...
- 篇5 python自动化测试应用-Selenium环境篇
篇5 python自动化测试应用-Selenium环境篇 --lamecho 1.1概要 大家好!我是lamecho(辣么丑),从本篇开始我将开始 ...
- eoLinker 新功能发布,增加了识别代码注释自动生成文档功能
产品地址:https://www.eolinker.com开源代码:https://www.eolinker.com/#/os/download在线生成代码注释工具:http://tool.eolin ...
- Python用户输入和代码注释
一.用户输入 若你安装的是Python3.x版本,当你在Python IDLE(编辑器) 中输入以下代码: name = input('用户名:') print('Hello',name) 保存并执行 ...
- Kotlin------函数和代码注释
定义函数 Kotlin定义一个函数的风格大致如下 访问控制符 fun 方法名(参数,参数,参数) : 返回值类型{ ... ... } 访问控制符:与Java有点差异,Kotlin的访问范围从大到小分 ...
- linux内核代码注释 赵炯 第三章引导启动程序
linux内核代码注释 第三章引导启动程序 boot目录中的三个汇编代码文件 bootsect.s和setup.s采用近似intel的汇编语法,需要8086汇编器连接器as86和ld86 head ...
随机推荐
- SSM项目思路整合NEW
#首先进行项目思路整体分析,具体包括哪些模块,如何实现等: 一)搭建环境 1.导包: (Spring核心包4个 + 面向切面的包4个 + SpringJDBC和事务的包各一个, SpringMVC两个 ...
- Vue 组件&组件之间的通信 之组件的介绍
什么是组件? 组件Component,可扩展HTML元素,封装可重用的代码.通俗的来说,组件将可重用的HTML元素封装成为标签方便复用: 组件的使用: 1.使用全局的方法Vue.extend创建构造器 ...
- Dockerfile构建容器---构建本地tomcat
前序 这是我第一次摸索.做个笔记记录一下. 首先准备好tomcat与jdk解压到与Dockerfile同级的目录下, 构建文件命名必须为Dockerfile, 为什么同级, 因为build的时候会默认 ...
- js前端文件收集(一)
1.保存cookies的文件: /** * Cookie plugin * * Copyright (c) 2006 Klaus Hartl (stilbuero.de) * Dual license ...
- FFT 快速傅里叶变换 学习笔记
FFT 快速傅里叶变换 前言 lmc,ikka,attack等众多大佬都没教会的我终于要自己填坑了. 又是机房里最后一个学fft的人 早背过圆周率50位填坑了 用处 多项式乘法 卷积 \(g(x)=a ...
- LOJ #10132. 「一本通 4.4 例 3」异象石
题目地址 LOJ 题解 神仙思路.思路参考自<算法竞赛进阶指南>. 考虑维护dfs序中相邻两个石头的距离,那么每次?的答案就是sum/2(首尾算相邻) 然后维护一下拿个平衡树/set维护一 ...
- P3649 [APIO2014]回文串
思路 回文自动机 回文自动机的fail[i]就是编号为i的这个字符串的最长的回文后缀的编号,然后len[i]表示编号为i的回文串的长度,cnt[i]表示编号为i的回文串的出现次数 然后trans边就是 ...
- Zedboard初体验
前言 这是我学习Zedboard时做的笔记 Zedboard是什么 Zedboard是Xilinx公司推出的搭载了Zynq芯片的开发板,其中Zynq芯片采用全新的设计理念,将ARM处理器嵌入FPGA可 ...
- 『Python CoolBook』C扩展库_其四_结构体操作与Capsule
点击进入项目 一.Python生成C语言结构体 C语言中的结构体传给Python时会被封装为胶囊(Capsule), 我们想要一个如下结构体进行运算,则需要Python传入x.y两个浮点数, type ...
- PIL合并4张图demo 800px以下的居中显示小例子
from PIL import Image #新建一个空白文件 大小为1600*1600 颜色为白色 newIm= Image.new('RGB', (1600, 1600), 'white') #打 ...