简介:

数据驱动excel驱动方式,就是数据配置在excel里面,主程序调用的时候每次用从excel里取出的数据作为参数,进行操作,

需要掌握的地方是对excel的操作,要灵活的找到目标数据

测试数据.xlsx:

路径-D:\test\0627

ExcelUtil.py:

#encoding=utf-8
from openpyxl import load_workbook

class ParseExcel(object):

def __init__(self, excelPath, sheetName):
        # 将要读取的excel加载到内存
        self.wb = load_workbook(excelPath)
        # 通过工作表名称获取一个工作表对象
        self.sheet = self.wb.get_sheet_by_name(sheetName)
        # 获取工作表中存在数据的区域的最大行号
        self.maxRowNum = self.sheet.max_row

def getDatasFromSheet(self):
        # 用于存放从工作表中读取出来的数据
        dataList = []
        # 因为工作表中的第一行是标题行,所以需要去掉
        for line in self.sheet.rows:  
            # 遍历工作表中数据区域的每一行,
            # 并将每行中各个单元格的数据取出存于列表tmpList中,
            # 然后再将存放一行数据的列表添加到最终数据列表dataList中
            tmpList = []
            tmpList.append(line[1].value)
            tmpList.append(line[2].value)
            dataList.append(tmpList)
        # 将获取工作表中的所有数据的迭代对象返回
        return dataList[1:]

if __name__ == '__main__':
    excelPath = u'E:\\数据驱动\\测试数据.xlsx'
    sheetName = u"搜索数据表"
    pe = ParseExcel(excelPath, sheetName)
    print pe.getDatasFromSheet()
    for i in pe.getDatasFromSheet():
        print i[0], i[1]

加print调试日志:
#encoding=utf-8
from openpyxl import load_workbook

class ParseExcel(object):
    def __init__(self,excelPath,sheetName):
        self.wb=load_workbook(excelPath)
        self.sheet=self.wb.get_sheet_by_name(sheetName)
        self.maxRowNum=self.sheet.max_row

def getDatasFromSheet(self):
        dataList=[]
        for line in self.sheet.rows:
            tmpList=[]
            tmpList.append(line[1].value)
            print "line[1].value",line[1].value
            tmpList.append(line[2].value)
            print "line[2].value",line[2].value
            dataList.append(tmpList)
        print dataList[1:]
        return dataList[1:]

if __name__=='__main__':
    excelPath=u"d:\\test\\0627\\测试数据.xlsx"
    sheetName=u"搜索数据表"
    pe=ParseExcel(excelPath,sheetName)
    print pe.getDatasFromSheet()
    for i in pe.getDatasFromSheet():
        print i[0],i[1]
单独运行结果:
D:\test\0627>python  ExcelUtil.py
ExcelUtil.py:7: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
  self.sheet=self.wb.get_sheet_by_name(sheetName)
line[1].value 搜索词
line[2].value 期望结果
line[1].value 邓肯
line[2].value 蒂姆
line[1].value 乔丹
line[2].value 迈克尔
line[1].value 库里
line[2].value 斯蒂芬
[[u'\u9093\u80af', u'\u8482\u59c6'], [u'\u4e54\u4e39', u'\u8fc8\u514b\u5c14'], [u'\u5e93\u91cc', u'\u65af\u8482\u82ac']]
[[u'\u9093\u80af', u'\u8482\u59c6'], [u'\u4e54\u4e39', u'\u8fc8\u514b\u5c14'], [u'\u5e93\u91cc', u'\u65af\u8482\u82ac']]
line[1].value 搜索词
line[2].value 期望结果
line[1].value 邓肯
line[2].value 蒂姆
line[1].value 乔丹
line[2].value 迈克尔
line[1].value 库里
line[2].value 斯蒂芬
[[u'\u9093\u80af', u'\u8482\u59c6'], [u'\u4e54\u4e39', u'\u8fc8\u514b\u5c14'], [u'\u5e93\u91cc', u'\u65af\u8482\u82ac']]
邓肯 蒂姆
乔丹 迈克尔
库里 斯蒂芬

最后运行的脚本:

data_drivern_by_excel.py:

#encoding=utf-8
from selenium import webdriver
import unittest,time
import logging,traceback
import ddt
from ExcelUtil import ParseExcel
from selenium.common.exceptions import NoSuchElementException

