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…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...