UnitTest + Selenium 完成在线加法器自动化测试

1. 任务概述

利用 UnitTest 与 Selenium 编写自动化用例,测试在线加法器中的整数单次加法功能【如1+2=3 】

image-20231116123419627

人工操作流程(测试 1+2 是否等于 3):

  1. 打开在线加法器
  2. 点击按钮1,再点击按钮+,再点击按钮2,再次点击按钮=
  3. 观察计算机框框的计算结果是否等于3,若出现错误则截图保留,否则测试通过
  4. 关闭浏览器

自动化测试编写流程:

  1. 使用 selenium 实例化浏览器,打开在线加法器并最大化窗口

  2. 使用 CSS 选择器定位至按钮清屏,点击【此处是为了保险】

    使用 CSS 选择器定位至按钮1,点击

    使用 CSS 选择器定位至按钮+,点击

    使用 CSS 选择器定位至按钮2,点击

    使用 CSS 选择器定位至按钮=,点击

  3. 使用 CSS 选择器定位至结果框框,获取此组件value值并与预期结果3进行比对,过程中发生错误截图保留

  4. 关闭浏览器

2. PO模式

Page Objece,分层机制,让不同层去做不同类型的事情,让代码结构清晰,增加复⽤性

  • 两层:对象逻辑层 + 业务数据层
  • 三层:对象库层 + 逻辑层 + 业务数据层【本案例所使用】
  • 四层:对象库层 + 逻辑层 + 业务层 + 数据层

base层

将最基础的一类方法进行封装,如点击click,获取value值,浏览器实例化等操作,通过被继承从而实现复用

page层

定义一些配置数据,如在线计算器网址,各按钮的定位方式等,同时通过继承 Base 类得到一些基础方法,在此基础上进一步完善处理逻辑

scripts层

编写测试类,完善业务处理流程,script 调用 page 并设置断言【即结果是否正确】,发生错误时完成截图并存储至于 image 层

3. 源码详情

image-20231116133902844

base层

base.py

import time
from selenium.webdriver.support.wait import WebDriverWait
class Base:# 初始化方法def __init__(self,driver):self.driver = driver# 查找元素def base_find_element(self,loc,timeout=30,poll_frequency=0.5):""":param loc: 元素的定位信息,格式为元组:param timeout: 显式等待最长时间:param poll_frequency: 显式等待请求间隔:return:  返回查找到的对象"""# 显式等待特定组件return WebDriverWait(self.driver,timeout=timeout,poll_frequency=poll_frequency).until(lambda x:x.find_element(*loc))# 点击def base_click(self,loc):self.base_find_element(loc).click()# 获取组件value属性值def base_get_value(self,loc):return self.base_find_element(loc).get_attribute('value')# 截图def base_get_img(self):self.driver.get_screenshot_as_file(f'../image/{time.strftime("%Y_%m_%d %H_%M_%S")}.png')

get_driver.py

from selenium import webdriver
from calcTestProject import page
class GetDriver:driver = None# 获取driver@classmethoddef get_driver(cls):if cls.driver is None:option = webdriver.ChromeOptions()# 指定chrome存储路径的二进制形式option.binary_location = page.binary_location# 实例化浏览器cls.driver = webdriver.Chrome(options=option)# 最大化窗口cls.driver.maximize_window()# 打开浏览器cls.driver.get(page.url)return cls.driver# 推出driver@classmethoddef quit_driver(cls):if cls.driver:cls.driver.quit()# 置空cls.driver=None

page层

__init__.py

from selenium.webdriver.common.by import By
""""以下为服务器域名配置数据"""
url = "http://zaixianjisuanqi.bmcx.com"
# 谷歌浏览器位置
binary_location='D:\Chrome\Google\Chrome\Application\chrome.exe'
"""以下为计算器配置数据"""
# 加号
clac_add = (By.CSS_SELECTOR,'#simpleAdd')
# 等号
clac_eq = (By.CSS_SELECTOR,'#simpleEqual')
# 获取结果
clac_result = (By.CSS_SELECTOR,'#resultIpt')
# 清屏
clac_clear = (By.CSS_SELECTOR,'#simpleClearAllBtn')

