WEB UI自动化测试框架搭建(四)_数据驱动

上一篇实现了将读取页面内元素所需的type和type名存入ini文件中,并读取,然后操作页面成功。
在这里插入图片描述
但是登录时填入的用户名和用户密码还是手动输入的。这样不好。
我们写一个excel文件,用户名,密码等都从中读取。

一.数据驱动

比如在测试登录时,除了正确的用户名和密码,我们还可能输入错误的密码,密码为空等多种情况。
和正确的一组用户名密码相比,仅仅是输入的数据不一样,我们不可能因为有n种的输入组合就将代码重复n遍。
这就是数据驱动的作用,将数据与代码分离。登录行为的代码独立,需要用到不同组合的用户民密码到文件中取。

在项目中新建一个package:TestData
然后再准备一个excel文件,内容如下:
在这里插入图片描述

将这个excel文件复制到TestData包下
在这里插入图片描述

然后我们到ConfigPath.py里获取xlsx文件的路径。
在这里插入图片描述

xlsxPath = os.path.join(ParentDirPath,u'TestData\LoginData.xlsx')

获取到excel文件的位置之后,接下来就是对其中数据进行处理了。
在命令行安装openpyxl模块
在这里插入图片描述

在Utils包下新建ExcelOperate.py文件,并导入openpyxl
在这里插入图片描述

在其中写入以下两个函数,使用load_work等库的内置方法,根据名字分别读取xlsx文件以及文件内的页。
在这里插入图片描述

再写入以下几个函数来获取sheet的最大行列,以及获取某一行所有的值:
在这里插入图片描述
以上几个方法大部分都是openpyxl中自带的,我们稍微封装一下,接下来写个main函数测试这个页面的代码是否有误。
在这里插入图片描述
成功,与excel里的数据都对的上。
在这里插入图片描述
贴一下代码:

import openpyxl
from openpyxl import load_workbook

from ConfigFiles.ConfigPath import xlsxPath


class ExcelOperate:
    def __init__(self):
        self.workbook = None
        self.sheet = None

    def load_workbook(self,filename):
        '''
        加载相应的excel文件
        :param filename:
        :return:
        '''
        try:
            self.workbook = load_workbook(filename)
        except Exception as e:
            print(e)

    def get_sheet_by_name(self,sheetname):
        '''
        拿到xlsx文件里对应的页
        :param sheetname:
        :return:
        '''
        try:
            self.sheet = self.workbook[sheetname]
        except Exception as e:
            print(e)

    def  get_rows_nums(self):
        '''
        返回当前页的最大行数
        :return:
        '''
        return self.sheet.max_row
    def get_col_nums(self):
        '''
        获取最大列数
        :return:
        '''
        return self.sheet.max_column

    def get_row_values(self,row):
        '''
        根据row获取某一行的值
        :param row:
        :return:
        '''
        columns = self.sheet.max_column
        row_data = []
        #遍历列的时候从1开始,不是从0开始,因为xlsx没有第0行,第0列
        for i in range(1,columns+1):
            cell_value = self.sheet.cell(row = row,column = i).value
            row_data.append(cell_value)
        return row_data

    def get_cell_value(self,row,column):
        '''
        获取某一个单元格的值
        :param row:
        :param column:
        :return:
        '''
        cell_value = self.sheet.cell(row= row,column=column).value
        return cell_value

if __name__ == '__main__':
    eo = ExcelOperate()
    #根据名字读取xlsx文件,xlsxPath已经在ConfigPath.py文件中定义过了
    eo.load_workbook(xlsxPath)
    eo.get_sheet_by_name('Sheet1')
    print(eo.get_col_nums())
    print(eo.get_rows_nums())
    print(eo.get_row_values(1))
    print(eo.get_cell_value(1,1))



二.改造业务层代码

