UI自动化之关键字驱动

关键字驱动框架:将每一条测试用例分成四个不同的部分

  • 测试步骤(Test Step):一个测试步骤的描述或者是测试对象的一个操作说明
  • 测试步骤中的对象(Test Object):指页面的对象或者元素
  • 对象执行的动作(Action):页面操作的动作
  • 执行对象所需要的数据(Test Data):任何对象操作时所需要的值

例如:登录163邮箱,步骤分为:

  1. 打开浏览器
  2. 输入url
  3. 切换iframe
  4. 输入用户名
  5. 输入密码
  6. 点击登录

1:创建excel文件,使用excel文件来存放测试用例及测试步骤,excel内容如下:

login的sheet页中,描述了测试步骤,测试步骤中的对象可以分为:测试对象的定位方式以及定位方式表达值:

从excel文件中,可以看到,每一个步骤我们要执行的动作是什么,例如打开浏览器,我们需要定义一个open_browse方法,再读取excel文件的内容时,程序才知道要怎么做。因此我们需要为每个执行动作定义一个方法。

再在excel中增加一个sheet页,从来存放测试用例,如index:

2:搭建项目框架,只是简单的实现关键字驱动,需要的其他内容可以再往框架中加。

项目结构目录:

3:接下来我们来看一下各个文件夹下py文件的内容

首先是Util文件夹下,封装的查找元素控件的工具类find_ele.py文件

# find_ele.py
from selenium.webdriver.support.wait import WebDriverWait


def find_element(driver, location_type, location_express):
    '''查找控件元素'''
    try:
        driver = WebDriverWait(driver, 20).until(lambda driver:driver.find_element(location_type, location_express))
        return driver
    except Exception as e:
        raise e

接下来我们就要在Util文件下,封装读取excel文件内容方法的excel_parse.py文件,再封装该方法前,需要在Setting文件下,创建Config.py文件,用来获取文件路径。

Config.py文件内容如下:

# Config.py
import os

Base_Dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# 测试数据文件
Test_Data_Path = os.path.join(Base_Dir, 'TestData')

excel_parse.py文件内容如下:

# excel_parse.py
from Setting.Config import Test_Data_Path
from openpyxl import load_workbook

class ExcelParse:

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

    def load_workbook(self, filename):
        '''加载文件'''
        try:
            self.workbook = load_workbook(filename)
        except Exception as e:
            raise e

    def get_sheet(self, sheetname):
        '''获取sheet页'''
        try:
            self.sheet = self.workbook[sheetname]
        except Exception as e:
            raise e

    def get_row_num(self):
        '''返回行数'''
        return self.sheet.max_row

    def get_col_num(self):
        '''返回列数'''
        return self.sheet.max_column

    def get_cell_value(self, row, col):
        '''返回某一单元格的值'''
        return self.sheet.cell(row=row, column=col).value

    def get_row_value(self, row):
        '''返回某一行的值'''
        try:
            col = self.get_col_num()
            data = []
            for i in range(1, col+1):
                data.append(self.get_cell_value(row, i))
            return data
        except Exception as e:
            raise e

    def write_cell(self, row, col, filename, content):
        '''单元格赋值'''
        try:
            self.sheet.cell(row=row, column=col, value=content)
            self.workbook.save(filename)

        except Exception as e:
            raise e


if __name__ == '__main__':
    execl = ExcelParse()
    execl.load_workbook(Test_Data_Path + '/login.xlsx')
    execl.get_sheet('login')
    res = execl.get_row_value(2)
    print(res)

然后就需要定义测试步骤中的执行动作的方法,在Util文件夹下,创建elementAction.py文件,内容如下:

# elementAction.py
from selenium import webdriver
from Util.find_ele import find_element

driver = None

def open_browse(browser_name, *args):
    '''打开浏览器'''
    global driver
    try:
        if browser_name.lower() == 'chrome':
            driver = webdriver.Chrome()
        elif browser_name.lower() == 'firefox':
            driver = webdriver.Firefox()
        else:
            driver = webdriver.Ie()
    except Exception as e:
        raise e