#初始化日志对象
logging.basicConfig(
    #日志级别
    level=logging.INFO,
    #日志格式
    #时间、代码所在文件名、代码行号、日志级别名称、日志信息
    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    #打印日志的时间
    datefmt='%a,%Y-%m-%d %H:%M:S',
    #日志文件存放的目录(目录必须存在)及日志文件名
    filename='d:\\test\\0627\\report.log',
    #打开日志文件的方式
    filemode='w'
)

excelPath=u"d:\\test\\0627\\测试数据.xlsx"
sheetName=u"搜索数据表"
#创建ParseExcel类的实例对象
excel=ParseExcel(excelPath,sheetName)

#数据驱动装饰器
@ddt.ddt
class TestDemo(unittest.TestCase):
    def setUp(self):
        self.driver=webdriver.Firefox(executable_path='c:\\geckodriver')
    
    @ddt.data(*excel.getDatasFromSheet())#对调用函数返回的含列表的列表进行解包,传过来的就是列表中的一个列表
    def test_dataDrivenByFile(self,data):
        print "tuple(data):",tuple(data)#把传过来的一个列表转换成元祖,包含两个元素,搜索值和期望值
        testData,expectData=tuple(data)
        print "testData:",testData#调试用
        print "expectData:",expectData#调试用
        url='http://www.baidu.com'
        #访问百度首页
        self.driver.get(url)
        #讲浏览器窗口最大化
        self.driver.maximize_window()
        #print testData,expectData   
        #设置隐式等待时间为10秒钟    
        self.driver.implicitly_wait(10)
        try:
            #获取当前的时间戳,用于后面计算查询耗时用
            start=time.time()
            #获取当前时间的字符串,表示测试开始时间
            startTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
            #找到搜索输入框,并输入测试数据
            self.driver.find_element_by_id('kw').send_keys(testData)
            #找到搜索按钮,并点击
            self.driver.find_element_by_id('su').click()
            time.sleep(3)
            #断言期望结果是否出现在页面源代码中
            self.assertTrue(expectData in self.driver.page_source)
            print u"搜索-%s,期望-%s"%(testData,expectData)

except NoSuchElementException,e:
            logging.error(u"查找的页面元素不存在,异常堆栈信息:"+str(traceback.format_exc()))
        except AssertionError,e:
            logging.info(u'搜索-"%s",期望-"%s",-失败'%(testData,expectData))
        except Exception,e:
            logging.error(u"未知错误,错误信息:"+str(traceback.format_exc()))
        else:
            logging.info(u'搜索- "%s",期望-"%s"-通过'%(testData,expectData))
    def tearDown(self):
        self.driver.quit()
    
if __name__=='__main__':
    unittest.main()
 
结果:

d:\test\0627>python test.py
d:\test\0627\ExcelUtil.py:11: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
  self.sheet=self.wb.get_sheet_by_name(sheetName)
tuple(data): (u'\u9093\u80af', u'\u8482\u59c6')
testData: 邓肯
expectData: 蒂姆
搜索-邓肯,期望-蒂姆
.tuple(data): (u'\u4e54\u4e39', u'\u8fc8\u514b\u5c14')
testData: 乔丹
expectData: 迈克尔
搜索-乔丹,期望-迈克尔
.tuple(data): (u'\u5e93\u91cc', u'\u65af\u8482\u82ac')
testData: 库里
expectData: 斯蒂芬
搜索-库里,期望-斯蒂芬
.
----------------------------------------------------------------------
Ran 3 tests in 45.614s

OK

report.log:

Fri,2018-06-29 11:18:S test.py[line:70] INFO 搜索- "邓肯",期望-"蒂姆"-通过
Fri,2018-06-29 11:18:S test.py[line:70] INFO 搜索- "乔丹",期望-"迈克尔"-通过
Fri,2018-06-29 11:18:S test.py[line:70] INFO 搜索- "库里",期望-"斯蒂芬"-通过

总结:

如果日志logging部分书写格式有问题、或者路径不存在、或者字符等有问题,日志就会输出到屏幕上,如果没有问题,才会打印到日志文件report.log中

数据驱动excel驱动方式和其他方式(txt等)原理大同小异,都是把数据从文件中取出来,用ddt模块进行解包,传进主程序,难点就是对不同的文件类型进行读取可能需要专门的程序包来处理,说白了,都是对基础的运用进行整合,真正项目中用到的肯定比这个要复杂。。。

 
 
 

