#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. Dom 兼容处理

    获取子节点:childNodes 在IE下是可以正常使用的 但是在FF包含了文本节点需要配合nodeType做个类型判断  1是元素节点  3是文本节点 也可以采用 children IE       ...

  2. SpringBoot使用HttpClient远程调用

    一. Get请求 try { //拼接url url = url+"access_token="+token+"&department_id=1&fetc ...

  3. Python类的私有属性

    class Bar(object): __age = 18 sex = 'male' def __init__(self, ): pass def f(self): print(self.__age) ...

  4. iptables 扩展匹配 第三章

    获取帮助: centos 6 :man iptables centos 7: man iptables-extensions 扩展匹配: 隐式扩展:当使用-p指定某一协议之后,协议自身所支持的扩展就叫 ...

  5. java限制map大小,并FIFO淘汰

    有时候需要往一个MAP中写入一些记录,但又怕无限制地写入会导致内存爆掉,所以得限制这个MAP的大小. 实现:LinkedHashMap提供了简单的方法. 首先,定义一个最大数,比如1000,然后new ...

  6. webpack 几个基本打包扩展项的安装命令

    网速比较慢的童鞋,装包时请准备好花生瓜子 webpack 本身只能打包 JavaScript 模块,但是它可以通过拓展打包比如静态资源文件.less.sass.typescript 等,还可以通过 b ...

  7. eclipse软件仿真操作

    1.编写程序代码(以SDRAM为例) 1.1 编写head.s汇编文件 .equ SDRAM_BASE, 0x30000000 .equ MEM_CTL_BASE, 0x48000000 .text ...

  8. shadows

    http://blog.51cto.com/11975865/2308030 https://www.jianshu.com/p/247cdbabf389 https://baijiahao.baid ...

  9. eclipse的springboot插件

    eclipse的springboot插件官网下载地址还喜欢捉迷藏,正确的下载路径修改方法: 点击zip,然后复制出官网路径如下 http://download.springsource.com/rel ...

  10. Windows下nginx+tomcat实现简单的负载均衡

    Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请 ...