PO模式在selenium自动化测试框架的优势

大家都知道po模式可以提高代码的可读性和减少了代码的重复,但是相对的缺点还有,今天通过本文一起学习下PO模式在selenium自动化测试框架的优势,需要的朋友可以参考下
PO模式简介
1.什么是PO模式
PO模型是:Page Object Model的简写 页面对象模型
作用:就是把测试页面和测试脚本进行分离,即把页面封装成类,供测试脚本进行调用;
分层机制,让不同层去做不同类型的事情,让代码结构清晰,增加复用性。
PO设计模式是Selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装
2. 不使用PO设计会出现以下几种情况:
复用性不太好,扩展性不好,易读性差,不好维护,UI界面频繁的项目维护起来比较麻烦。
3.PO模式的优缺点
优点:
-
提高代码的可读性
-
减少了代码的重复
-
提高代码的可维护性,特别是针对UI界面频繁的项目
缺点:
造成项目结构比较复杂,因为是根据流程进行了模块化处理
下面重点看下PO模式在selenium自动化测试框架的优势。
PO模式是在UI自动化测试过程当中使用非常频繁的一种设计模式,使用这种模式后,可以有效的提升代码的复用能力,并且让自动化测试代码维护起来更加方便。
PO模式的全称叫page object model(POM),有时候叫做 page object pattern。最开始由马丁福勒提出,这个模式受到selenium自动化测试框架大力推广,因而成为一种非常主流的自动化测试设计模式。
在PO模式当中,每一个UI页面使用编程语言当中的类来表示。在这个类当中,通过函数形式定义页面的行为和操作。这让调用方不需要关注具体执行的操作到底是点击还是拖动,而是关注具体的业务,比如登录、购物等等,甚至如果程序员直接把代码给产品经理看,他也是能看懂的。

