当前位置: 首页 > news >正文

Selenium基于POM的自动化测试实践

什么是Page Object模式

Page Object 见名知意,就是页面对象,并将页面元素定位方法和元素操作进行分离。在实际自动化测试实战过程中,我们一般对脚本的实现分为三层:
(1)对象层: 用于存放页面元素定位和控件操作
(2)逻辑层: 则是一些封装好的功能用例模块
(3)业务层: 则是我们真正的测试用例的操作部分

PageObject 的优点

  • 减少代码冗余
  • 业务和实现分离
  • 降低代码维护成本

PageObject 的六大原则

  1. The public methods represent the services that the page offers/公共方法表示页面提供的服务

  2. Try not to expose the internals of the page/尽量不要暴露页面的内部

  3. Generally don’t make assertions/Page设计中不要出现断言,应该写在测试用例类中

  4. Methods return other PageObjects/方法返回其他PageObject

  5. Need not represent an entire page/不需要表示整个页面

  6. 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组件间通信方式超详细(父传子、父传后代、子传父、后代传父、兄弟组件传值)

一、父传子、父传后代 方式一&#xff1a;子通过props来接收 父组件&#xff1a;父组件引入子组件时&#xff0c;通过<child :parentValue "parentValue"></child>子组件传值。 备注&#xff1a;这种方式父传值很方便&#xff0c;但是传递给后代组件不…...

【ES】Elasticsearch-深入理解索引原理

文章目录Elasticsearch-深入理解索引原理读操作更新操作SHARD不变性动态更新索引删除和更新实时索引更新持久化Segment合并近实时搜索&#xff0c;段数据刷新&#xff0c;数据可见性更新和事务日志更新索引并且将改动提交修改Searcher对象默认的更新时间Elasticsearch-深入理解…...

pdf压缩文件大小的方法是什么?word文件怎么批量转换成pdf格式?

大家在存储文件时&#xff0c;通常会遇到一些较大的文件&#xff0c;这时需要对其进行压缩处理。下面介绍一下如何压缩PDF文件大小以及批量转换Word文件为PDF格式。pdf压缩文件大小的方法是什么?1.打开小圆象PDF转换器&#xff0c;选择“PDF压缩”功能。2.在“PDF压缩”界面中…...

论文阅读——FECANet:应用特征增强的上下文感知小样本语义分割网络

代码&#xff1a;NUST-Machine-Intelligence-Laboratory/FECANET (github.com) 文章地址&#xff1a;地址 文章名称&#xff1a;FECANet: Boosting Few-Shot Semantic Segmentation with Feature-Enhanced Context-Aware Network 摘要 Few-shot semantic segmentation 是学习…...

数组模拟常见数据结构

我们来学习一下用数组模拟常见的数据结构&#xff1a;单链表&#xff0c;双链表&#xff0c;栈&#xff0c;队列。用数组模拟这些常见的数据结构&#xff0c;需要我们对这些数据结构有一定的了解哈。单链表请参考&#xff1a;http://t.csdn.cn/SUv8F 用数组模拟实现比STL要快&a…...

ADC0832的AD模数转换原理及编程

✅作者简介&#xff1a;嵌入式领域优质创作者&#xff0c;博客专家 ✨个人主页&#xff1a;咸鱼弟 &#x1f525;系列专栏&#xff1a;单片机设计专栏 &#x1f4c3;推荐一款求职面试、刷题神器&#x1f449;注册免费刷题 目录 一、描述 二、模数转换原理&#xff1a; 三、…...

【工具插件类教学】UnityPackageManager私人定制资源工具包

目录 一.UnityPackageManager的介绍 二.package包命名 三.包的布局 四.生成清单文件 五.制作package内功能 六.为您的软件包撰写文档 1.信息的结构 2.文档格式 七.提交上传云端仓库 1.生成程序集文件 2.上传至云端仓库 八.下载使用package包 1.获取包的云端路径 …...

【软件测试】2023年了还不会接口测试?老鸟总结接口测试面试谁还敢说我不会......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试面试&#xff0…...

类Vuex轻量级状态管理实现

引用自 摸鱼wiki 1. vuex vuex是一个前端广泛流行的状态管理库&#xff0c;主要由以下几大模块组成&#xff1a; state&#xff1a;状态存储getter&#xff1a;属性访问器mutation&#xff1a;可以理解为一个同步的原子性事务&#xff0c;修改state状态action&#xff1a;触发…...

Java 基本数据类型

Java基本数据类型是Java编程语言中最基本的数据类型&#xff0c;包括整型、浮点型、字符型、布尔型和空类型。本文将详细介绍Java基本数据类型的作用和在实际工作中的用途。 整型&#xff08;int、long、short、byte&#xff09; 整型是Java中最常见的基本数据类型&#xff0…...

全网资料最全Java数据结构与算法-----算法分析

算法分析 研究算法的最终目的就是如何花更少的时间&#xff0c;如何占用更少的内存去完成相同的需求&#xff0c;并且也通过案例演示了不同算法之间时间耗费和空间耗费上的差异&#xff0c;但我们并不能将时间占用和空间占用量化&#xff0c;因此&#xff0c;接下来我们要学习…...

【封装xib补充 Objective-C语言】

一、那么首先,咱们就从这个结果来分析 1.就不给大家一步一步分析了,直接分析我们这里怎么想的, 首先,我们看到这样的一个界面,我们想,这些应用数据是不是来源于一个plist文件吧, 所以说,我们首先要,第一步,要懒加载,把这个plist文件中的数据,加载起来, 那么,因…...

linux + jenkins + svn + maven + node 搭建及部署springboot多模块前后端服务

linux搭建jenkins 基础准备 linux配置jdk、maven&#xff0c;配置系统配置文件 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)-- 快速标记两个星号之后的字符

实例需求&#xff1a;工作表中的数据保存在A列~G列&#xff0c;现需要识别D列中包含超过两个星号的内容&#xff0c;并将第3个星号及其之后的字符设置为红色字体&#xff0c;如图所示。 示例代码如下。 Sub Demo1()Dim objRegExp As ObjectDim objMatch As ObjectDim strMatch…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...