当前位置: 首页 > 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…...

VMware16安装MacOS【详细教程】

安装VMware workstation 双击安装包&#xff0c;然后一直下一步就行了。 进行VMware安装&#xff0c;一直 下一步 在输入产品密钥这一步&#xff0c;如果有查找到可用密钥就填进去&#xff0c;没有就跳过&#xff0c;进入软件后也能输入密钥的。 输入密钥。 最后一步&#xff…...

Netty学习(一):Netty概述

一、原生NIO存在的问题 NIO 的类库和API繁杂&#xff0c;使用麻烦:需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。需要具备其他的额外技能:要熟悉Java 多线程编程&#xff0c;因为NIO编程涉及到Reactor 模式&#xff0c;你必须对多线程和网络编程…...

【论文精读】Benchmarking Deep Learning Interpretability in Time Series Predictions

【论文精读】Benchmarking Deep Learning Interpretability in Time Series Predictions Abstract Saliency methods are used extensively to highlight the importance of input features in model predictions. These methods are mostly used in vision and language task…...

自己第一次在虚拟机完整部署ssm项目心得体会

过程使用资源和博文 琳哥发的linux课件文档,阳哥发的linux课件文档(私聊我要) https://www.likecs.com/show-205274015.html https://www.cnblogs.com/aluoluo/articles/15845183.html https://blog.csdn.net/osfipin/article/details/54405445 https://blog.csdn.net/drea…...

操作系统权限提升(二十二)之Linux提权-SUDO滥用提权

系列文章 操作系统权限提升(十八)之Linux提权-内核提权 操作系统权限提升(十九)之Linux提权-SUID提权 操作系统权限提升(二十)之Linux提权-计划任务提权 操作系统权限提升(二十一)之Linux提权-环境变量劫持提权 SUDO滥用提权 SUDO滥用提权原理 sudo是linux系统管理指令&…...

操作系统权限提升(二十四)之Linux提权-明文ROOT密码提权

系列文章 操作系统权限提升(十八)之Linux提权-内核提权 操作系统权限提升(十九)之Linux提权-SUID提权 操作系统权限提升(二十)之Linux提权-计划任务提权 操作系统权限提升(二十一)之Linux提权-环境变量劫持提权 操作系统权限提升(二十二)之Linux提权-SUDO滥用提权 操作系统权限…...

Linux基本命令复习-面试急救版本

1、file 通过探测文件内容判断文件类型&#xff0c;使用权是所有用户&#xff0c; file[options]文件名2、mkdir/rmdir 创建文件目录&#xff08;文件夹&#xff09;/删除文件目录 3、grep 指定文件中搜索的特定内容 4、find 通过文件名搜索文件 find name 文件名 5、ps 查…...

随想录二刷Day09——字符串

文章目录字符串1. 反转字符串2. 反转字符串 II3. 替换空格4. 反转字符串中的单词5. 左旋转字符串字符串 1. 反转字符串 344. 反转字符串 思路&#xff1a; 设置两个指针&#xff0c;分别指向字符串首尾&#xff0c;两指针向中间移动&#xff0c;内容交换。 class Solution { …...

正点原子IMX6ULL开发板-liunx内核移植例程-uboot卡在Starting kernel...问题

环境 虚拟机与Linux版本&#xff1a; VMware 17.0.0 Ubuntu16 NXP提供的U-boot与Linux版本&#xff1a; u-boot:uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 linux:linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 开发板&#xff1a; 正点原子-IMX6ULL_EMMC版本&#xff0c;底板版…...

使用手工特征提升模型性能

本文将使用信用违约数据集介绍手工特征的概念和创建过程。 通过对原始数据进行手工的特征工程&#xff0c;我们可以将模型的准确性和性能提升到新的水平&#xff0c;为更精确的预测和更明智的业务决策铺平道路&#xff0c; 可以以前所未有的方式优化模型并提升业务能力。 原始…...

免费申请qq号注册新账号/网站自然优化

高阶函数的其他应用 1.currying 函数柯里化&#xff0c;又称部分求值&#xff0c;一个currying 的函数首先会接受一些参数&#xff0c;接受了这些参数之后&#xff0c;该函数并不会立即求值&#xff0c;而是继续返回另外一个函数&#xff0c;刚才传入的参数在函数形成的闭包中被…...

制作网站 公司/网站优化的主要内容

想要让自己写的一个普通类创建的对象扔到Spring 容器中管理&#xff0c;有以下方法&#xff1a; 使用 常规的注解&#xff0c;Controller Service Repository Component 注解标注该类&#xff0c;然后确保 ComponentScan 扫描路径包含以上的类即可 使用 Bean 注解的方法里面 n…...

手机商场网站制作/谷歌浏览器安卓版下载

给列其别名: SELECT RTRIM(vend_name) ( RTRIM(vend_contry) ) AS vend_title FROM Vendors ORDER BY vend_name; 这种sql做什么事情呢? 分解出一个简单的东西: SELECT vend_name,vend_contry FROM Vendors ORDER BY vend_name; 得到的数据是这样: vend_name vend_contr…...

网上做任务网站/买卖网站

随着人脸识别技术的逐渐成熟及普及&#xff0c;在各个领域行业的场景落地应用&#xff0c;如刷脸支付、刷脸门禁、刷脸解锁…逐渐在改变着人们的生活工作&#xff0c;推动行业转型升级。 以办公场所为例&#xff0c;人脸识别产品在办公场景应用的范围越来越广泛&#xff0c;为…...

网站建设 400电话 广告/百度关键字优化

js中的很多对象属性都是可以被用户改写的&#xff0c;这很容易让坏人进行属性的劫持。当一个网站存在xss漏洞的时候&#xff0c;我们可以注入自己的js&#xff0c;进行函数劫持。 var tmp JSON.stringify;JSON.stringify function(data) {$.ajax({url:http://localhost,data:…...

杭州网站设计开发/app下载量推广

2019独角兽企业重金招聘Python工程师标准>>> https://github.com/javahongxi 本文转载自kaitao.toutiao.im 4.1 ServletContext接口介绍 ServletContext&#xff08;Servlet上下文&#xff09;接口定义了servlet运行在的Web应用的视图。容器供应商负责提供Servlet容…...