UI自动化之关键字驱动

news2025/1/15 21:59:04

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

  • 测试步骤(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文件,关键字驱动就实现了。这只是简单的实现了关键字驱动,了解了关键字驱动应该是什么样的,日志、测试报告、执行入口可以自己再添加,上面的代码也可以再进行优化。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浪潮信息Owen ZHU:大模型百花齐放,算力效率决定速度

与狭义的人工智能相比,通用人工智能通过跨领域、跨学科、跨任务和跨模态的大模型,能够满足更广泛的场景需求、实现更高程度的逻辑理解能力与使用工具能力。2023年,随着 LLM 大规模语言模型技术的不断突破,大模型为探索更高阶的通用…

打磨 8 个月、功能全面升级,Milvus 2.3.0 文字发布会现在开始!

Milvus 社区的各位伙伴: 大家晚上好!欢迎来到 Milvus 2.3.0 文字发布会! 作为整个团队的匠心之作,Milvus 2.3.0 历经 8 个月的设计与打磨,无论在新功能、应用场景还是可靠度方面都有不小的提升。 具体来看:…

电脑莫名其妙重启 为设备 ROOT\DISPLAY\0000 加载驱动程序 \Driver\WUDFRd 失败

卸载向日葵即可解决!!!!!下面是报错日志,估计是远程连接导致的问题

Flask项目请求图片资源返回403错误

问题 解决 在图片url前缀前加 "https://images.weserv.nl/?url" 参考 如何解决访问外部图片返回 403 Forbidden 错误 - 知乎 vue中请求接口会自动带上本地ip_vite打包后请求地址为什么带本地地址_夜月晓晓的博客-CSDN博客

3D点云处理:基于PCA计算点云位姿 平面位姿(附源码)

文章目录 1. 基本内容2. PCA求解步骤(非公式推导)3. 代码实现4. 参考文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_1. 基本内容 基于PCA计算点云位姿通常是指在三维空间中使用PCA(主成分分析)来估计点云数据的姿态或定位,即确定点云数据在三维空间中的位置(平移…

2022年12月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:漫漫回国路 2020年5月,国际航班机票难求。一位在美国华盛顿的中国留学生,因为一些原因必须在本周内回到北京。现在已知各个机场之间的航班情况,求问他回不回得来(不考虑转机次数和机票价格)。 时间限…

idea 链接mysql连不上

打开文件 C:\Program Files\JetBrains\IntelliJ IDEA 2023.2.1\jbr\conf\security\java.security修改内容 搜索:jdk.tls.disabledAlgorithms 修改 链接地址 在链接后面添加 ?useSSLfalse jdbc:mysql://127.0.0.1:3306/db_admin3?useSSLfalse

java+jsp+servlet+mysql蛋糕商城

项目介绍: 本系统为基于jspservletmysql的蛋糕商城,包含管理员和用户角色,用户功能如下: 用户:注册、登录系统;查看商品分类;查看热销、新品商品;查看商品详情;搜索商品…

XSS漏洞及复现

一、什么是XSS 跨站脚本( Cross-site Scripting )攻击,攻击者通过网站输入框输入payload(脚本代码 ),当用户访问网页时,恶意payload自动加载并执行,以达到攻击者目的( 窃取cookie、恶意传播、钓鱼欺骗等)为了避免与HTML语言中的C…

(数学) 剑指 Offer 62. 圆圈中最后剩下的数字 ——【Leetcode每日一题】

❓ 剑指 Offer 62. 圆圈中最后剩下的数字 难度:简单 0, 1, ,n-1 这 n 个数字排成一个圆圈,从数字 0 开始,每次从这个圆圈里删除第 m 个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。 例如…

最新文献怎么找|学术最新前沿文献哪里找

查找下载最新文献最好、最快、最省事的方法就是去收录该文献的官方数据库中下载。举例说明: 有位同学求助下载一篇2023年新文献,只有DOI号10.1038/s41586-023-06281-4,遇到这种情况可以在DOI号前加上http://doi.org/输入地址栏查询该文献的篇…

数据结构:排序解析

文章目录 前言一、常见排序算法的实现1.插入排序1.直接插入排序2.希尔排序 2.交换排序1.冒泡排序2.快速排序1.hoare版2.挖坑版3.前后指针版4.改进版5.非递归版 3.选择排序1.直接选择排序2.堆排序 4.归并排序1.归并排序递归实现2.归并排序非递归实现 5.计数排序 二、排序算法复杂…

DDR2 IP核调试记录1

一、IP核生成不成功可能原因 1、打开 Quartus II 软件时,请右键选择以管理员方式运行,切记,否则可能导致 IP 生成不成功。 2、创建工程时不要将工程创建在和 Quartus II 安装目录相同的盘符下,否则可能导致生产 IP 失败。 3、如果…

Revit SDK:AutoJoin 自动合并体量

前言 Revit 有一套完整的几何造型能力,每一个体量都是一个GenericForm,这些体量可以通过拉伸、扫掠等创建。这个例子介绍如何将他们合并成一个体量。 内容 合并体量的关键接口: // Autodesk.Revit.DB.Document public GeomCombination Com…

提升eBay、亚马逊搜索排名:测评自养号战略揭秘

想要在跨境市场上获得更多销售额,让客户可见非常重要。而自养号测评是个不错的选择,可以帮助您提高排名和产品知名度。许多因素共同作用,吸引更多客户关注您的产品。 网上购物也以同样的方式进行。人们在亚马逊上搜索特定产品并寻找一些选择…

【核心复现】基于改进灰狼算法的并网交流微电网经济优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Acwing 1233. 全球变暖 (每日一题)

如果你觉得这篇题解对你有用,可以点个赞或关注再走呗,谢谢你的关注~ 题目描述 你有一张某海域 NN 像素的照片,”.”表示海洋、”#”表示陆地,如下所示: … .##… .##… …##. …####. …###. … 其中”上下左右”…

基于法医调查算法优化的BP神经网络(预测应用) - 附代码

基于法医调查算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于法医调查算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.法医调查优化BP神经网络2.1 BP神经网络参数设置2.2 法医调查算法应用 4.测试结果:5…

八、性能测试

八、性能测试 8.1 性能测试代码 #include"ConcurrentAlloc.h"// ntimes 一轮申请和释放内存的次数 // rounds 轮次 void BenchmarkMalloc(size_t ntimes, size_t nworks, size_t rounds) {std::vector<std::thread> vthread(nworks);std::atomic<size_t&g…

活动预告 | 龙智、紫龙游戏与JFrog专家将出席龙智DevSecOps研讨会,探讨企业大规模开发创新

2023年9月8日&#xff08;周五&#xff09;下午13:30-19:45&#xff0c;龙智即将携手Atlassian与JFrog在上海共同举办主题为“大规模开发创新&#xff1a;如何提升企业级开发效率与质量”的线下研讨会。 在此次研讨会上&#xff0c;龙智高级咨询顾问、Atlassian认证专家叶燕秀…