没有使用PO模式时
在测试用例中直接编写浏览器操作API,对于代码编写者并没有多高的难度,因为他自己已经对这些API非常熟悉,但是这些浏览器操作并不能体现业务,至少没有产品经理那么熟悉,因此他很难和产品经理进行沟通,也难和开发沟通,甚至在半个月之后,他已经忘记了自己到底写了什么东西。
def test_login_mail(self):driver = self.driverdriver.get("http://www.xxx.xxx.com")driver.find_element_by_id("idInput").clear()driver.find_element_by_id("xxxxxxx").send_keys("xxxxx")driver.find_element_by_id("xxxxxxx").clear()driver.find_element_by_id("xxxxxxx").send_keys("xxxxxx")driver.find_element_by_id("loginBtn").click()
使用PO模式
使用PO模式有利于梳理业务,也有利于和其他人进行沟通。当你把下面这段代码拿给产品经理看的时候,他也大概能知道你测的是什么业务,能帮你纠正你的测试流程是否正确,或者提出一些更有建设性的意见,这对于大型项目需要频繁沟通和梳理业务时非常有用。
def test_login_mail(self):LoginPage(driver).login()
而浏览器本身的操作,就会被分离到一个更底层的模块,这些代码你可以不对调用方暴露,产品经理并不关心你这个页面中什么元素定位,他也不懂。
class LoginPage:username_loc=(By.ID,"idInput")password_loc =(By.ID,"pwdInput")submit_loc =(By.ID,"loginBtn")span_loc=(By.CSS_SELECTOR,"div.error-tt>p")dynpw_loc =(By.ID,"lbDynPw")userid_loc =(By.ID,"spnUid")def __init__(self, driver):self.driver = driverdef login(self):self.driver.find_element(*self.username_loc).clear()self.driver.find_element(*self.username_loc).send_keys("xxxxx")self.driver.find_element(*self.password_loc).clear()self.driver.find_element(*self.password_loc).send_keys("xxxxxx")self.driver.find_element(*self.submit_loc).click()
这种方式把元素定位方式也分离了。但是这种元素定位的表达式可读性也不是很强,可以换用 property 方式来表示元素,所有的元素统一放在一起,修改起来也比较方便。
class LoginPage:def __init__(self, driver)self.driver = driver@propertydef username_element(self):return self.driver.find_element('id', 'idInput')def password_element(self):return self.driver.find_element('id', 'pwdInput')def submit_element(self):return self.driver.find_element('id', 'loginBtn')def login(self, name, password):self.username_element.send_keys(name)self.password_element.send_keys(password)self.submit_element.click()
第三种方式可以充分利用Python的描述符特性,你会发现很多序列化库或者ORM框架都有类似的用法。
class LoginPage:def __init__(self, driver)self.driver = driverusername = Element(css='#idInput', desc='用户名输入框')password = Element(css='#pwdInput', desc='密码输入框')confirm = Element(css='#loginBtn', desc='登录确认按钮')def login(self, name, password):self.username.send_keys(name)self.password.send_keys(password)self.confirm.click()
而 Element 类可以通过 Python 描述符实现,这里为了方便,只定义了xpath的元素定位方法:
class Element:def __init__(self,xpath=None,desc=''):self.xpath = xpathself.desc = descdef __get__(self, instance, owner):driver = instance.browserel = driver.find_element('xpath', self.xpath)return el
PO模式和DDD
PO模式是DDD(领域驱动设计)的一个简单实现,但是还不够彻底。如果要在自动化测试中贯彻DDD,我觉得还有一些可以优化的空间。
首先某一个业务不一定只是单个页面的操作,比如登录不一定只涉及到LoginPage这个页面,因此直接在LoginPage中编写login函数就不是很合理。对于调用方来说,应该明确说明的是谁在登录,而不是指某个页面。像这样:
user.login()
# or
login(user)
我们编写的代码就像是自然语言,任何懂英语的人都知道代码在做什么,在DDD中,叫做领域特定语言(DSL), 要实现这种逻辑,在Page类和调用中间应该还会有一个层级来封装user。
其次,Page页面会依赖更底层的资源,比如组件,元素类型。因此在 Page 类的下方应该会使用 InputElement, ButtonElement 、SelectElement 这样的元素类和 HeaderComponent、FooterComponent 这样的组件类。
class LoginPage:username_filed = InputElement('xxx')password_filed = PasswordElement('xxx')
领域驱动设计对于大型项目梳理业务、同步业务、沟通业务是非常有帮助的,是一种以业务为中心的设计范式。PO模式对于DDD的小范围应用,以及具体了足够多的好处:
-
便于维护。每一个页面的操作都被单独的存放在一个类文件中,当前端页面
被修改之后,只需要找到对应类文件进行修改,其他的代码并不需要进行修改,这符合单一职责原则。
-
便于重复使用。在进行自动化测试的时候,一个测试由多个测试步骤组成,
这些测试步骤可能涉及到多个页面的操作。而用例与用例之间的操作可能重合。PO模式可以重复利用这些测试步骤,简化代码的编写。
-
提高了可读性。页面的操作都被以函数的形式封装起来了。函数名就具备注
释的作用,其他人阅读代码时可以通过函数了解业务。
到此这篇关于PO模式在selenium自动化测试框架有什么好处的文章就介绍到这了。
最后
如果你想学习自动化测试,那么下面这套视频应该会帮到你很多
如何逼自己1个月学完自动化测试,学完即就业,小白也能信手拈来,拿走不谢,允许白嫖....
最后我这里给你们分享一下我所积累和整理的一些文档和学习资料,有需要直接领取就可以了!

以上内容,对于软件测试的朋友来说应该是最全面最完整的备战仓库了,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。