def get_url(url, *args):
    '''打开网址'''
    try:
        driver.get(url)
    except Exception as e:
        raise e


def max_window(*args):
    '''窗口最大化'''
    try:
        driver.maximize_window()
    except Exception as e:
        raise e

def switch_frame(location_type, location_express, *args):
    '''切换iframe'''
    try:
        frame = find_element(driver, location_type, location_express)
        driver.switch_to.frame(frame)
    except Exception as e:
        raise e

def input_content(location_type, location_express, content, *args):
    '''定位输入框,输入内容'''
    try:
        find_element(driver, location_type, location_express).send_keys(content)
    except Exception as e:
        raise e


def click(location_type, location_express, *args):
    '''点击操作'''
    try:
        find_element(driver, location_type, location_express).click()
    except Exception as e:
        raise e

def assert_title(title, *args):
    '''断言title是否正确'''
    try:
        assert title in driver.title
    except Exception as e:
        raise e


def close_browse():
    '''关闭浏览器'''
    driver.quit()


if __name__ == '__main__':
    open_browse('chrome')
    get_url('http://mail.163.com')
    max_window()
    switch_frame('tag name', 'iframe')
    input_content('name', 'email', 'test123')
    input_content('name', 'password', 'a123456')
    click('id', 'dologin')
    assert_title('网易')

然后将从excel文件中读取出来的内容,拼接成要执行的方法。在Util文件夹下,创建common.py文件。

# common.py
def generate_method_express(location_type, location_express, key_word, operate_data):
    # location_type, location_express为空,operate_data不为空
    if key_word and operate_data and location_type is None and location_express is None:
        # 判断操作值的类型
        if isinstance(operate_data, int):
            method_express = key_word + '(' + str(operate_data) + ')'
        else:
            method_express = key_word + "('" + operate_data + "')"
        # print(method_express)
    # 只有关键字有值,其他的都为空,比如:max_window, close_browse
    elif key_word and operate_data is None and location_type is None and location_express is None:
        method_express = key_word + '()'
        # print(method_express)
    # location_type,location_express不为空,operate_data为空
    elif key_word and location_type and location_express and operate_data is None:
        method_express = key_word + "('" + location_type + "','" + location_express + "')"
        # print(method_express)
    # 都不为空
    else:
        if isinstance(operate_data, int):
            method_express = key_word + "('" + location_type + "','" + location_express + "'," + str(operate_data) + ")"
        else:
            method_express = key_word + "('" + location_type + "','" + location_express + "','" + operate_data + "')"
        print(method_express)
    return method_express

之后,就是编写执行测试用例了。

在TestScript文件夹下,创建test_login.py文件

# test_login.py
from Util.excel_parse import ExcelParse
from Setting.Config import Test_Data_Path
from Util.elementAction import *
from Util.common import generate_method_express

excel = ExcelParse()
# 加载login.xlsx文件
excel.load_workbook(Test_Data_Path + '/login.xlsx')

def test_run():
    try:
        # 获取indexsheet页
        excel.get_sheet('index')
        # 获取index的行数
        rows = excel.get_row_num()
        for i in range(2, rows+1):
            # 判断是否要执行
            is_run = excel.get_cell_value(i, 4).lower()
            if is_run == 'y':
                # 获取要执行的sheet页名称
                case_step_sheet = excel.get_cell_value(i, 3)
                # 切换到要执行的sheet页
                excel.get_sheet(case_step_sheet)
                # 获取要执行的步骤数
                step_num = excel.get_row_num()
                # print(step_num)
                success_num = 0       # 记录成功的步骤数
                for j in range(2, step_num+1):
                    # 获取步骤描述
                    step_desc = excel.get_cell_value(j, 1)
                    # 定位方式
                    location_type = excel.get_cell_value(j, 2)
                    # 定位方式表达值
                    location_express = excel.get_cell_value(j, 3)
                    # 执行动作
                    key_word = excel.get_cell_value(j, 4)
                    # 执行数据
                    operate_data = excel.get_cell_value(j, 5)
                    # print(step_desc, location_type, location_express,key_word, operate_data)
                    method_express = generate_method_express(location_type, location_express, key_word, operate_data)
                    try:
                        # 运行函数,eval(),将字符串str当成有效的表达式来求值并返回计算结果
                        eval(method_express)
                    except Exception as e:
                        raise e
                    else:
                        success_num += 1
                # 切换sheet页到index
                excel.get_sheet('index')
                if success_num == step_num - 1:
                    # 成功的步骤数等于步骤sheet页的行数减1,表示测试执行成功,写入成功
                    excel.write_cell(i, 5, Test_Data_Path + '/login.xlsx', 'pass')
                else:
                    # 写入失败
                    excel.write_cell(i, 5, Test_Data_Path + '/login.xlsx', 'Fall')
    except Exception as e:
        raise

