第21章:python自动化——Excel数据驱动

目录

一、数据驱动

二、Openpyxl介绍

1.获取excel文件

2.获取sheet页

3. 获取sheet页中的单元格内容

4. 单元格写入

5. 获取所有sheet页的内容

三、数据驱动关联关键字驱动内容实现


一、数据驱动

在自动化测试领域下,数据驱动是专门用于管理测试数据的核心技术。除了写代码,我们还要维护数据。

在自动化执行中,把所有测试相关联的测试数据全部都提取出来,单独用一个文件的形态进行保存和管理。需要用到什么数据,就读取对应的文件中数据内容,来实现数据的传入。这个技术就是数据驱动

不是所有的数据都需要用数据驱动,不要为了数据驱动而数据驱动,这不是一个形式,而是一种便捷的测试数据管理技术手段。

常见的数据驱动形态:

  1. Excel:一般用于关键字驱动形态的实现,适用于在整体技术能力不是特别优秀的团队中使用

    1. 优点:上手成本极低,对于新手而言是最好的数据驱动学习方式

    2. 缺点:相比较其他的数据驱动方式而言,不好维护

  2. Yaml、JSON、Py:具备有相当灵活的管理能力。适合于有一定技术沉淀的团队之中来使用。

  3. 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)

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值