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
    @classmethod
    def 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
    @classmethod
    def 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):
            # 按照计算需求拼接数字按键的loc
            loc = (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 GetDriver

class TestCalc(unittest.TestCase):
    # 类前置操作
    @classmethod
    def setUpClass(cls):
        # 获取driver对象
        cls.driver = GetDriver().get_driver()
        cls.calc = PageCalc(cls.driver)
        # 下拉条,防止广告遮挡
        js = "window.scrollTo(0,256)"
        cls.driver.execute_script(js)

    # 类后置操作
    @classmethod
    def 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()

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

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

相关文章

adb手机调试常用命令

查看手机型号 adb shell getprop ro.product.model 查看电池状况 adb shell dumpsys battery 查看分辨率 adb shell wm size 查看屏幕密度 adb shell wm density 查看显示屏参数 adb shell dumpsys window displays 查看android_id adb shell settings get secure android…

安科瑞为数据中心绿色高质量发展贡献力量

安科瑞 崔丽洁  0前言 目前,数字经济的迅猛发展激发了数据中心的算力需求,数据中心规模与功耗密度不断提高,能耗问题日益突出。短期内,数据中心的能耗、碳排放量仍会呈现上升趋势。面对国家“双碳”压力,我国数据中心…

Active Directory 域服务基础知识

Active Directory 域服务(AD DS)是 Microsoft 提供的传统本地域服务,它是 Active Directory(AD)中的核心组件和服务器角色,Active Directory(AD)是 Windows 操作系统环境中的专用专有…

vue2项目修改编译巨慢

前言:我们的一个vue项目在给新同事后他说编译贼慢,一个小修改项5分钟才能自动编译成功,我把项目放到新电脑上也巨慢,升级了nodejs好使了一些,但还是慢,最后引入webpack后巨快, 在项目的package…

初识Java 18-1 泛型

目录 简单泛型 元组库 通过泛型实现栈类 泛型接口 泛型方法 可变参数和泛型方法 通用Supplier 简化元组的使用 使用Set创建实用工具 本笔记参考自: 《On Java 中文版》 继承的层次结构有时会带来过多的限制,例如:编写的方法或类往往…

前端学习笔记--React

1. 什么是React? React 是一个用于构建用户界面的JavaScript库核心专注于视图,目的实现组件化开发我们可以很直观的将一个复杂的页面分割成若干个独立组件,每个组件包含自己的逻辑和样式 再将这些独立组件组合完成一个复杂的页面。 这样既减少了逻辑复杂度,又实现…

12-1- GAN -简单网络-线性网络

功能 随机噪声→生成器→MINIST图像。 训练方法 1 判别器的训练,首先固定生成器参数不变,其次判别器应当将真实图像判别为1,生成图像判别为0 loss=loss(real_out, 1)+loss(fake_out, 0) 2 生成器的训练,首先固定判别器参数不变,其次判别器应当将生成图像判别为1 loss…

你应该知道关于Python的这几个技巧!

随着大数据时代的到来,我们每天都在接触爬虫相关的事情,这其中就不得不提及Python这门编程语言。我已经使用Python编程有多年了,即使今天我仍然惊奇于这种语言所能让代码表现出的整洁和对DRY编程原则的适用。这些年来的经历让我学到了很多的小…

MySQL覆盖索引的含义

覆盖索引:SQL只需要通过索引就可以返回查询所需要的数据,而不必通过二级索引查到主键之后再去查询数据,因为查询主键索引的 B 树的成本会比查询二级索引的 B 的成本大。 也就是说我select的列就是我的索引列(或者主键,…

XD6500S— LoRa SIP模块

XD6500S是一系列LoRa SIP模块,集成了射频前端和LoRa射频收发器SX1262系列,支持LoRa和FSK调制。收发器SX1262系列,支持LoRa和FSK调制。LoRa技术是一种扩频协议,针对LPWAN 应用的低数据速率、超远距离和超低功耗通信进行了优化。通信…

KMP算法详讲(问题导向,通俗易懂)

KMP算法是一种高效的字符串匹配算法,相比于BF算法的时间复杂度为O(n*m),它的时间复杂度降低到了O(nm)。这种算法的高效性在于它利用了主串的指针不回溯,而只移动模式串的指针位置。然而,对于初学者来说,KMP算法并不容易…

全面掌握:性能测试计划的制胜法宝

一.简介 简介部分就不用过多描述了,无非项目的背景,进行此次性能测试的原因,以及性能测试覆盖的范围等等,几乎所有项目文档都在开端对项目进行简单的阐述。 二.性能测试需求 寻找的被测试对象和压力点 …

windows 部署 weblogic 12.1.3

1、安装 1)下载 地址:WebLogic Server 12c (12.2.1), WebLogic Server 11g (10.3.6) and Previous Releases 2)安装 weblogic server java -Xmx1024m -jar fmw_12.1.3.0.0_wls.jar 出现图形界面按需配置,注意配置的安装路径不能…

11月编程榜最新出炉,第一名很离谱

这段时间,随着人工智能的崛起,Python的地位水涨船高。有不少朋友感觉到危机重重。 其中,最明显的,是市场环境的变化: 外部招聘:Python岗位日均需求量高达15000!不仅是程序员,内容编…

【分享课】11月16日晚19:30PostgreSQL分享课:PG缓存管理器主题

PostsreSQL分享课分享主题: PG缓存管理器主题 直播分享平台:云贝教育视频号 时间:11月16日 周四晚 19: 30 分享内容: 缓冲区管理器结构 缓冲区管理器的工作原理 环形缓冲区 脏页的刷新

uniapp使用Canvas实现电子签名

来源: 公司的一个需求,需要给新注册的会员和客商需要增加签署协议功能; 之前的思路: 1、使用vue-signature-pad来实现电子签名,但是安卓手机不兼容; 2、uniapp插件市场来实现,但是对HBuilderX…

为什么小型企业应该拥抱数字化转型?

在当今飞速发展的商业环境中,数字化转型已经成为各种规模组织的必然选择。特别是小型企业,通过数字化转型,可以在保持竞争力、提高运营效率并开启新的增长机会方面获益匪浅。本文探讨了数字化转型的概念,强调了它对小型企业的重要…

测试小白必看:自动化测试入门基础知识

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

小型企业网络搭建方案

在这个日益数字化和连接的世界里,一个稳固的小型企业网络是实现高效运作的关键支柱。不论您是在经营一家初创公司还是小型企业,一个可靠的企业网络都是保证顺畅沟通、数据分享以及访问在线资源的重要因素。本篇文章将会引导您完成构建一个小型企业网络的…

C++入门第七篇--STL模板--vector模拟实现

前言: 有了前面的string库的介绍,在这里我就不再介绍vector库了,而是直接模拟实现了。 vector库的概念和作用: vector库是针对于数组的数据类型的容器,它有点类似我们曾经实现过的顺序表,你完全可以按照…