目录
一、数据驱动
二、Openpyxl介绍
1.获取excel文件
2.获取sheet页
3. 获取sheet页中的单元格内容
4. 单元格写入
5. 获取所有sheet页的内容
三、数据驱动关联关键字驱动内容实现
一、数据驱动
在自动化测试领域下,数据驱动是专门用于管理测试数据的核心技术。除了写代码,我们还要维护数据。
在自动化执行中,把所有测试相关联的测试数据全部都提取出来,单独用一个文件的形态进行保存和管理。需要用到什么数据,就读取对应的文件中数据内容,来实现数据的传入。这个技术就是数据驱动
不是所有的数据都需要用数据驱动,不要为了数据驱动而数据驱动,这不是一个形式,而是一种便捷的测试数据管理技术手段。
常见的数据驱动形态:
- Excel:一般用于关键字驱动形态的实现,适用于在整体技术能力不是特别优秀的团队中使用
- 优点:上手成本极低,对于新手而言是最好的数据驱动学习方式
- 缺点:相比较其他的数据驱动方式而言,不好维护
- Yaml、JSON、Py:具备有相当灵活的管理能力。适合于有一定技术沉淀的团队之中来使用。
- txt、xmind等等,一般不常见,但是也会有。数据驱动的概念整体来讲就是文件的读取与使用
二、Openpyxl介绍
Excel文件的处理,在Python中有非常多的手段可以实现,XLRD,XLWT,pandas,Openpyxl等等等等,有很多。主体的技术实现都还是基于Openpyxl来进行。
环境部署指令:pip install openpyxl
这个库在实际编码的过程中,初期是不具备自动补全能力的。
Openpyxl库的基本应用
1. 获取excel文件
2. 获取指定的sheet页
3. 获取sheet页中的单元格内容
4. 单元格写入
5. 获取所有sheet页的内容
1.获取excel文件
# 获取excel文件
excel = openpyxl.load_workbook('./test.xlsx')
2.获取sheet页
# 获取sheet页
sheet = excel['Sheet1']
3. 获取sheet页中的单元格内容
获取单个单元格内容:
# 获取单元格的内容:定义行row和列column
print(sheet.cell(row=1, column=1).value)
获取所有单元格内容:
# 获取sheet页所有单元格的内容:所有的内容都是以行为单位进行返回,返回的数据是以元组的形态来进行保存。
for values in sheet.values:
print(values)
4. 单元格写入
# 单元格写入方法1
sheet['B2'] = '这是新加的内容22222'
# 单元格写入方法2
sheet.cell(row=1, column=2).value = '这是写入方法2'
# 只要关联到写入的操作,excel就需要调用保存的方法,否则不会写入生效
# 写入的时候要记得,被写入的文件请提前关闭
excel.save('./test.xlsx')
5. 获取所有sheet页的内容
# 获取所有的sheet页内容
# 获取所有的sheet名称
names = excel.sheetnames
# 获取所有的sheet页
for name in names:
sheet = excel[name]
print('这是{}的页面'.format(name))
# 获取sheet页的所有内容
for values in sheet.values:
print(values)
三、数据驱动关联关键字驱动内容实现
如果企业的技术不太行,基于excel来实现数据的管理,为了方便使用,可以进行基于excel数据驱动的自动化执行。
假设excel表格的数据如下:
准备好关键字驱动类web_keys.py里面的各种操作的封装:
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
def opt():
options = webdriver.ChromeOptions()
# 页面加载策略
options.page_load_strategy = 'normal'
# 窗体最大化
options.add_argument('start-maximized')
def open_browser(type_):
try:
driver = getattr(webdriver, type_.capitalize())(options=opt())
except Exception as e:
print(e)
driver = webdriver.Chrome()
return driver
class Webkeys:
# 临时driver对象
# driver = webdriver.Chrome()
def __init__(self, type_):
self.driver = open_browser(type_)
self.driver.maximize_window()
self.driver.implicitly_wait(5)
# 访问url
def open(self, url):
self.driver.get(url)
# 元素定位,要满足不同的定位需求,将定位到的元素进行返回,方便后面调用
def locator(self, by, value):
return self.driver.find_element(by, value)
# 输入
def input(self, by, value, txt):
el = self.locator(by, value)
el.clear()
el.send_keys(txt)
# 点击
def click(self, by, value):
self.locator(by, value).click()
# 关闭
def quit(self):
self.driver.quit()
# 强制等待
def wait(self, time_):
time.sleep(time_)
# 显示等待
def driver_wait(self, by, value, time_=5):
WebDriverWait(self.driver, time_, 0.5). \
until(lambda element: self.locator(by, value), message='显示等待失败')
# 鼠标悬停
def action(self, by, value):
ActionChains(self.driver).move_to_element(self.locator(by, value)).perform()
# 输出标签页标题
def title(self):
print(self.driver.title)
# 句柄切换,关闭第一个标签页
def window_switch(self):
handles = self.driver.window_handles
self.driver.close()
self.driver.switch_to.window(handles[1])
# 句柄切换,不关闭第一个标签页
def window_switch_old(self):
handles = self.driver.window_handles
self.driver.switch_to.window(handles[1])
# 断言
def assert_txt_in(self, by, value, expected):
try:
reality = self.locator(by, value).text
assert expected in reality, '断言失败,{}!={},预期结果为{}\n实际结果为{}' \
.format(expected, reality, expected, reality)
return True
except:
return False
基于excel中的测试用例,实现关键字驱动类的调用,
根据测试用例的步骤,自动执行对应的操作行为:
import openpyxl
from class18.web_keys import WebKeys
# 参数从str转换为dict的方法
def arguments(value):
# 定义返回对象
data = dict()
# 如果value有值,需要进行数据处理
if value:
str_temp = value.split(";")
for temp in str_temp:
# by = id
t = temp.split('=', 1)
# {"by":"id"}
data[t[0]] = t[1]
return data
# 获取excel文件
excel = openpyxl.load_workbook('./test.xlsx')
# 获取sheet页
for name in excel.sheetnames:
sheet = excel[name]
print('当前正在执行{}页'.format(name))
for values in sheet.values:
# 判断是否为用例正文
if type(values[0]) is int:
# 日志信息输出
print('当前正在执行:{}'.format(values[3]))
# print(values)
# 参数的处理
data = arguments(values[2])
# print(data)
'''
参数的原本形态:by=id;value=kw;txt=python自动化学习驱动
要实现的目标:
{
"by":"id",
"value":"kw",
"txt":"python自动化学习"
}
'''
# 执行事件的处理
'''
open_browser表示实例化
其他操作则是实例化对象的常规方法调用而已。
断言校验因为关联到实际的excel写入结果,所以也是单独的一套处理
'''
# 实例化浏览器对象
if values[1] == 'open_browser':
wk = WebKeys(**data)
# 断言处理:因为断言的种类是多样化的,所以需要考虑用例写的什么断言方法,就调用对应的断言方法
elif "assert" in values[1]:
# 因为断言是需要有结果反馈的,所以要根据断言成功或失败,对excel文件写入对应的pass或者failed
status = getattr(wk, values[1])(expected=values[4], **data)
# 根据断言状态对用例结果进行写入
if status:
sheet.cell(row=values[0] + 2, column=6).value = 'PASS'
else:
sheet.cell(row=values[0] + 2, column=6).value = 'FAILED'
excel.save('./test.xlsx')
# 执行常规操作行为
else:
getattr(wk, values[1])(**data)