page_calc.py

from calcTestProject.base.base import Base
from selenium.webdriver.common.by import By
from calcTestProject import page
class PageCalc(Base):# 点击数字方法def page_click_num(self,num):for n in str(num):# 按照计算需求拼接数字按键的locloc = (By.CSS_SELECTOR,f'#simple{n}')self.base_click(loc)# 点击加号def page_click_add(self):self.base_click(page.clac_add)# 点击等号def page_click_eq(self):self.base_click(page.clac_eq)# 获取结果方法def page_get_value(self):self.base_get_value(page.clac_result)# 点击清屏def page_click_clear(self):self.base_click(page.clac_clear)# 截图def page_get_image(self):self.base_get_img()# 组装加法业务方法def page_add_calc(self,a,b):# 清屏self.page_click_clear()# 点击第一个数self.page_click_num(a)# 点击加号self.page_click_add()# 点击第二个数self.page_click_num(b)# 点击等号self.page_click_eq()# 返回计算结果return self.page_get_value()

script层

test_calc.py

import unittest
from parameterized import parameterized
from calcTestProject.page.page_calc import PageCalc
from calcTestProject.base.get_driver import GetDriverclass TestCalc(unittest.TestCase):# 类前置操作@classmethoddef setUpClass(cls):# 获取driver对象cls.driver = GetDriver().get_driver()cls.calc = PageCalc(cls.driver)# 下拉条,防止广告遮挡js = "window.scrollTo(0,256)"cls.driver.execute_script(js)# 类后置操作@classmethoddef tearDownClass(cls):GetDriver().quit_driver()# 测试加法方法(1+2是否等于3)@parameterized.expand(((1,2,3),))def test_add_calc(self,a,b,expect):# 调用计算业务方法self.calc.page_add_calc(a,b)try:# 断言【判断测试结果】self.assertEqual(self.calc.page_get_value(),str(expect))except:# 截图self.calc.page_get_image()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 串口应用编程

1 串口 API Linux串口通信: 在 Linux 系统中,操作设备的统一接口就是: open/ioctl/read/write 。 对于 UART ,又在 ioctl 之上封装了很多函数,主要是用来设置行规程。所以对于 UART ,编程的套路就是…

LINUX入门篇【7】--git提交指令以及代码调试工具gdb

前言: 我们今天来介绍一下我们工具篇的最后两个工具,即git提交指令以及代码调试工具gdb,再结合前面的知识点,我们就可以基本完成我们VS上的基本的功能:编写,调试,编译,执行程序的这些过程。 1…

西南科技大学814考研一

C语言基础 字节大小 char:1 字节 unsigned char:1 字节 short:2 字节 unsigned short:2 字节 int:通常为 4 字节(32 位平台)或 8 字节(64 位平台) unsigned int&#x…

【FFmpeg实战】ffmpeg播放器-音视频解码流程

音视频介绍 音视频解码流程 FFmpeg解码的数据结构说明 AVFormatContext:封装格式上下文结构体,全局结构体,保存了视频文件封装格式相关信息AVInputFormat:每种封装格式,对应一个该结构体AVStream[0]:视频文件中每个视频&#xff…

Java值传递和引用传递

在Java中,有值传递(Pass-by-Value)和引用传递(Pass-by-Reference)两种参数传递方式。 值传递(Pass-by-Value):当使用值传递方式时,方法将参数的副本传递给调用方法。这意…

【Java】抽象类和接口

文章目录 一、抽象类1.抽象类的概念2.抽象类的语法3.抽象类的特性4.抽象类的作用 二、接口1.接口的概念2.语法规则3.接口的使用4.接口的特性5.实现多个接口6.接口间的继承7.接口的使用实例8.Clonable 接口和深拷贝9.抽象类和接口的区别 三、Object类1.获取对象信息2.对象的比较…

Jmeter 如何监控目标服务的系统资源

下载Jmeter插件管理下载 perfmon 将这个插件管理放到Jmeter的\lib\ext目录下 然后重启Jmeter jmeter-plugins-manager-1.10.jar 下载 perfmon插件 添加 io 内存 磁盘的监听 并且添加监听 在宿主机中安装代理监听程序 并启动 ServerAgent.tar.gz