打开LoginCases.py文件,将之前的登录操作语句注释掉
在这里插入图片描述
然后改为如下这段代码,成功获取xlsx文件里的内容并封装为字典。
在这里插入图片描述
然后我们根据excel文件里的is_executed字段来判断这行数据是否要执行。
在这里插入图片描述
在这里插入图片描述
运行一下.
结果是第一组数据运行成功,登录进入邮箱。
在运行第二组数据的时候报错了
在这里插入图片描述
原因是我们将driver定义在函数外了,而在运行完第一组数据结束,也就是第一个for循环结束时加了一行代码:driver.quit(),释放了driver,导致在第二个for循环运行第二行数据的时候,没有driver可以用了,于是报错。
在这里插入图片描述
个人亲测将driver定义在for循环下,每次循环就申明一次driver就不会报错,可以正常运行了。
我个人认为大多数情况下中,跑多行数据,大概率是在跑完一次就清空输入框,再接着输入下一行数据,不会这样反复申明释放driver。
贴一下代码:

import time

from selenium import webdriver

from ConfigFiles.ConfigPath import xlsxPath
from Modules.LoginAction import LoginAction
from Utils.ExcelOperate import ExcelOperate


def test_login():
    login_action = LoginAction()
    excelOperate = ExcelOperate()
    excelOperate.load_workbook(xlsxPath)
    excelOperate.get_sheet_by_name('Sheet1')
    #获取最大行数
    row_nums = excelOperate.get_rows_nums()
    #获取第一行的值
    row_1_values = excelOperate.get_row_values(1)
    for i in range(2,row_nums+1):
        row_values = excelOperate.get_row_values(i)
        #第一行与其他行组装成一个字典
        #zip函数将可迭代的两个对象中的对应的元素一一映射并打包成元组,并将所有这些元组放入一个列表中
        values = dict(zip(row_1_values,row_values))
        # is_executed的值为y则代表这行数据要执行
        if values['is_executed'] == 'y':
            username = values['username']
            password = values['password']
            #申明driver
            driver = webdriver.Chrome()
            driver.get('https://mail.163.com/')
            driver.maximize_window()
            login_action.do_login(driver, username, password)
            time.sleep(2)
            driver.quit()


if __name__ == '__main__':
    test_login()

这样数据驱动就成功啦。


在这里插入图片描述

适合人群:【学习前提】 1. 具备python3语言基础 【学习人群】 1. 手工测试人员学习UI自动化测试技能 2. 开发人员转岗测试开发岗位 3. 如具有丰富的自动化测经验,本课程可能并不满足你学习计划:1.下载课程中配套的软件资料 2.结合课件中Demo可完成学习任务课程目标:掌握UI自动化测试框架的设计与实现课程简介:UI自动化框架的设计需储备基础知识,方能完成自动化测试框架的实现,如数据驱动、日志、配置文件等AutoUiTestFrame自动化框架的目录结构初步进行规划,目录结构如下:Config 配置文件的目录v  config.ini 配置文件;v  globalconfig.py 获得日志路径、测试用例路径、测试报告路径、测试数据路径;v  Data 测试数据;v  TestData.xlsx 测试数据。Public 公共文件库v  Common 封装的公共的方法n  Commonconfig.py 公共的参数配置:调试过程中的测试数据等;n  DoExcel.py 操作excel(数据驱动);n  Send_mail.py 发送邮件(html);n  ReadConfigIni.py 读取ini格式的配置文件;n  TestCaseInfo.py  测试用例信息;n  Log.py 日志类。设置日志类,其他模块或文件需要日志类时,调用该文件。v  Pages 使用po模式设计的测试页面n  BasePage.py  基类,对一些测试页面公共方法、属性的封装及webdrive一些方法的二次封装;n  Bing.py 测试页面。Report 测试报告v  Log 日志目录n  *****log日志。v  TestReport 测试报告目录n  ***html测试报告。TestCase 测试用例v  TC_bing.py。Run.py  控制测试用例的运行。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSQ的测试日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值