相关文章:
PO模式在selenium自动化测试框架的优势
大家都知道po模式可以提高代码的可读性和减少了代码的重复,但是相对的缺点还有,今天通过本文一起学习下PO模式在selenium自动化测试框架的优势,需要的朋友可以参考下 PO模式简介 1.什么是PO模式 PO模型是:Page Object Model的简写 页面对象…...
Java操作Elasticsearch(新增数据)
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
Android中级——MVVM
MVVM MVVM是什么?MVVM实现前提ModelViewModelView MVVM是什么? Model-View-ViewMode架构,可看作MVP改进版,将此前Presenter的逻辑操作交给ViewMode中的Binder去处理 Mode:封装数据存储及相关操作逻辑,与MV…...
AIGC:引领人工智能和游戏产业融合的里程碑
目录 引言: 一、AIGC简介 二、AIGC的意义和作用 三、AIGC的未来展望 四、AIGC的影响和成果 五、结论 引言: 人工智能技术的快速发展在过去几年中引起了全球范围内的广泛关注和热议。其中,AIGC(Artificial Intelligence and G…...
ubuntu安装rust教程
参考【Rust】Linux上安装Rust开发环境 sudo apt-get install curl# 注意,不开代理很可能下不到,一直报403 export RUSTUP_DIST_SERVERhttps://mirrors.ustc.edu.cn/rust-static export RUSTUP_UPDATE_ROOThttps://mirrors.ustc.edu.cn/rust-static/rustu…...
iOS UIWebView与WKWebView 那些事
一、前言介绍 UIWebView 是 iOS 2 中推出的网页容器,UIWebView是最占内存的控件;直到 iOS 8 以后,苹果推出了 WebKit 框架,其中 WKWebView 正式被推出来接替 UIWebView 的位置;iOS 12 中,苹果正式弃用 UIWebView,要求开发者用 WKWebView 全面替换 UIWebView,apple 官方…...
wps/word 之 word中的两个表格 如何合并成为一个表格(已解决)
第一步:新建两个表格: 如何实现上面的两个表格合并呢? 分别选定每个表格,然后鼠标右键---》表格属性 在表格属性中的 表格---》选择 无文字环绕。 第二个表格按照同样的方法 设置 无文字环绕。 然后将中的文本行删去即可以了。选…...
02HTML功能元素
1.功能元素 1.1.列表标签 列表标签的作用: 给一堆数据添加列表语义, 也就是告诉搜索引擎告诉浏览器这一堆数据是一个整体 - HTML中列表标签的分类 无序列表(最多)(unordered list) 有序列表(最少)(ordered list) 定义列表(其次)(definition list) 1.1.1.无序列…...
并发编程-延时队列DelayQueue
数据结构学习网站: Data Structure Visualization 思维导图 DelayQueue (延时队列) DelayQueue 是一个支持延时获取元素的阻塞队列 , 内部采用优先队列 PriorityQueue 存储元素,同时元素必须实现 Delayed 接口&#x…...
Python之哈希表-遍历和有序性
Python之哈希表-遍历和有序性 有序性 字典元素是按照key的hash值无序存储的。 但是,有时候我们却需要一个有序的元素顺序,Python 3.6之前,使用OrderedDict类可以做到,3.6开 始dict自身支持。 d1 {b:33, c:True, d:[1], f:234…...
Oracle数据库完整卸载的完整步骤
时间:2023-03-15来源:系统城装机大师作者:佚名 1、停止所有Oracle服务 进入计算机管理,在服务中,找到oracle开头的所有服务,右击选择停止。 快捷键:ctrlshiftesc打开任务管理器 文章来源 Or…...
HP OfficeJet Pro 8020 如何更换碳粉盒
环境: HP OfficeJet Pro 8020 问题描述: HP OfficeJet Pro 8020 如何更换碳粉盒 解决方案: 更换碳粉盒 更换所有墨水不足的碳粉盒或空碳粉盒。 1.打开前挡盖,然后提起碳粉盒检修门。 打开打印机门 2.等待笔架停止后再继续操作…...
【Javascript】基础数据类型
目录 基础数据类型 1.number 字面量声明 数字对象方式声明 整数判断 指定返回小数位数 NaN-表示非数字值 浮点精度 解决误差 String 字面量声明 数字对象声明 连接运算符 获取长度 大小写转换 转换成大写 转换成小写 编辑 移除空白 获取单字符 编辑 截…...
【C语言】进阶——程序编译
目录 一:🔒程序环境 程序的翻译环境和执行环境 💡1.1翻译环境 预编译阶段: 编译阶段: 汇编阶段: 链接阶段: 💡1.2运行环境 二:🔒预处理详解 &…...
记录阿里云服务器(Centos7.9)部署Thingsboard(3.4.2)遇到的一些问题
记录编译Thingsboard遇到的一些问题 部署了一个thingsboard项目到阿里云服务器上,历时十一天,遇到了很多困难,国内关于Thingsboard的资料确实很少,所以想着写一篇博客记录一下,或许能够给以后编译遇到类似问题的人一些…...
docker更新容器映射端口
一个容器已经暴露了一个端口被外界使用,但是这个端口被公司不允许使用,需要修改为其他的端口,怎么办? 1、删除原容器,重启新容器 删除已启动容器,从镜像重启新容器。2、修改原容器配置文件 3、生成镜像&…...
Pr快捷键
Pr快捷键 以下快捷键都是在英文输入法下 一、隐藏顶部项目信息 Ctrl\ 注意:是反斜杠,回车上面的按键二、单独放大窗口 选中面板按~键三、放大/缩小时间轴素材 \四、自动选中素材 序列菜单-选择跟随播放指示器五、快速定位间隙 SHIFT鼠标拖动素材 …...
94. 递归实现排列型枚举
题目: 94. 递归实现排列型枚举 - AcWing题库 思路: 1.全排列问题(坑位问题)---->递归搜索树---->用dfs深度优先搜索。 2. u表示当前坑位,state[u]表示坑位u存储的数据。因为不同坑位的数据不可以重复&#…...
白水三佳电脑ERP部署
安装宝塔面板,有这个方便很多,可以省下3天的环境部署时间。 移动端, 先取移动版的压缩包,上传至服务器/www/wwwroot/目录下面,直接解压到当前目录后会生成/www/wwwroot/m/的目录,移动版就在这里面了。以下…...
电流监测芯片SGM8199A2应用电路设计
SGM8199是一系列具有电压输出功能的双向电流监测芯片,用于监测共模电压范围内分流电阻上的压降,而不受电源电压的影响。该器件具有-0.1V至26V的宽共模电压范围输入。低偏移使得在监测电流时允许分流器上的满量程最大压降为10mV。SGM8199系列提供三种固定…...
手把手教你调试DW9763马达驱动:从寄存器配置到Android上层适配全流程
深度解析DW9763马达驱动调试:从寄存器操作到Android HAL层适配实战 在摄像头模组开发中,自动对焦功能的稳定性和精确度直接影响用户体验。DW9763作为一款广泛应用于移动设备的音圈马达驱动芯片,其调试过程涉及硬件寄存器配置、电源管理、内核…...
如何快速配置Wand-Enhancer:WeMod客户端终极增强工具使用指南
如何快速配置Wand-Enhancer:WeMod客户端终极增强工具使用指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer Wand-Enhancer是一款专为WeMod…...
深度测评Alpha AI:大模型加持下,这款AI量化引擎表现如何?
在技术加速融合的当下,智能工具领域正在经历一场深刻的技术洗牌。市面上标榜“智能”的系统层出不穷,但能够落地并解决实际痛点的相对有限。近期,主打“跨模态大模型”与“智能托管执行”的Alpha AI引起了业内的广泛关注。作为深耕行业的前沿…...
量子计算里的‘万能钥匙’:从受控U门到通用量子门集的构建心法
量子计算里的‘万能钥匙’:从受控U门到通用量子门集的构建心法 量子计算正从实验室走向现实应用,而理解其底层逻辑的关键在于掌握量子门这一"原子操作"。与经典计算机中晶体管组成逻辑门类似,量子计算机通过量子门的组合实现复杂运…...
Charles抓包实战:从零配置到成功解密微信小程序/H5页面请求
Charles抓包实战:解密微信小程序与H5页面流量的全链路指南 当你盯着手机屏幕上那个加载缓慢的H5页面,或是调试一个行为诡异的微信小程序时,是否曾渴望能像X光一样透视所有网络请求?作为从业十年的全栈开发者,我经历过太…...
从机器学习实战出发:深入理解NumPy矩阵乘法np.dot在模型中的应用(以线性回归为例)
从机器学习实战出发:深入理解NumPy矩阵乘法np.dot在模型中的应用(以线性回归为例) 当你第一次用NumPy实现线性回归时,可能会被各种乘法操作搞糊涂——为什么这里用np.dot而不是*?为什么权重更新时用矩阵乘法而不是逐元…...
星穹铁道抽卡数据分析:3步掌握你的欧气规律
星穹铁道抽卡数据分析:3步掌握你的欧气规律 【免费下载链接】star-rail-warp-export Honkai: Star Rail Warp History Exporter 项目地址: https://gitcode.com/gh_mirrors/st/star-rail-warp-export 想知道你的抽卡运气到底怎么样吗?星穹铁道跃迁…...
导数概念解析:从基础计算到实际应用
1. 导数概念的本质与直观理解微积分中的导数概念,本质上描述的是函数在某一点处的瞬时变化率。想象你正在驾驶汽车行驶在高速公路上,仪表盘上的速度表指针不断摆动——这个实时显示的速度值,就是你的位置函数关于时间的导数。在数学表达上&am…...
Yelp 推全新 AI 助手,一次对话搞定餐厅预订、外卖订购等复杂任务!
Yelp 全新 AI 助手:一次对话搞定生活服务Yelp 正在推出一款全新的 AI 助手,用户无需阅读大量餐厅评论,也不用自己预订餐位,只需通过一次对话提问,就能安排相关服务。这款助手适用于 Yelp 上的所有类别,在 i…...
告别模糊图像:用Python+OpenCV手把手实现维纳滤波图像去噪(附完整代码)
告别模糊图像:用PythonOpenCV手把手实现维纳滤波图像去噪 你是否遇到过这样的困扰?珍贵的照片因为拍摄时的抖动变得模糊不清,或是扫描的文档上布满了恼人的噪点。这些问题不仅影响观感,还可能丢失重要信息。今天,我们将…...
