这可能是最简单的Page Object库

news2024/9/24 15:26:54

做过web自动化测试的同学,对Page object设计模式应该不陌生。

Page object库应该根据以下目标开发:

  • Page object应该易于使用

  • 清晰的结构

    • PageObjects 对于页面对象

    • PageModules对于页面内容

  • 只写测试,而不是基础。

  • 在可能的情况下防止样板代码。

  • 不需要自己管理浏览器。

  • 在运行时选择浏览器,而不是在类级别。

  • 不需要直接接触selenium。

这只是一种设计模式,只要遵循它有思想,不借助第三方库,我们一样可以实现这种设计模式。

创建baidu_page.py 文件,实现page层封装。


class BasePage:
    """
   基础Page
   """
   def __init__(self, driver):
        self.driver = driver

    def 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
   """

   @property
   def search_box(self):
        return self.id_("kw")

    @property
   def search_button(self):
        return self.xpath("//*[@id='su']")

我们本质上要将元素的定位和元素的操作分开,page层用来定义元素的定位。

接下来创建,test_baidu.py文件,用来实现自动化测试。

from selenium import webdriver
from baidu_page import BaiduPage

dr = 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, PageElement

class BaiduPage(PageObject):
    search_box = PageElement(css='#kw')
    search_button = PageElement(id_='su')

是的,就这么简单,专注于元素的定位的编写,几乎没有多月的东西。而且还可以添加超时时间哦!

from page_objects import PageObject, PageElement

class BaiduPage(PageObject):
    search_box = PageElement(css='#kw', time_out=2)
    search_button = PageElement(id_='su', time_out=10)

这样再也不用写恶心的显式等待了,是不是很爽!?

定位一组元素也是非常简单的说。

from page_objects import PageElements

class 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/696703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI 充电】KServe + Fluid 加速大模型推理

作者:黄驰琳、露营、车漾 背景 KServe 是 Kubernetes 上的标准模型推理平台,专为高度可扩展的场景而构建,支持现代 Serverless 推理工作负载,用于在任意框架上提供机器学习(ML)模型服务。它提供高性能、高…

菜鸡shader:L5 fresnel、matcap和cubemap

文章目录 Fresnelshader forge实现UE4蓝图实现 Matcapshader forge实现UE4蓝图实现 CubeMapSD和PS制作所需的贴图shader forge实现unity代码实现UE4蓝图实现(未实现) Fresnel shader forge实现 个人理解是,使用观察方向和法向方向点乘,那就相当于我们的视…

adb-命令大全

目录 一、ADB简介 二、为什么要用ADB 三、ADB架构和原理 四、ADB日志状态 五、ADB常用命令 🎁更多干货 完整版文档下载方式: 一、ADB简介 ADB全称Android Debug Bridge,起到调试桥的作用,是一个客户端-服务端程序。其中客…

C++数据结构X篇_06_C++单向循环链表实现

本篇参考C单向循环链表实现整理,先搞懂结构框架,后期根据视频利用c对内容实现,也可以对c有更高的提升。 文章目录 1. 链表定义2. 链表插入3. 链表打印(注意打印过程是跳过头节点head的)4. 实验 单向循环链表与单向链表十分相似,具…

ST - NUCLEO-H723ZG ITM不生效的问题

文章目录 ST - NUCLEO-H723ZG ITM不生效的问题概述CubeMX配置点END ST - NUCLEO-H723ZG ITM不生效的问题 概述 在用NUCLEO-H723ZG官方板子做实验, 想用ITM打印一些调试信息出来. 不好使啊. 后来查问题, 发现 NUCLEO-H723ZG上的HSE, LSE的晶振无效, 等于是不能用外部的HSE, LS…

如何找到更多音视频开发学习资料和资源?

如果你对学习音视频开发感兴趣,以下是一些建议,可以帮助你获取更多相关的资料和资源: 在线学习平台:参考一些知名的在线学习平台,如Coursera、Udemy、edX等,搜索他们的课程目录,看是否有与音视频…

【SWAT水文模型】SWAT水文模型建立及应用第六期:SWAT模型率定(SWAT CUP)

SWAT模型率定(SWAT CUP) 1 准备工作2 水文模型率定(SWAT CUP)数据准备运行流程 参考 SWAT CUP的下载及安装参见另一博客-【SWAT水文模型】SWAT-CUP安装及使用 下面将具体介绍基于实测水文站数据进行水文模型的率定。 1 准备工作…

【Centos系统故障】虚拟机断电后centos7无法正常启动 XFS(sda3)

1. 背景: 虚拟机断电后centos7无法正常启动 XFS(sda3),通常都是断电以及非法关机,杀掉虚拟机等突然中断系统的情况,会导致内存数据损坏,从而导致linux操作系统无法启动。 2. 解决办法: 清理掉内存数据&a…

windows10 安装wsl2+docker+php+nginx+mysql

第一步在windows10 上安装docker(可视化桌面) 第二步确定本地电脑开启虚拟化,同时确认下方图内容已经勾选 在cmd下使用命令:wsl --install 安装wsl2。因 wsl2 默认安装ubuntu系统。如果安装wsl2后没有安装ubuntu系统,则需要去谷歌商店里搜索…

AutoJs案例---登录界面

"ui";showLoginUI(); ui.statusBarColor("#000000") //顶部颜色为黑色//显示登录界面 function showLoginUI(){ui.layout(<frame><vertical h"auto" align"center" margin"0 50"><linear><text w"…

Nextcloud实现协同办公 -V2

V1在这里&#xff1a;https://blog.csdn.net/philosophyatmath/article/details/130594037。V2没有继续使用onlyoffice而是使用nextcloud office Nextcloud 安装 LAMP&#xff08;LinuxApacheMySQLPHP&#xff09;方式。局域网单机模式。 安装环境&#xff1a; OS:ubuntu 2…

【Redis】Redis配置以及常用命令

文章目录 一、关系型数据库 与 非关系型数据库1. 关系型数据库的概念2. 非关系型数据库的概念3. 关系型数据库和非关系型数据库区别3.1 数据存储方式不同3.2 扩展方式不同3.3 对事务性的支持不同 4. 非关系型数据库产生背景5. 总结5.1 两组区别5.2 创建实例过程 二、Redis 的概…

【玩转Linux操作】详细讲解Shell的判断,循环语句

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;判断语句⭐单层if&#x1f388;示例 ⭐…

什么是动态住宅代理?

随着网络的迅速发展&#xff0c;许多人对代理IP已经有了比较深刻的认识&#xff0c;并且广泛地运用到了各自的业务中&#xff0c;尤其在跨境的相关业务中表现尤其卓越。对于代理IP的类别&#xff0c;也需要根据自己的业务类型具体选择最合适的&#xff0c;那么今天就给大家具体…

Redis之哨兵模式以及RedisTemplate的使用

Redis之哨兵模式 一 哨兵模式原理 说明&#xff1a; Sentinel具有三个作用&#xff1a;监控&#xff0c;故障转移和通知Sentinel如何判断Redis是否健康 ① 每隔1秒发送一次ping命令&#xff0c;如果超过一定时间没有响应则认为主观下线 ② 如果超过一半以上的sentinel认为实…

【软考网络管理员】2023年软考网管初级常见知识考点(25)- 网络地址转换NAT

涉及知识点 什么是NAT技术&#xff1f;静态网络地址转换&#xff0c;动态网络地址转换&#xff0c;基于端口的网络地址转换,NAPT的配置命令和动态NAT配置命令&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于…

Axure教程—下拉刷新

本文从元件的实现、交互的实现两个角度&#xff0c;拆解了APP顶部下拉刷新动效制作&#xff0c;并展示了相应的预览效果。 预览效果 预览地址&#xff1a;https://o95k8e.axshare.com 具体的实现方法 一、元件制作 拖入一个矩形元件&#xff0c;设置大小为375552&#xff0c…

Day41

思维导图 类和结构体的区别 1、结构体是一种值类型&#xff0c;类是引用类型。值类型用于存储数据的值&#xff0c;引用类型用于存储对实际数据的引用。即结构体就是当成值来使用的&#xff0c;类则通过引用来对实际数据操作。 2、结构使用栈存储&#xff08;Stack Allocation&…

最小化安装的Red Hat 9安装完Zabbix后没有中文字体报错解决

Redhat9最小化安装后&#xff0c;将 Zabbix 的界面设置为中文&#xff0c;但是系统提示你服务器上没有安装相应的语言包。这是因为 Zabbix 需要在服务器上安装相应的语言环境才能正常显示相应的语言。 报错提示&#xff1a; You are not able to choose some of the languages,…

MySQLSQL性能调优

1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描&#xff0c; Sql 代码 : select id from t wh…