web自动化测试:selenium怎么实现关键字驱动

news2024/11/29 0:35:32

要做 ui 自动化测试,使用关键字驱动可以说是必须会的一种测试方式,它既可以在纯代码的自动化程序中运行,也可以在测试平台中使用。

使用纯代码方式时,自动化工程师先写好一个通用的程序,其他手工测试人员只需要把执行的页面操作关键字填入到一个表格当中,就可以执行自动化测试了。这个表格可以是 Excel 表格,也可是 yaml 文件。

使用测试平台时,测试开发工程会编写一个界面,在假面中,手工测试人员也可以选择需要操作的页面关键字,选择完以后就可以执行自动化测试了。

关键字驱动实现成本低,操作起来也方便,真是个做 ui 自动化测试的好方式。本文介绍一种简单的关键字驱动实现方式,不需要很高深的编程知识也能掌握。

关键字驱动实现主要分为三个部分:

  • 关键字方法的定义,其实就是页面的通用操作,比如点击、输入等常见操作,由自动化测试工程师编写。
  • 关键字表格配置。谁编写自动化用例,谁配置这个表格,它主要定义用例需要执行的页面操作和测试数据,最好通过脚本自动生成固定格式的文件,并且把可以选择的操作名称说明,方便使用, 在测试平台中,可以通过下拉框搜索和选择的方式选择,会更加方便。
  • 调用关键字,执行页面操作。这个也是由自动化测试工程师编写,读取 yaml 文件中的页面操作,并且执行。

定义关键字方法

如果要对 web 网页进行自动化测试,我们可以定义 Page 类,封装点击、输入等页面操作。

# keywords.py
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
 
DEFAULT_TIMEOUT = 8
 
class Page:
    def __init__(self, driver: WebDriver):
        self.driver = driver
 
    def goto(self, url):
    	"""页面访问"""
        self.driver.get(url)
 
    def wait_clickable(self, locator, timeout=None) -> WebElement:
        timeout = DEFAULT_TIMEOUT if timeout is None else timeout
        wait = WebDriverWait(self.driver, timeout=timeout)
        return wait.until(expected_conditions.element_to_be_clickable(locator))
 
    def wait_visible(self, locator, timeout=None) -> WebElement:
        timeout = DEFAULT_TIMEOUT if timeout is None else timeout
        wait = WebDriverWait(self.driver, timeout=timeout)
        return wait.until(expected_conditions.visibility_of_element_located(locator))
 
    def click(self, locator):
    	"""页面点击"""
        el = self.wait_clickable(locator)
        el.location_once_scrolled_into_view
        el.click()
 
    def fill(self, locator, words):
        """页面输入"""
        el = self.wait_visible(locator)
        el.send_keys(words)

 关键字表格

关键字表格是一个自动化用例的测试步骤和数据,这里我们使用 yaml 文件,action 表示要使用的页面操作,它对应前面 Page 类中的同名方法, params 表示方法需要传入的测试参数。

每个不同的用例,编写一个 yaml 文件,当需要运行自动化测试时,把 yaml 文件作为参数传入自动化程序中就可以了。

# login.yaml
-
  action: goto
  params:
    url: "https://petstore.octoperf.com/actions/Account.action?signonForm="
-
  action: fill
  params:
    locator: ['name', 'username']
    words: 'yuze'
-
  action: fill
  params:
    locator: ['name', 'password']
    words: '1234'
-
  action: click
  params:
    locator: ['name', 'signon']

使用关键字操作浏览器

最后是通用的测试用例编写。定义一个 test_keyword 函数, 首先读取 login.yaml 文件中的测试步骤和数据,使用 getattr 方法, 把需要调用的页面操作名称 goto, fill, click 传入,获取 Page 类中的同名方法,调用这些方法就能实现对应的自动化操作。

这些代码大多数不需要进行额外修改,当需要运行不同的测试用例,只需要修改 yaml 文件的名称,调用不同的 yaml 测试步骤。

# test_login.py
 
import yaml
import pytest
from selenium import webdriver
from keyworks import Page
 
 
@pytest.fixture
def driver():
    d = webdriver.Chrome()
    d.implicitly_wait(8)
    d.maximize_window()
    yield d
    d.quit()
 
