这可能是最简单的Page Object库
做过web自动化测试的同学,对Page object设计模式应该不陌生。

Page object库应该根据以下目标开发:
Page object应该易于使用
清晰的结构
PageObjects 对于页面对象
PageModules对于页面内容
只写测试,而不是基础。
在可能的情况下防止样板代码。
不需要自己管理浏览器。
在运行时选择浏览器,而不是在类级别。
不需要直接接触selenium。
这只是一种设计模式,只要遵循它有思想,不借助第三方库,我们一样可以实现这种设计模式。
创建baidu_page.py 文件,实现page层封装。
class BasePage:"""基础Page"""def __init__(self, driver):self.driver = driverdef get(self, url):self.driver.get(url)def id_(self, id_):return self.driver.find_element_by_id(id_)def xpath(self, xpath):return self.driver.find_element_by_xpath(xpath)class BaiduPage(BasePage):"""百度首页Page"""@propertydef search_box(self):return self.id_("kw")@propertydef search_button(self):return self.xpath("//*[@id='su']")
我们本质上要将元素的定位和元素的操作分开,page层用来定义元素的定位。
接下来创建,test_baidu.py文件,用来实现自动化测试。
from selenium import webdriver
from baidu_page import BaiduPagedr = webdriver.Chrome()
page = BaiduPage(dr)
page.get("https://www.baidu.com")
page.search_box.send_keys("page object")
page.search_button.click()dr.close()
这里你将看不到元素的定位,分层的好处就是,当元素的定位发生改变时,只需要维护好page层即可,对于测试用例来说不需要关心元素怎么定位,只要专心设计好用例即可。
可是,Page层的编写并不太简便,本质上它的作用只是定义一些元素的定位。那我告诉你,只需要4行代码也可以实现上面baidu_page.py的功能,你会不会太简单了?
from page_objects import PageObject, PageElementclass BaiduPage(PageObject):search_box = PageElement(css='#kw')search_button = PageElement(id_='su')
是的,就这么简单,专注于元素的定位的编写,几乎没有多月的东西。而且还可以添加超时时间哦!
from page_objects import PageObject, PageElementclass BaiduPage(PageObject):search_box = PageElement(css='#kw', time_out=2)search_button = PageElement(id_='su', time_out=10)
这样再也不用写恶心的显式等待了,是不是很爽!?
定位一组元素也是非常简单的说。
from page_objects import PageElementsclass BaiduPage(PageObject):……# 百度搜索结果search_result = PageElements(xpath="//div/h3/a")
啥? 项目地址? 别急!别急!
GitHub地址:
GitHub - SeldomQA/poium: Page Objects design pattern test library, support selenium、appium、playwright, etc
原项目已经不再维护,我阅读了原项目代码,虽然只有100多行,但设计非常精妙。可惜缺少元素的等待,这将有助于定位元素的稳定性,所以,在原有项目的基础上增加的该功能。
下载安装:
$ python setup.py install
通过pip命令安装:
$ pip install -i https://testpypi.python.org/pypi selenium-page-objects
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:


