自动化领域的两种驱动,对象驱动与数据驱动

  • 数据驱动:测试数据的改变引起执行结果的改变 叫 数据驱动
  • 关键字驱动:测试对象名字的改变起引起测试结果的改变 叫 关键字驱动

1 、读取文件参数化
   以百度表搜索为例,我们可以通过脚本循环执行,读取一文件中不同的内容来完成自动
化工作,也就是说我们每次取的文件里的搜索关键字不同,而每次百度搜索的的结果不同,
这也是数据驱动的本质。

代码如下:
d:\abc\data.txt
baidu_read_data.py

#coding=utf-8
from selenium import webdriver
import os,time
source = open("D:\\abc\\data.txt", "r")
values = source.readlines()
source.close()
# 执行循环
for serch in values:
browser = webdriver.Firefox()
browser.get("http://www.baidu.com")
browser.find_element_by_id("kw").send_keys(serch)
browser.find_element_by_id("su").click()
browser.quit()

这里简单说明一下,open 方法左以只读方式(r)打开本地的 data.txt 文件,readlines方法是逐行的读取文件内容。

通过 for 循环,serch 可以每次获取到文件中的一行数据,在定位到百度的输入框后,
将数据传入 send_keys(serch)。这样通过循环调用,直到文件的中的所有内容全被读取。
2 、用户名密码的参数化(读取文件)

后面的例子一登录百度为例,主要是读取文件(因为百度的登录时,需要验证码,所以也没不会登录成功)

按照上面的方法,对自动化脚本中用户名密码进行参数化,从目前所查到 python 读取方法有,整个文件读取,逐行读取,固定字节读取。

怎样才一次读取用户名和密码两个信息呢,最初的修改是这样的:
创建两个文件,分别存放用户名密码
调用用户名密码登录登录的脚本

#coding=utf-8
from selenium import webdriver
import os,time
source = open("D:\\abc\\data2.txt", "r") #用户名文件
user = source.read(5) #用户名长度
source.close()
source2 = open("D:\\abc\\data3.txt", "r") #密码文件
pw = source2.read(6) #密码长度
source2.close()
driver = webdriver.Firefox()
driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F")
driver.find_element_by_id("TANGRAM__PSP_3__userName").clear()
driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(k)
time.sleep(3)
driver.find_element_by_id("TANGRAM__PSP_3__password").clear()
driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(v)
time.sleep(3)
driver.find_element_by_id("TANGRAM__PSP_3__submit").click()
time.sleep(3)
driver.close()

缺点:

虽然目的达到了这,但这样的实现有很多问题:

  • 用户名密码分别在不同的文件里,这样就要求用户名密码必须一一对应
  • 必须指定读取的长度,测试 readlines() 并不是读取的一行数据。
  • 无法循环读取。

3 、用户名的参数化(字典)
  用户名密码参数化
 解决循环调用
如果固定只是读取用户名,密码两个值,可以通过如下方法实现。
创建 fun.py 文件,定义一个字典方法(方法文件和case文件放在一个根目录下):

def zidian():
d={'fnngj':'a23456','testing360':123456}
print "suess read username and password!!"
return d

字典的可以方便的存放 k,v 键值对,一个键对应一个值;注意,如果密码中有非数字,需要加单引号。

下面循环调用词典的值:

#coding=utf-8
from selenium import webdriver
import os,time
import fun #导入函数
#循环调用字典里的用户名密码,分别赋值给 k,v
for k,v in fun.zidian().items():
driver = webdriver.Firefox()
driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F")
driver.find_element_by_id("TANGRAM__PSP_3__userName").clear()
driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(k)
time.sleep(3)
driver.find_element_by_id("TANGRAM__PSP_3__password").clear()
driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(v)
time.sleep(3)
driver.find_element_by_id("TANGRAM__PSP_3__submit").click()
time.sleep(3)
driver.close()

脚本这样表设计就稳定了很多,每次取的值非常固定,而且同样实现了参数与脚本分离,如果几百个脚本都调用 fun( ) 函数,当需要修改用户名密码时,只用修改 fun( )函数里面字

典的值就可以了。
4 、用户名密码的参数化(函数)
其实,在项目中只需要做到参数化就行了,并不需要循环的读取内容。那么通过函数调用就可以很简单的解决。
首先定义fun.py,(方法文件和case文件放在一个根目录下)

def user(k='fnngj',v=123456):
  print "suess read username and password!!"
  return k,v

赋默认值,并将结果返回。

调用函数值:

#coding=utf-8
from selenium import webdriver
import os,time
#导入函数
import fun
#通过调用函数获得用户名&密码
k,v = fun.user()
print k,v
driver = webdriver.Firefox()
driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F")
driver.find_element_by_id("TANGRAM__PSP_3__userName").clear()
driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(k)
driver.find_element_by_id("TANGRAM__PSP_3__password").clear()
driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(v)
driver.find_element_by_id("TANGRAM__PSP_3__submit").click()
time.sleep(3)
driver.close()

 运行结果:

>>> =================== RESTART ================================
>>>
suess read username and password!!
fnngj 123456
.
----------------------------------------------------------------------
Ran 1 test in 25.484s
OK

selenium+python(数据驱动测试)的更多相关文章

  1. Selenium WebDriver 数据驱动测试框架

    Selenium WebDriver 数据驱动测试框架,以QQ邮箱添加联系人为示例,测试框架结构如下图,详细内容请阅读吴晓华编著<Selenium WebDiver 实战宝典>: Obje ...

  2. Python Selenium 之数据驱动测试

    数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据.可以将测 ...

  3. Python Selenium 之数据驱动测试的实现

    数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据.可以将测 ...

  4. selenium + python + firefox 测试环境的搭建与配置

    对于做UI自动化,如果是纯编写一段自动化测试程序,那么后续的维护成本会较高.这种情况下,借助 selenium 这款自动化系测试工具,辅助于自己编写部分脚本,将是个不错的选择.selenium 本身支 ...

  5. python - 数据驱动测试 - ddt

    # -*- coding:utf-8 -*- ''' @project: jiaxy @author: Jimmy @file: study_ddt.py @ide: PyCharm Communit ...

  6. selenium+python 数据驱动-csv篇,可封装

    #循环读取csv文件中的数据,可以作为用户名,密码等使用from selenium import webdriverimport csv#获取csv文件中password列with open(r'C: ...

  7. selenium+python 数据驱动-txt篇

    #循环读取txt文件中的数据,可以作为用户名,密码等使用from selenium import webdriver #创建两个列表user=[]pwd=[]f=open(r'C:\bbs\data\ ...

  8. python for selenium 数据驱动测试

    # -*- coding:utf-8 -*- """ 数据驱动测试,从 csv 文件中读取数据 """ from selenium impo ...

  9. Python+Selenium笔记(十二):数据驱动测试

    (一)   前言 通过使用数据驱动测试,实现对输入值和预期结果的参数化.(例如:输入数据和预期结果可以直接读取Excel文档的数据) (二)   ddt 使用ddt执行数据驱动测试,ddt库可以将测试 ...

随机推荐

  1. js 操作cookie cookie路径问题

    这里主要不是讲这个方法,js写cookie这种代码网上一抓一把,在使用的时候遇到一点问题,就是写的cookie 是有路径问题的,在user目录下可以使用跳转到另外一个目录下cookie,经过比较coo ...

  2. VS2013启动越来越慢

    Q.VS2013 原来启动只要大概 一两秒的时间,现在启动最少也得十秒以上.而且打开项目也变得很慢了!求解决方案. A.清理一下缓存就好了. VS2010清理缓存:第一:启用vs2010命令行工具:在 ...

  3. Windows7系统安装TensorFlow深度学习框架全过程

    本来以为很好安装的一个东西,硬是从晚上九点搞到十二点,安装其实并不难,主要是目前网上的教程有很多方案完全不一样,有根据pip安装的,有根据docker安装的等等,看得我眼花缭乱,好不容易找到一个靠谱点 ...

  4. orcal 锁表

    --查询Oracle正在执行的sql语句及执行该语句的用户 SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, ...

  5. C++ 莫队算法(转)

    胡小兔的良心莫队教程:莫队.带修改莫队.树上莫队   在开始学习莫队之前,照例先甩一道例题:BZOJ 1878 HH的项链. 题意:求区间内数的个数,相同的数只算一次. 在我关于这道题的上一篇题解中, ...

  6. code::blocks学习

    code::block不能调试问题 今天在codeblock不能进行调试,百度总结如下: 1 进行调试的必须是一个project而不能是一个单一的cpp文件. 2 project的路径不能包含中文,尽 ...

  7. 贪心——Prim算法(避圈法)

    1.简介 Prim算法是图论中的一种算法,可在带权连通图里搜索产生最小生成树. 该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(Vojtěch Jarník)发现:并在1957年由美国计算机科学家罗 ...

  8. QTREE5 - Query on a tree V(LCT)

    题意翻译 你被给定一棵n个点的树,点从1到n编号.每个点可能有两种颜色:黑或白.我们定义dist(a,b)为点a至点b路径上的边个数. 一开始所有的点都是黑色的. 要求作以下操作: 0 i 将点i的颜 ...

  9. [ActionScript 3.0] AS3 弹性运动

    package com.views { import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; ...

  10. 使用 webpack 搭建 React 项目

    简评:相信很多开发者在入门 react 的时候都是使用 create-react-app 或 react-slingshot 这些脚手架来快速创建应用,当有特殊需求,需要修改 eject 出来的 we ...