def test_keyword(driver):
    """获取 yaml 文件"""
	with open('signin.yaml', encoding='utf-8') as f:
    steps = yaml.safe_load(f)
    page = Page(driver)
 
    for step in steps:
        action_name = step.get('action')
        params = step.get('params')
        action = getattr(page, action_name)
        action(**params)

运行

现在,我们只需要定义不同的 yaml 文件,然后使用 pytest 这样的测试框架来运行自动化用例就可以。 但是,作为一个简单版关键字驱动实现方式,这个程序还有很多的优化空间。

比如,现在编写多个 yaml 文件后,还需要创建多个 python 的 test 文件。而更加常见的方式是,可以通过命令行配置一个 yaml 文件,我就可以运行该 yaml 文件的测试步骤。

配置多个 yaml 文件,就可以运行多个 yaml 文件的测试步骤。甚至可以配置文件夹名称,就运行文件夹下所有的 yaml 文件的测试步骤。

yaml 文件的生成也可以通过命令行生成。

这个我们在后面在实现,目前来说,我们至少已经知道关键字驱动的实现方式了。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

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

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

相关文章

gitlab的CICD

大体步骤4步 1.购买阿里云服务器centos 7.6 2.在服务器上安装gitlab-ce 3.在服务器上安装gitlab-runner 4.在gitlab创建一个项目,拉到本地修改后再提交,触发自动部署 视频教程 看不懂文章的,可以看这个视频,超详细gitlab-cicd-…

国产信创适配-东方通TongWeb安装,使用记录

之前项目使用的tomcat容器,需适配东方通 tongweb容器,记录下在国产麒麟ky10.aarch64 服务器下安装东方通容器的过程(对于麒麟内核服务器操作起来和centos7大致一样) 东方通容器是商业的,没有免费版本,企业级安装是公司和东方通联系给了lisence 经过实际测试发现,东方通提…

深度学习技巧应用15-自动机器学习Autogluon的应用技巧

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用15-自动机器学习Autogluon的应用技巧,Autogluon是一个开源的自动化机器学习工具包,Autogluon的开发目标是为机器学习从业者提供一个高效、易用、可扩展的自动化机器学习工具,让机器学习变得更加简单快捷。本文采用儿…

绘制混淆矩阵(MatLab/Python)

本文主要简单介绍如何绘制混淆矩阵 首先混淆矩阵是机器学习中总结分类模型预测结果的情形分析表,以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。 其实混淆矩阵就是用来判断我们的算法的分类准确度的一个可视化矩阵 1…

得物AI平台-KubeAI推理训练引擎设计和实践

1.KubeAI介绍 KubeAI是得物AI平台,是我们在容器化过程中,逐步收集和挖掘公司各业务域在AI模型研究和生产迭代过程中的需求,逐步建设而成的一个云原生AI平台。KubeAI以模型为主线提供了从模型开发,到模型训练,再到推理…

本科毕业生10大高薪专业出炉,IT行业赢麻了

据环球网报道,现在大学毕业生转行率高达80%! 非常后悔!有不少粉丝向播妞倾诉,曾经以为读了大学就能找到体面的工作,实际上是掉入了天坑专业,成了现实版孔乙己。 大学生找不到对口好工作,似乎已成…

golang web学习随便记6-模板引擎

以下代码是几乎最简单的一个模板&#xff0c;{{ . }} 表示执行模板时将嵌入的数据 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"><title>Go Web 编程</title> <…

openwrt修改web网页默认端口

使用SSH登录openwrt后台&#xff1b; openwrt 中默认使用的web服务器是uhttpd&#xff0c; 进入配置文件路径&#xff1a; cd /etc/config/ 使用vim编辑器修改uhttpd文件 vi uhttpd 修改以上标红部分后面的端口 vim编辑器打开uhttpd 文件 修改完成后点键盘ESC退出编辑状态&a…

《计算机网络—自顶向下方法》 Wireshark实验(四):TCP 协议分析

在因特网协议族&#xff08;Internet Protocol Suite&#xff09;中&#xff0c;TCP 层是位于 IP 层之上&#xff0c;应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接&#xff0c;但是 IP 层不提供这样的流机制&#xff0c;而是提供不可靠的包交换。…

docker could not find driver