相关文章:
这可能是最简单的Page Object库
做过web自动化测试的同学,对Page object设计模式应该不陌生。 Page object库应该根据以下目标开发: Page object应该易于使用 清晰的结构 PageObjects 对于页面对象 PageModules对于页面内容 只写测试,而不是基础。 在可能的情况下防止…...
论文阅读——BERT
ArXiv:https://arxiv.org/abs/1810.04805 github:GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT 一、模型及特点: 1、模型: 深层双向transformer encoder结构 BERT-BASE:(L12, H…...
竞赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满…...
Springboot创建多数据源
yml文件 spring:datasource:dynamic:# 设置默认的数据源或者数据源组,默认值即为 masterprimary: masterdatasource:# 主库数据源master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?useUnicodetrue&characterEncodingutf8…...
【Hello Algorithm】滑动窗口内最大值最小值
滑动窗口介绍 滑动窗口是一种我们想象中的数据结构 它是用来解决算法问题的 我们可以想象出一个数组 然后再在这个数组的起始位置想象出两个指针 L 和 R 我们对于这两个指针做出以下规定 L 和 R指针只能往右移动L指针不能走到R指针的右边我们只能看到L指针和R指针中间的数字 …...
HTML,CSS实现鼠标划过头像,头像突出变大(附源码)
话不多说,先上代码 先看原图: 再看 鼠标放上去后的图: 是不是明显感觉到 人物头像突出了一些,而且还增加了阴影部分的效果呢? 直接上代码!!! <!--由于我的 img 标签放的是循环后…...
“爱知道”,你知道吗?
拥抱时代浪潮,加速科技变革。数字经济时代,杭州重点贯彻市委市政府数字经济创新提质“一号发展工程”,加快发展数字经济,推动全市数字经济往高攀升、向新进军、以融提效。基于政府对数字经济新活力的赋能、优化数字社会环节、构建…...
基于SpringBoot+Vue的服装销售系统
基于SpringBootVue的服装销售平台的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 我的订单 登录界面 管理员界面 摘要 基于SpringBoot和Vue的服装销售系统…...
针对多分类问题,使用深度学习--Keras进行微调提升性能
前面的文章对二分类问题用Keras进行了Fine-tune,使得模型的准确率进一步提升,此处对于多分类问题,尝试使用Fine-tune来提升性能。 1. 准备数据集 为了演示,本次选用了博文keras系列︱图像多分类训练与利用bottleneck features进行微调(三)中提到的数据集,原始的数据集…...
一、【Photoshop如何根据不同类型图像抠图】
文章目录 前言图形结构1、规则图形2、不规则图形 图形颜色1、轮廓清晰2、颜色分明 前言 当我们有抠图需求的时候,不要一开始就想着我怎么去把它抠出来,首先应该分析图形的特点,然后再去选取合适的工具,这样才可以做到事半功倍&am…...
rust - 理解borrow trait
简介 borrow trait 是处理借用(即其它语言中的引用)的 trait,变量的所有权不会转移.泛型定义如下: pub trait Borrow<Borrowed: ?Sized> {/// Immutably borrows from an owned value.fn borrow(&self) -> &Borrowed; }其中包含一个 borrow(&self)的方…...
review-java-basis
Path环境变量用于记住程序路径,方便在命令行窗口的任意目录启动程序 \n代表换行的意思,/t代表一个tab前进一格 强转可能导致数据的丢失(溢出) 浮点型转换为整型,直接丢掉小数部分,保留整数部分返回 数据类…...
Go 语言访问 Redis 笔记
文章目录 Mac 下载 RedisMac Redix 数据库打开服务端客户端 导包连接数据库操作字符串操作 Hash设置过期时间队列操作连接池并发操作管道化操作事务操作 Mac 下载 Redis Mac安装Redis,原来就是这么简单 Mac Redix 数据库打开 brew services start redis 服务端 …...
【MySQL数据库重点】第二节:MySQL基础知识(基本操作)
目录 一:数据库的操作 1.显示数据库 2.创建数据库 3.使用数据库 4.删除数据库 二:常用数据类型 1.数值类型:整型和浮点型 2.字符串类型 3.日期类型 三:表的操作 1.查看表结构 2.创建表 3.删除表 一:数据库…...
计算机网络--第一次作业
1、比较电路交换、报文交换和分组报文交换优缺点 电路交换 电路交换是以电路连接为目的的交换方式,通信之前要在通信双方之间建立一条被双方独占的物理通道(由通信双方之间的交换设备和链路逐段连接而成)。 优点: ①由于通信线路为…...
网络协议--TCP的成块数据流
20.1 引言 在第15章我们看到TFTP使用了停止等待协议。数据发送方在发送下一个数据块之前需要等待接收对已发送数据的确认。本章我们将介绍TCP所使用的被称为滑动窗口协议的另一种形式的流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必…...
鼎鑫鸿鄴引入“能源互联网+”理念 打造共赢
近年来,随着全球能源消耗的不断增长和环境问题的日益突出,清洁能源转型成为全球共同关注的话题。中国作为全球最大的能源消费国,也在积极推动能源结构的优化和清洁能源的发展。鼎鑫鸿鄴新能源科技有限公司在推动清洁能源转型方面制定了一系列…...
Qt下实现支持多线程的单例模式
Qt下实现支持多线程的单例模式 Chapter1 Qt下实现支持多线程的单例模式($$$)1. 代码介绍2. 代码之路3. 详细分析3.1 什么是单例3.2 如何让类无法实例化3.3 如何调用这个唯一实例3.4 如何支持多线程3.5 如何解决内存泄漏 4. 结束语 Chapter2 Qt 全局单例类Chapter3 Qt实用技巧&a…...
基于Java的宠物商店管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...
ArcGIS中批量mxd高版本转低版本
我们经常在给别人发ArcGIS的工程文件mxd,结果到别人那发现mxd工程文件打不开,原因是我们的arcgis版本高于别人,此时工程文件又很多,一个个转存成低版本又嫌麻烦,于是我们做了个批量mxd高版本转低版本的小工具ÿ…...
TCC-G15散热控制实战指南:释放Dell游戏本性能潜力
TCC-G15散热控制实战指南:释放Dell游戏本性能潜力 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 一、问题发现:游戏本散热困境的技术根…...
GraspNet环境配置与编译问题实战指南
1. GraspNet环境配置避坑指南 第一次接触GraspNet这个3D抓取检测框架时,我花了整整三天时间才把环境配好。现在回想起来,大部分时间都浪费在了一些完全可以避免的问题上。今天我就把这些经验总结出来,帮你少走弯路。 GraspNet对CUDA和cuDNN的…...
Instructions终极指南:5个简单步骤创建你的第一个iOS引导标记
Instructions终极指南:5个简单步骤创建你的第一个iOS引导标记 【免费下载链接】Instructions Create walkthroughs and guided tours (coach marks) in a simple way, with Swift. 项目地址: https://gitcode.com/gh_mirrors/in/Instructions Instructions是…...
RetinaFace在SpringBoot微服务中的集成方案
RetinaFace在SpringBoot微服务中的集成方案 1. 微服务架构下的人脸检测需求 在现代企业应用中,人脸检测功能已经成为许多业务场景的核心需求。从用户身份验证到智能相册管理,从安防监控到互动娱乐,快速准确的人脸检测能力能为产品带来显著价…...
如何判断seo 报价是否合适
如何判断SEO报价是否合适 在当前数字化营销的环境中,SEO(搜索引擎优化)已经成为企业提升在线可见性和吸引潜在客户的关键策略。SEO服务的报价各异,不少企业在选择服务时往往会纠结于如何判断一个SEO报价是否合适。本文将从多个角…...
3MF插件全解析:Blender如何成为3D打印的得力助手?
3MF插件全解析:Blender如何成为3D打印的得力助手? 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 还在为Blender中无法处理3MF文件而烦恼吗&#…...
OpenClaw命令行增强:gemma-3-12b-it解释复杂指令并自动补全
OpenClaw命令行增强:gemma-3-12b-it解释复杂指令并自动补全 1. 为什么需要命令行增强工具 作为一个常年与终端打交道的开发者,我经常遇到这样的困境:记得某个命令的功能,却想不起具体参数;或者面对复杂的管道操作时&…...
PyTorch 2.8镜像智能助手:科研人员用预装Jupyter+Pandas快速分析训练指标
PyTorch 2.8镜像智能助手:科研人员用预装JupyterPandas快速分析训练指标 1. 为什么科研人员需要这个镜像 深度学习研究中最耗时的往往不是算法设计,而是环境配置和数据准备。传统开发流程中,研究人员需要花费大量时间在: 安装C…...
别再被网站当机器人了!手把手教你编译一个‘隐身版’Chromedriver(绕过Selenium检测)
从源码到隐身:深度定制Chromedriver绕过检测的工程实践 当你的Selenium脚本突然被目标网站拦截,熟悉的"Access Denied"页面赫然出现时,那种挫败感每个爬虫开发者都深有体会。网站的反爬系统越来越智能,常规的UserAgent轮…...
OpenClaw定时任务:千问3.5-9B每日早报自动推送
OpenClaw定时任务:千问3.5-9B每日早报自动推送 1. 为什么需要自动化早报推送 每天早上打开电脑第一件事,就是手动收集行业新闻、技术动态和日程提醒,再整理成早报发到团队群。这种重复劳动持续三个月后,我开始思考:能…...