执行test_login.py文件,关键字驱动就实现了。这只是简单的实现了关键字驱动,了解了关键字驱动应该是什么样的,日志、测试报告、执行入口可以自己再添加,上面的代码也可以再进行优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/99531.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

访问0xdddddddd内存地址引发软件崩溃的问题排查

目录 1、问题描述 2、访问空指针或者野指针 3、常见的异常值 4、0xdddddddd内存访问违例问题分析与排查 5、关于0xcdcdcdcd和0xfeeefeee异常值的排查案例 6、最后 VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)ht…

【ag-grid-vue】列定义(Updating Column Definitions)

列定义一节解释了如何配置列。可以在初始设置列之后更改列的配置。本节介绍如何更新列定义。 添加和删除列 可以通过更新提供给网格的列定义列表来添加和删除列。当设置新列时,网格将与当前列进行比较,并计算出哪些列是旧的(要删除)、哪些列是新的(创建…

什么是 TF-IDF 算法?

简单来说,向量空间模型就是希望把查询关键字和文档都表达成向量,然后利用向量之间的运算来进一步表达向量间的关系。比如,一个比较常用的运算就是计算查询关键字所对应的向量和文档所对应的向量之间的 “相关度”。 简单解释TF-IDF TF &…

第一个react应用程序并添加样式

编写第一个react应用程序 将目录下的文件、src文件夹、public文件夹清空&#xff0c;项目根目录下新建一个文件index.js 在文件中写入以下代码 import React from react import ReactDOM from react-dom ReactDOM.render(<h1>欢迎进入React的世界</h1>,document.…

编译工具:CMake(六) | 使用外部共享库和头文件

编译工具&#xff1a;CMake&#xff08;六&#xff09; | 使用外部共享库和头文件 步骤引入头文件搜索路径为 target 添加共享库 步骤 在/Compilation_tool/cmake 目录建立 t4 目录 建立src目录&#xff0c;编写源文件main.c&#xff0c;内容如下&#xff1a; #include <…

MybatisPlus(2)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 上篇我们简单介绍了MybatisPlus的方便之处&#xff0c;这篇来深入了解Myb…

数据并行 - DP/DDP/ZeRO

数据并行DP 数据并行的核心思想是&#xff1a;在各个GPU上都拷贝一份完整模型&#xff0c;各自吃一份数据&#xff0c;算一份梯度&#xff0c;最后对梯度进行累加来更新整体模型。理念不复杂&#xff0c;但到了大模型场景&#xff0c;巨大的存储和GPU间的通讯量&#xff0c;就…

3D虚拟数字人定制+AI交互数字人技术,助力企业开启营销新思路

近日&#xff0c;番茄小说推出数字人IP番卷卷&#xff0c;其承担着连接现实世界与番茄世界的重要角色&#xff0c;作为用户进入番茄世界的数字导游。数字人番卷卷的出现&#xff0c;一方面能够强化品牌在用户层面的心智&#xff0c;另一方面可以让用户拥有多层次、多情感、角色…

开源微服务如何选型?Spring Cloud、Dubbo、gRPC、Istio 详细对比

作者&#xff1a;刘军 不论您是一名开发者、架构师、CTO&#xff0c; 如果您曾深度参与在微服务开发中&#xff0c;那么相信您一定有过开源微服务框架或体系选型的疑问&#xff1a;Apache Dubbo、Spring Cloud、gRPC 以及 Service Mesh 体系产品如 Istio&#xff0c;到底应该选…

MySQL创建用户时报错“Your password does not satisfy the current policy requirements“

MySQL创建用户时报错"Your password does not satisfy the current policy requirements" MySQL是一个流行的关系型数据库管理系统&#xff0c;它提供了许多安全性特性&#xff0c;其中之一是密码策略。在创建或更改用户密码时&#xff0c;MySQL会检查密码是否符合当…

3D点云处理:圆柱侧面点云展开为平面 凹凸缺陷检测(附源码)

文章目录 1. 基本内容展开部分推导2. 展开流程3. 代码实现4. 应用文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_目标:对采集的圆柱面点云展开为平面;应用:可用于检测圆柱侧面的凹凸缺陷;1. 基本内容 圆柱的侧面展开原理是将一个圆柱体(或柱体)的侧面展开成一个…

一个中年程序员的10年测试人生,进阶测试专家必备5项技能!

测试架构师成长线路图 第一步、成为互联网时代合格的测试工程师 如果你是入行不满3年的测试工程师&#xff0c;一定对此有迫切需求。此时&#xff0c;你必须迅速掌握被测软件的业务功能与内部架构&#xff0c;并在此基础上运用各种测试方法&#xff0c;尽可能多地发现潜在缺陷…

curl通过webdav操作alist

创建目录: url202320230828;curl -v -u "admin":"这里是密码" -X MKCOL "http://127.0.0.1:5244/dav/my189tianyi/${url2023}/" 上传文件: curl -v -u "admin":"这里是密码" -T /tmp/aa.json "http://127.0.0.1:52…

按软件开发阶段的角度划分:单元测试、集成测试、系统测试、验收测试

1.单元测试&#xff08;Unit Testing&#xff09; 单元测试&#xff0c;又称模块测试。对软件的组成单位进行测试&#xff0c;其目的是检验软件基本组成单位的正确性。测试的对象是软件里测试的最小单位&#xff1a;模块。 测试阶段&#xff1a;编码后或者编码前&#xff08;…

提高Python并发性能 - asyncio/aiohttp介绍

在进行大规模数据采集时&#xff0c;如何提高Python爬虫的并发性能是一个关键问题。本文将向您介绍使用asyncio和aiohttp库实现异步网络请求的方法&#xff0c;并通过具体结果和结论展示它们对于优化爬虫效率所带来的效果。 1. 什么是异步编程&#xff1f; 异步编程是一种非阻…

【枚举区间+线段树】CF Ehu 152 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 感觉是个套路题 对区间计数&#xff0c;按照CF惯用套路&#xff0c;枚举其中一个端点&#xff0c;对另一个端点计数 对于这道题&#xff0c;枚举右端点&#xff0c;对左端点计数 Code&#xff1a; #include &…

go语言配置

1、Go语言的环境变量 与Java等编程语言一样&#xff0c;安装Go语言开发环境需要设置全局的操作系统环境变量&#xff08;除非是用包管理工具直接安装&#xff09; 主要的系统级别的环境变量有两个: &#xff08;1&#xff09;GOROOT&#xff1a;表示Go语言环境在计算机上的安…

Linux测开常用命令总结

文章目录 Linux系统中文件目录树 基本指令的使用&#xff1a; Linux命令的帮助信息查看 --help command --help 说明&#xff1a; 显示command 命令的帮助信息通过man命令查看帮助信息 man command( 命令的名称) man 命令查看的帮助信息更加详细ls&#xff0c;pwd&#xff0c…

分享一套全开源无加密海外跨境商城源码

武汉一一零七科技有限公司&#xff0c;作为一家专注于海外跨境电商领域的公司&#xff0c;为广大商家提供了一套全新的海外跨境商城源码。该源码融合了多年来我们对于海外市场的深入研究和积累&#xff0c;致力于帮助商家拓展海外市场&#xff0c;提升销售额。 这套海外跨境商城…

完整开发实现公众号主动消息推送,精彩内容即刻到达

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…