关键字驱动是实现代码与脚本的分离,将元素的基础操作封装为一个类。
数据驱动是在关键字驱动的基础上,实现对同一脚本,用多组数据进行测试,提高代码复用性和扩展性。
本例主要实现将多组数据存入excle文件中,通过读取excle文件,进行多组数据测试。
实现文件读取需下载openpyxl包,实现数据驱动,需下载ddt包
优点与缺点
优点:
①在应用程序开发的同时就可以同步建立测试脚本,而且当应用功能变动时,只需要修改业务功能部分的脚本;②利用模型化的设计,避免重复的脚本,减少建立或维护脚本的成本;③测试输入数据,验证数据和预期的测试结果与脚本分开,存放在另外的数据文件里,利于测试人员修改和维护。
缺点:
①有一定的python语言功底;②每个脚本都会对应多个数据文件,这些数据文件需要根据脚本的功能类别存放在各自的目录中,增加了使用的复杂性;③测试人员除了需要根据具体测试数据维护相应的测试计划,还要将这些数据写入各个需求不同的数据文件中;④在编辑数据文件时,必须注意测试脚本所要求的传输格式,否则会在处理脚本时产生错误。比如本文中要求必须是xlsx扩展名的文件。
1.数据读取
import openpyxl
#应用
#三大组件 工作薄 工作表 单元格
class getdata:
def get(self):
wk=openpyxl.load_workbook("testdata.xlsx")
sheet1=wk["Sheet1"]
# value=sheet1.cell(row=3,column=1).value
# print(value)
#存储多个数据
#字典列表
#excle表格中数据全部度出来
dataList=[]
for row in range(2,sheet1.max_row+1):
rowdata={}
for column in range(1,sheet1.max_column+1):
key=sheet1.cell(1,column).value
value=sheet1.cell(row,column).value
rowdata[key]=value
dataList.append(rowdata)
return dataList
if __name__=='__main__':
data=getdata().get()
print(data)
2.元素操作方法定义
from selenium import webdriver
class Library:
#封装动作
def open_brower(self,brower):
#首字母大写
brower=brower.capitalize()
self.driver=getattr(webdriver,brower)()
# if brower=='chrom':
# self.driver=webdriver.Chrome()
# elif brower=='firefox':
# self.driver = webdriver.Chrome()
# else:
# self.driver = webdriver.Ie()
def load_url(self,url):
self.driver.get(url)
# 定位元素
def locator(self,loc):
return self.driver.find_element(*loc)
def input(self,loc,value):
#输入
self.locator(loc).send_keys(value)
def click(self,loc):
self.locator(loc).click()
3.测试
import time
import unittest
from ddt import ddt,data
from selenium import webdriver
from selenium.webdriver.common.by import By
from getdata import getdata
#实现循环输入,传递多个值
#数据驱动
from library import Library
@ddt
class test(unittest.TestCase):
@data(*getdata().get())
def test_01(self,data):
print(data)
library=Library()
library.open_brower("Firefox")
library.load_url("https://passport.ctrip.com/user/login?")
time.sleep(2)
library.input((By.XPATH,".//*[@id='nloginname']"),data["username"])
time.sleep(3)
library.input((By.XPATH, ".//*[@id='npwd']"), data["passwd"])
time.sleep(2)