Selenium基于POM的自动化测试实践
什么是Page Object模式
Page Object 见名知意,就是页面对象,并将页面元素定位方法和元素操作进行分离。在实际自动化测试实战过程中,我们一般对脚本的实现分为三层:
(1)对象层: 用于存放页面元素定位和控件操作
(2)逻辑层: 则是一些封装好的功能用例模块
(3)业务层: 则是我们真正的测试用例的操作部分
PageObject 的优点
- 减少代码冗余
- 业务和实现分离
- 降低代码维护成本
PageObject 的六大原则
-
The public methods represent the services that the page offers/公共方法表示页面提供的服务
-
Try not to expose the internals of the page/尽量不要暴露页面的内部
-
Generally don’t make assertions/Page设计中不要出现断言,应该写在测试用例类中
-
Methods return other PageObjects/方法返回其他PageObject
-
Need not represent an entire page/不需要表示整个页面
-
Different results for the same action are modeled as different methods/相同操作的不同结果被建模为不同的方法
示例(登录百度一下)
一、构建PO模型
项目的整个PO结构如下

二、基础层
首先是base目录下的basepage.py


这里作为基类,封装定位、点击、输入等基本操作以及可以增加异常时截图的方法
三、对象层、逻辑层
page目录下的login_page.py

封装这个页面基本所有可能的操作,注意方法的最后最好可以返回接下来要跳转的页面对象(如登录后就会跳转到首页)
page_element目录下是单独为每个页面的元素做维护而建立的模块文件

还有common目录下

constant.py内定义一下常量,logger.py为日志打印
testcase目录