python webdriver 测试框架-数据驱动excel驱动的方式的更多相关文章

  1. python webdriver 测试框架-数据驱动xml驱动方式

    数据驱动xml驱动的方式 存数据的xml文件:TestData.xml: <?xml version="1.0" encoding="utf-8"?> ...

  2. python webdriver 测试框架-数据驱动exce驱动,不用ddt的方式

    data.xlsx: 脚本: #encoding=utf-8from selenium import webdriverimport timeimport datetimefrom openpyxl ...

  3. python webdriver 测试框架-数据驱动txt文件驱动,带报告的例子

    数据驱动txt文件驱动的方式,带报告 data.txt: gloryroad test||光荣之路 摔跤爸爸||阿米尔 超人||电影 data_driven_by_txt_file.py: #enco ...

  4. python webdriver 测试框架-数据驱动json文件驱动的方式

    数据驱动json文件的方式 test_data_list.json: [ "邓肯||蒂姆", "乔丹||迈克尔", "库里||斯蒂芬", & ...

  5. python webdriver 测试框架-数据驱动DDT的例子

    先在cmd环境 运行 pip install ddt 安装数据驱动ddt模块  脚本: #encoding=utf-8 from selenium import webdriver import un ...

  6. python webdriver 测试框架-行为驱动例子

    安装行为驱动模块lettuce(卷心菜)模块 pip install lettuce Successfully installed argparse-1.4.0 colorama-0.3.9 extr ...

  7. python nose测试框架全面介绍十---用例的跳过

    又来写nose了,这次主要介绍nose中的用例跳过应用,之前也有介绍,见python nose测试框架全面介绍四,但介绍的不详细.下面详细解析下 nose自带的SkipTest 先看看nose自带的S ...

  8. python nose测试框架全面介绍七--日志相关

    引: 之前使用nose框架时,一直使用--logging-config的log文件来生成日志,具体的log配置可见之前python nose测试框架全面介绍四. 但使用一段时间后,发出一个问题,生成的 ...

  9. python nose测试框架全面介绍六--框架函数别名

    之前python nose测试框架全面介绍二中介绍了nose框架的基本构成,但在实际应该中我们也会到setup_function等一系列的名字,查看管网后,我们罗列下nose框架中函数的别名 1.pa ...

随机推荐

  1. Python 处理命令行参数

    optparse模块用于从命令行直接读取参数,用法基本与 argparse模块 一致,如下: #!/usr/bin/env python #-*- coding:utf-8 -*- from optp ...

  2. Linux之expect

    一,安装expect yum install expect 其实expect根bash形势上差不多的. 二,实例 1,ssh实现自动登录,并停在登录服务器上 查看复制打印? #!/usr/bin/ex ...

  3. windows下配置nutch注意的问题

    1.为处理方便,直接在$nutch目录下创建一个名为url.txt文件,然后在文件里添加要搜索的网址,例如:http://www.sina.com.cn/,注意网址最后的"/"一定 ...

  4. DNS隧道通信的检测

    DNS隧道通信的检测 DNS 隧道通信 DNS 隧道通信是C&C常用的通信方式,一般常用的编码方式Base64,Binary编码,NetBios编码等,Hex编码等.且请求的Type一般都是t ...

  5. Express 框架的安装

    从零开始用 Node.js 实现一个微博系统,功能包括路由控制.页面模板.数据库访问.用户注册.登录.用户会话等内容. Express 框架. MVC 设计模式. ejs 模板引擎 MongoDB 数 ...

  6. Egret3D学习笔记一 (Unity插件使用)

    一 官方教程: http://developer.egret.com/cn/github/egret-docs/Engine3D/getStarted/getStarted/index.html 大部 ...

  7. 【BZOJ3280】小R的烦恼 最小费用最大流

    [BZOJ3280]小R的烦恼 Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题. 问题是这样的 ...

  8. 【Android】Android--Dialog

    前言 对话框对于应用也是必不可少的一个组件,在Android中也不例外,对话框对于一些提示重要信息,或者一些需要用户额外交互的一些内容很有帮助.本篇博客就讲解一下Android下对话框的使用,在本篇博 ...

  9. eclipse 改变颜色,背景

    Eclipse背景颜色修改: 操作界面默认颜色为白色.对于我们长期使用电脑编程的人来说,白色很刺激我们的眼睛,所以我经常会改变workspace的背景色,使眼睛舒服一些.设置方法如下: 1.打开win ...

  10. 微信开发(3):微信公众号发现金红包功能开发,利用第三方SDK实现(转)

    最近需求是 用户兑换微信红包,需要一些验证,加密,以及证书: 工欲善其事必先利其器 感谢前辈的微信SDK 已经维护三年了,还在维护中! 官方文档走一波 文档还是一如既往的 坑人啊,写的很简单,对简单明 ...