自动化测试-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 ...
随机推荐
- SSH服务理论+实践
1)远程管理服务知识介绍 SSH远程登录服务介绍说明 01. SSH-Secure Shell Protocol 安全加密shel协议 SSH远程登录服务功能作用 01. 提供类似telnet远程登录 ...
- CSS 初知
CSS 初知 举例 人 { 身高:175cm; 体重:70kg; 肤色:黄色 } 描述 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通 ...
- java笔记 -- GregorianCalendar和DateFormateSymbols 类方法
java.util.GregorianCalendar new GregorianCalendar() 构造一个日历对象, 用于表示默认地区,默认时区的当前时间. new GregorianCalen ...
- 无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据
背景 在做接口自动化的过程中,接口返回的数据是 列表字典循环嵌套 格式的,所以怎样通过一个key值,获取到被包裹了多层的目标数据成为了摆在我面前的一个问题. 一开始没想自己写,但是搜索后发现虽然很 ...
- spring/java ---->记录和整理用过的注解以及spring装配bean方式
spring注解 @Scope:该注解全限定名称是:org.springframework.context.annotation.Scope.@Scope指定Spring容器如何创建Bean的实例,S ...
- 广工十四届校赛 count 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470 题意:求,直接矩阵快速幂得f(n)即可 构造矩阵如下: n^3是肯定得变换的,用二项式展开来一点 ...
- java线程自带队列的使用以及线程阻塞
java线程,设置队列的大小实现队列阻塞 public class QueueThreads { private static int nThreads = 4;//Runtime.getRuntim ...
- weex playGround 扫码空白问题
首先安装 weex debug 用 weex debug调试可以看到报错 我做的demo扫码扫不出来 是因为:class的原因 weex中:class只支持数组形式 或者 换成:style就可以 ...
- 网络(socket)编程
一.网络协议 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器 C/S架构与socket的关系: ...
- FTP:500 OOPS: failed to open vsftpd log file:/var/log/vsftpd.log
如下:从10.12.8.165 FTP 到 10.1.3.34,报failed to open vsftpd log[a4_csbdc@localhost ~]$ ftp 10.1.3.34Conn ...