编写真正的测试用例,可以再次进行断言、添加测试报告等。
四、运行结果
DevTools listening on ws://127.0.0.1:50996/devtools/browser/8d43e43e-ca09-4513-b9bd-0517cf980a0e
INFO 2023-03-01 10:32:23,623 [test_login.py_16] ------用例前置工作:打开浏览器------
INFO 2023-03-01 10:32:25,086 [basepage.py_36] 查找百度首页-登录按钮 - 元素('id', 's-top-loginbtn')成功!
INFO 2023-03-01 10:32:25,123 [basepage.py_44] 点击:百度首页-登录按钮 - 元素('id', 's-top-loginbtn')成功
INFO 2023-03-01 10:32:28,032 [basepage.py_36] 查找输入登录账号 - 元素('id', 'TANGRAM__PSP_11__userName')成功!
INFO 2023-03-01 10:32:28,129 [basepage.py_54] 输入:在输入登录账号 - 元素('id', 'TANGRAM__PSP_11__userName')输入文本值(xxx)成功
INFO 2023-03-01 10:32:28,157 [basepage.py_36] 查找输入登录密码 - 元素('id', 'TANGRAM__PSP_11__password')成功!
INFO 2023-03-01 10:32:28,282 [basepage.py_54] 输入:在输入登录密码 - 元素('id', 'TANGRAM__PSP_11__password')输入文本值(xxx)成功
INFO 2023-03-01 10:32:28,332 [basepage.py_36] 查找点击登录按钮 - 元素('id', 'TANGRAM__PSP_11__submit')成功!
INFO 2023-03-01 10:32:28,603 [basepage.py_44] 点击:点击登录按钮 - 元素('id', 'TANGRAM__PSP_11__submit')成功
ERROR 2023-03-01 10:32:48,863 [basepage.py_66] 查找登录成功与否 - 元素('class name', 'user-name')失败!DevTools listening on ws://127.0.0.1:51175/devtools/browser/213f651a-8cb3-4d27-9f03-db5466c6614e
INFO 2023-03-01 10:32:54,779 [test_login.py_16] ------用例前置工作:打开浏览器------
INFO 2023-03-01 10:32:56,132 [basepage.py_36] 查找百度首页-登录按钮 - 元素('id', 's-top-loginbtn')成功!
INFO 2023-03-01 10:32:56,172 [basepage.py_44] 点击:百度首页-登录按钮 - 元素('id', 's-top-loginbtn')成功
INFO 2023-03-01 10:32:58,292 [basepage.py_36] 查找输入登录账号 - 元素('id', 'TANGRAM__PSP_11__userName')成功!
INFO 2023-03-01 10:32:58,374 [basepage.py_54] 输入:在输入登录账号 - 元素('id', 'TANGRAM__PSP_11__userName')输入文本值(xxx)成功
INFO 2023-03-01 10:32:58,406 [basepage.py_36] 查找输入登录密码 - 元素('id', 'TANGRAM__PSP_11__password')成功!
INFO 2023-03-01 10:32:58,512 [basepage.py_54] 输入:在输入登录密码 - 元素('id', 'TANGRAM__PSP_11__password')输入文本值(xxx)成功
INFO 2023-03-01 10:32:58,539 [basepage.py_36] 查找点击登录按钮 - 元素('id', 'TANGRAM__PSP_11__submit')成功!
INFO 2023-03-01 10:32:58,600 [basepage.py_44] 点击:点击登录按钮 - 元素('id', 'TANGRAM__PSP_11__submit')成功
INFO 2023-03-01 10:33:09,474 [basepage.py_36] 查找登录成功与否 - 元素('class name', 'user-name')成功!
INFO 2023-03-01 10:33:09,523 [basepage.py_68] 查找登录成功与否 - 元素('class name', 'user-name')成功!
INFO 2023-03-01 10:33:09,524 [test_login.py_24] ------用例后置工作:关闭浏览器------
F----------------------------------------------------------------------
Ran 2 tests in 50.878sFAILED (failures=1)
以上就是Web端Selenium基于OPM模型自动化测试框架的大体模式,实际上还有很多可以优化的地方,比如增加测试报告、测试结果自动发送邮件、实现CI/CD等。或许后续有时间可以继续做补充优化分享给大家。
以上就是本期文章的所有内容,感谢观看,如果对您有帮助请点赞关注+收藏,一键三连,多谢支持!
相关文章:
Selenium基于POM的自动化测试实践
什么是Page Object模式 Page Object 见名知意,就是页面对象,并将页面元素定位方法和元素操作进行分离。在实际自动化测试实战过程中,我们一般对脚本的实现分为三层: (1)对象层: 用于存放页面元素定位和控件操作 (2)逻…...
记录每日LeetCode 2373.矩阵中的局部最大值 Java实现
题目描述: 给你一个大小为 n x n 的整数矩阵 grid 。 生成一个大小为 (n - 2) x (n - 2) 的整数矩阵 maxLocal ,并满足: maxLocal[i][j] 等于 grid 中以 i 1 行和 j 1 列为中心的 3 x 3 矩阵中的 最大值 。 换句话说,我们希…...
QT中级(6)基于QT的文件传输工具(2)
QT中级(6)基于QT的文件传输工具(2)本文实现第一步1 新增功能2 运行效果3 实现思路4 源代码实现这个文件传输工具大概需要那几步?实现多线程对文件的读写实现TCP客户端和服务端实现网络传输 书接上回:QT中级…...
【Linux】工具(3)——gcc/g++
咱们继续进阶,接下来进入到Linux工具中gcc和g的学习在本章博客正式开始介绍之前,我们先要弄清楚程序是怎么翻译的:C语言程序环境一、什么是gcc/g📌gcc是一个c编译器, g是c编译器。我们根据代码的后缀名来判断用哪个编译…...
Android文件选择器
使用方法:在里层的build.grade的dependency里面加入: implementation com.leon:lfilepickerlibrary:1.8.0 引用https://github.com/leonHua/LFilePicker/blob/master/README_CH.md#lfilepicker LFilePicker 说明:如果发现应用名称被修改,可以参考issues#26 查看解决方案,或…...
《MySql学习》 Select 查询语句慢的非性能原因
一.查询被阻塞 A会话执行 查询操作,长时间没有返回信息,此时我们就可以去排查一下是否是被阻塞了 select * from words 被阻塞的原因有很多,首先列举第一种情况 1.等MDL锁 当我们执行DDL语句时,会自动给表加上MDL写锁。当执行DML和DQL时&…...
Vue组件间通信方式超详细(父传子、父传后代、子传父、后代传父、兄弟组件传值)
一、父传子、父传后代 方式一:子通过props来接收 父组件:父组件引入子组件时,通过<child :parentValue "parentValue"></child>子组件传值。 备注:这种方式父传值很方便,但是传递给后代组件不…...
【ES】Elasticsearch-深入理解索引原理
文章目录Elasticsearch-深入理解索引原理读操作更新操作SHARD不变性动态更新索引删除和更新实时索引更新持久化Segment合并近实时搜索,段数据刷新,数据可见性更新和事务日志更新索引并且将改动提交修改Searcher对象默认的更新时间Elasticsearch-深入理解…...
pdf压缩文件大小的方法是什么?word文件怎么批量转换成pdf格式?
大家在存储文件时,通常会遇到一些较大的文件,这时需要对其进行压缩处理。下面介绍一下如何压缩PDF文件大小以及批量转换Word文件为PDF格式。pdf压缩文件大小的方法是什么?1.打开小圆象PDF转换器,选择“PDF压缩”功能。2.在“PDF压缩”界面中…...
论文阅读——FECANet:应用特征增强的上下文感知小样本语义分割网络
代码:NUST-Machine-Intelligence-Laboratory/FECANET (github.com) 文章地址:地址 文章名称:FECANet: Boosting Few-Shot Semantic Segmentation with Feature-Enhanced Context-Aware Network 摘要 Few-shot semantic segmentation 是学习…...
数组模拟常见数据结构
我们来学习一下用数组模拟常见的数据结构:单链表,双链表,栈,队列。用数组模拟这些常见的数据结构,需要我们对这些数据结构有一定的了解哈。单链表请参考:http://t.csdn.cn/SUv8F 用数组模拟实现比STL要快&a…...
ADC0832的AD模数转换原理及编程
✅作者简介:嵌入式领域优质创作者,博客专家 ✨个人主页:咸鱼弟 🔥系列专栏:单片机设计专栏 📃推荐一款求职面试、刷题神器👉注册免费刷题 目录 一、描述 二、模数转换原理: 三、…...
【工具插件类教学】UnityPackageManager私人定制资源工具包
目录 一.UnityPackageManager的介绍 二.package包命名 三.包的布局 四.生成清单文件 五.制作package内功能 六.为您的软件包撰写文档 1.信息的结构 2.文档格式 七.提交上传云端仓库 1.生成程序集文件 2.上传至云端仓库 八.下载使用package包 1.获取包的云端路径 …...
【软件测试】2023年了还不会接口测试?老鸟总结接口测试面试谁还敢说我不会......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 测试面试࿰…...
类Vuex轻量级状态管理实现
引用自 摸鱼wiki 1. vuex vuex是一个前端广泛流行的状态管理库,主要由以下几大模块组成: state:状态存储getter:属性访问器mutation:可以理解为一个同步的原子性事务,修改state状态action:触发…...
Java 基本数据类型
Java基本数据类型是Java编程语言中最基本的数据类型,包括整型、浮点型、字符型、布尔型和空类型。本文将详细介绍Java基本数据类型的作用和在实际工作中的用途。 整型(int、long、short、byte) 整型是Java中最常见的基本数据类型࿰…...
全网资料最全Java数据结构与算法-----算法分析
算法分析 研究算法的最终目的就是如何花更少的时间,如何占用更少的内存去完成相同的需求,并且也通过案例演示了不同算法之间时间耗费和空间耗费上的差异,但我们并不能将时间占用和空间占用量化,因此,接下来我们要学习…...
【封装xib补充 Objective-C语言】
一、那么首先,咱们就从这个结果来分析 1.就不给大家一步一步分析了,直接分析我们这里怎么想的, 首先,我们看到这样的一个界面,我们想,这些应用数据是不是来源于一个plist文件吧, 所以说,我们首先要,第一步,要懒加载,把这个plist文件中的数据,加载起来, 那么,因…...
linux + jenkins + svn + maven + node 搭建及部署springboot多模块前后端服务
linux搭建jenkins 基础准备 linux配置jdk、maven,配置系统配置文件 vi /etc/profile配置jdk、maven export JAVA_HOME/usr/java/jdk1.8.0_261-amd64 export CLASSPATH.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport MAVEN_H…...
VBA之正则表达式(41)-- 快速标记两个星号之后的字符
实例需求:工作表中的数据保存在A列~G列,现需要识别D列中包含超过两个星号的内容,并将第3个星号及其之后的字符设置为红色字体,如图所示。 示例代码如下。 Sub Demo1()Dim objRegExp As ObjectDim objMatch As ObjectDim strMatch…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 三、匿名函数与闭包1. 匿名函数(Lambda函…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...
五、jmeter脚本参数化
目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...