先介绍环境 使用的是dockerdocker-compose部署了nginxphpmysqlredis框架用的是laravel 再详细介绍每个服务/框架的版本&#xff1a; nginx1.24php8.1-fpmmysql8.0.25redis7.0.8laravel9.33.0 本篇可不用理会 redis 主要是讲解 php 为什么会出现 "could not find drive…

Datacom-HCIE 01(10月26日更新)--含解析

单选题 1.[试题编号&#xff1a;189684] &#xff08;单选题&#xff09;防火墙双机热备场景下&#xff0c;主备设备之间通过哪种协议实现会话表备份&#xff1f; 2.[试题编号&#xff1a;189682] &#xff08;单选题&#xff09;中间人攻击或IP/MAC Sp fing攻击都会导致信息…

Docker笔记6 | 关于仓库的一些基本知识梳理

6 | 关于仓库的一些基本知识梳理 1 Docker Hub1.1 简介和登陆1.2 拉取镜像1.3 推送镜像1.4 自动构建 2 私有仓库2.1 简介2.2 安装docker-registry2.3 上传镜像2.4 查看镜像2.5 下载镜像 1 Docker Hub 1.1 简介和登陆 Docker Hub是Docker官方维护的一个公共仓库&#xff1b;注…

使用intellij Idea 创建spring boot项目

1、问题&#xff1a;使用Spring Initializr创建的工程&#xff0c;没有src目录&#xff0c;原因是创建的时候&#xff0c;默认选择的地址是https://start.spring.io 由于默认的spring官网的地址在国内比较难访问&#xff0c;当访问不了的时候可以使用阿里云的地址&#xff1a;…

银行零售业务转型方法论:打造数字化的“有机体”

传统的业务增长进度叫做连续性创新&#xff0c;它是在一条曲线上渐进性的改良和发展&#xff0c;但这种发展终有极限&#xff0c;如果不能及时开辟第二增长曲线&#xff0c;就很容易被时代所抛弃。过去十年&#xff0c;以互联网为代表的数字化转型的先行者&#xff0c;不断冲击…

网页三剑客之 CSS

css 在这里不会介绍太多&#xff0c;我们主要重点介绍两个&#xff1a;选择器和盒子模型就够用了。这里看个乐就好了&#xff0c;没有那么多重点&#xff0c;只是简单的认识一下下CSS。 CSS 是什么 CSS 是层叠样式表 (Cascading Style Sheets)的缩写它存在的意义就是&#xf…

MTSC2023中国互联网测试开发大会将于7月15日在上海举办

一年一度的行业盛会&#xff0c;MTSC2023 中国互联网测试开发大会&#xff0c;将从上海开始。 在为期1天的时间里&#xff0c;主办方将邀请一线技术专家、资深行业大咖与大家齐聚一堂&#xff0c;针对当前热门行业话题以及最新的落地实践&#xff0c;进入深入探讨与分享&#…

《CSS揭秘》笔记

前言 《CSS揭秘》&#xff0c;由Lea Verou编著&#xff0c;由CSS魔法翻译&#xff0c;本篇主要记录阅读《CSS揭秘》过程中的一些要点及收获 第二章 背景与边框 box-shadow与outline box-shadow 利用box-shadow可以绘制多重边框&#xff0c;设置其前三个变量均为0&#xff…

在 Python 中如何使用位运算符来进行布尔运算?

Python 中常见的运算符有&#xff1a; &#xff08;1&#xff09;算术运算符&#xff1a;加号 、减号 - 、乘号 * 、除号 / 、取余数 % 、幂运算 ** 、整除 // 。 &#xff08;2&#xff09;比较运算符&#xff1a;等于 、不等于 ! 、大于 > 、小于 < 、大于等于 >…

【Processing】创意编程零基础学习笔记

博客简介 最近出于兴趣爱好&#xff0c;在学习Processing创意编程。此篇博客用来记录我学习Processing创意编程的基础知识&#xff0c;在我学习Processing的过程中&#xff0c;我会持续修改、更新这篇博客。运用Processing写的一些有趣的小项目&#xff0c;会更新在Procesing专…

Speech and Language Processing之RNN

循环神经网络(RNN)是在其网络连接中包含循环的任何网络。也就是说&#xff0c;任何一个单元的值直接或间接依赖于作为输入的早期输出的网络。虽然这种网络很强大&#xff0c;但很难进行推理和训练。然而&#xff0c;在一般的循环网络中&#xff0c;有一些被证明在应用于口语和书…