UDP网络套接字编程

先来说说数据在网络上的传输过程吧,我们知道系统其实终究是根据冯诺依曼来构成的,而网络数据是怎么发的呢? 其实很简单,网络有五层。如下: 如上图,我们知道的是,每层对应的操作系统中的那些地方…

系列一、堆里面的分区:Eden、From、To、老年代各自的特点

一、堆里面的分区:Eden、From、To、老年代各自的特点 堆是对象共享的区域,也是垃圾回收器主要工作的地方。主要分为新生区、养老区和元空间,而这三块地方中GC主要工作在新生区和养老区,其中新生区占1/3、养老区占2/3,新…

《微信小程序开发从入门到实战》学习二十二

3.3 开发创建投票页面 3.3.10 使用switch开关组件 用switch开关组件增加一个设置是否匿名投票的功能。 switch常用属性如下: checked 开还是关,默认false关 disabled 是否禁用,默认false不禁用&#xff0…

openssl1.0.2版本Windows安装问题

之前安装过1.1版本,Windows环境下C 安装OpenSSL库 源码编译及使用(VS2019)_vs2019安装openssl_肥宝Fable的博客-CSDN博客 后来发现linux编译不过,以为是版本问题,相差太大,所以降一下版本,以免…

NAS层协议栈学习笔记

NAS(Non-Access Stratum)是无线网络中非接入层及包括移动性管理(MM)和会话管理(SM)协议 ,在5G(NR)系统中连接管理(Connection Management)用于建立和释放UE与AMF之间的控制面(CP)信令连接。 5G中移动性管理是通过NAS信令在UE与核心网之间进行交互的,连接…

设计模式常见面试题

简单梳理下二十三种设计模式,在使用设计模式的时候,不仅要对其分类了然于胸,还要了解每个设计模式的应用场景、设计与实现,以及其优缺点。同时,还要能区分功能相近的设计模式,避免出现误用的情况。 什么是…

第十一周任务总结

本周任务总结 本周物联网方面主要继续进行网关的二次开发与规则引擎实现设备联动的实现 非物联网方面主要复习了docker的使用与算法的学习 1.网关的二次开发,本周将实现debug调试输出的文件下载到了网关,但网关出了问题无法连接,最终跟客服…

Web之CSS笔记

Web之HTML、CSS、JS 二、CSS(Cascading Style Sheets层叠样式表)CSS与HTML的结合方式CSS选择器CSS基本属性CSS伪类DIVCSS轮廓CSS边框盒子模型CSS定位 Web之HTML笔记 Web之JavaScript(jQuery)笔记 二、CSS(Cascading Style Sheets层叠样式表&…

Selenium安装WebDriver最新Chrome驱动(含116/117/118/119)

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

Halcon Solution Guide I basics(2): Image Acquisition(图像加载)

文章目录 文章专栏前言文章解读文章开头流程图算子介绍案例自主练习读取一张图片读取多张图片 文章专栏 Halcon开发 Halcon学习 练习项目gitee仓库 前言 今天来看Halcon的第二章,图像获取。在第二章之后,后面文章就会提供案例了。到时候我会尽量完成每一…

Kotlin 知识体系

Kotlin 知识体系 1、Kotlin 文档2、Kotlin 基础3、桌面应用程序4、Android 与 iOS 应用程序 1、Kotlin 文档 Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复…

【数据结构初阶】单链表SLlist

描述 不同于顺序表,顺序表的数据是存储在一个连续的空间里的 而链表它是链接起来的结构体地址。 所以我们不用像顺序表一样先创建一块空间出来,而是创建一个能存数据节点和节点与下一个节点之间的连接; 所以:“一个能存数据节点…

鸿蒙:从0到“Hello Harmony”

效果展示 一.概述 明年华为鸿蒙就不再兼容Android生态了,作为拥有7亿终端用户的华为,建立自己的生态也是理所当然。 所以对HarmonyOS的研究也是众多开发者绕不开的坎了。 今天这篇博文主要实现一个“Hello Harmony!”的Demo。 二.官方链接…