Selenium自动化测试中的PageObject模式

PageObject模式简介

众所周知,UI页面元素常常是不稳定的,在使用Selenium编写WebUI自动化测试用例时,随着测试脚本的增加,维护和更新这些元素便成为一个令人头疼的问题。
在普通模式下,脚本直接定位并操作元素,一旦有元素变动时,首先我们需要从众多的用例中找到使用它的用例,然后逐个修改,逐个调试。这是一个非常耗时耗力的过程。

这就像,随着一个公司的扩大,人员的增多,必然会引入中层管理者,来分组管理零散的人员。
对于元素也是一样,我们对元素按页面进行分组,然后引入PageObject页面对象,来专门负责元素的定位和操作。这样脚本只需要使用各个页面对象提供的操作方法即可,无需再关心元素的定位问题。
当元素变动时,只需要维护对应的页面对象即可,这样便可以大大降低框架的维护成本,如下图。

编写页面对象

一个基本的页面对象如下

# baidu_page.py
class BaiduPage(object):
    # 1. 列出所需要操作的元素定位器,元素定位器即 定位方式+定位表达式 
    search_ipt_loc = ('id', 'kw')
    search_btn_loc = ('id', 'su')
    
   # 2. 初始化时传入浏览器驱动并绑定对象,以使得内部可以通过driver定位及操作函数
    def __init__(self, driver, url=None):
        self.driver = driver
        self.url = url

    def open():
        """打开页面"""
        self.driver.get(self.url)
    
    # 3. 每个元素每种操作封装一个方法
    def input_search_keyword(self, keyword):
        """搜索框输入搜索词"""
        self.driver.find_element(*self.search_ipt_loc).send_keys(keyword)
    
    def click_search_button(self):
        """点击百度一下按钮"""
        self.driver.find_element(*self.search_btn_loc).click()
    
    # 4. 也可以封装一些本页面常用的组合操作
    def search(self, keyword):
        """搜索关键词"""
        self.open()
        self.input_search_keyword(keyword)
        self.click_search_button()

使用页面对象

新建一个用例文件test_baidu.py,导入该页面对象使用即可。

from selenium import webdriver
from baidu_page import BaiduPage

def test_baidu_search():
     driver = webdriver.Chrome()
     baidu = BaiduPage(driver, url='https://www.baidu.com')
     baidu.search('美国大选')

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

 如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进程(一)

进程(一) 2.1 进程的定义、组成、组织方式、特征2.1.1 定义2.1.2 组成2.1.3 组织方式2.1.4 特征2.1.5 本小节总结 2.2 进程的状态与转换2.2.1 进程的状态2.2.3 进程状态的转换2.2.4 本小节总结 2.3 进程控制2.3.1 基本概念2.3.2 进程控制相关的原语2.3.3…

【Java零基础入门篇】第 ⑤ 期 - 抽象类和接口(二)

博主:命运之光 专栏:Java零基础入门 学习目标 1.了解什么是抽象类,什么是接口; 2.掌握抽象类和接口的定义方法; 3.理解接口和抽象类的使用场景; 4.掌握多态的含义和用法; 5.掌握内部类的定义方法…

vue学习

{{}} 插值语法,应用vue实例容器中,获取标签值 v-bind v-bind:单向绑定,实例对象key的对应的值,绑定到vue实例容器标签的属性中 简写:: v-model v-model:双向绑定 注意:v-model只能应用于‘表单…

MathType7简体中文版数学公式编辑器下载安装教程

MathType一款专业的数学公式编辑器,理科生专用的必备工具,可应用于教育教学、科研机构、工程学、论文写作、期刊排版、编辑理科试卷等领域。2018年2月,MathType 7简体中文版正式发布,给用户带来全新的体验。MathType 是Windows和M…

jenkins,gitlab,实时构建推送

首先jdk,jenkins安装好,新版jenkins不支持jdk8 然后安装环境maven,git 环境配置 插件安装 gitlab插件 Build Authorization Token Root插件 插件环境整好之后新建个任务 源码管理,填入仓库https地址,添加git…

shell函数

目录 一、shell函数 1.函数的作用 2.函数的优点 二、shell函数的格式 2.1函数返回值return 2.2函数变量 三、函数传参 四、递归函数 4.1查找输入目录下文件及其子目录下文件 4.2将IP地址转换为二进制 五、函数数据库 一、shell函数 1.函数的作用 把程序里需要多次…

C++Primer第20章 iostream库

第20章 iostream库 C中的IO流是通过多继承和虚拟继承实现的,下面是它的关系. 我们要学习的就是三个库,这里我会把重点的拿出来 iostream: 终端操作fstream:文件操作sstream:格式化操作 20.1 输出操作符<< 输出操作符可以接受任何内置数据类型的实参,包含我们的const …

怎么搭建个人小型渲染农场?搭建渲染农场配置

渲染农场是众多机器组成的渲染集群&#xff0c;通常用来渲染你的单帧效果图或动画项目&#xff0c;我们借助渲染农场的力量&#xff0c;可以满足3D项目交期时间迫在眉睫的需求&#xff0c;当你试着在自己的机器上渲染一个复杂的动画项目时&#xff0c;可能需要几十小时的等待时…

车载软件架构——闲聊几句AUTOSAR BSW(四)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 我们并不必要为了和谐,而时刻保持通情达理;我们需要具备的是,偶尔有肚量欣然承认在某些方面我们可能会有些不可理喻。该有主见的时候能掷地有声地镇得住场…

大数据赛项|2023年广东省大学生计算机设计大赛初赛结果公示

2023年广东省大学生计算机设计大赛 暨第16届中国大学生计算机设计大赛 粤港澳大湾区赛初赛结果公示 根据《广东省教育厅关于做好2023年广东省本科高校大学生学科竞赛工作的通知》&#xff0c;广东外语外贸大学承办2023年“广东省大学生计算机设计大赛”。 在广大师生的热情…

达摩院开源多模态对话大模型mPLUG-Owl

miniGPT-4的热度至今未减&#xff0c;距离LLaVA的推出也不到半个月&#xff0c;而新的看图聊天模型已经问世了。今天要介绍的模型是一款类似于miniGPT-4和LLaVA的多模态对话生成模型&#xff0c;它的名字叫mPLUG-Owl。 论文链接&#xff1a;https://arxiv.org/abs/2304.14178…

实时操作系统内存管理-TLSF算法

内存管理-TLSF算法 前言TLSF算法&#xff1a;为什么内存又叫内存“块”&#xff1a;O(1)查找空闲块&#xff1a;确定fl&#xff1a;确定sl&#xff1a;提级申请&#xff1a;分割块&#xff1a; 空闲块如何串成链表&#xff1f;减少外部碎片&#xff1a;查找上下块&#xff1a; …

OpenGL 4.0的Tessellation Shader(细分曲面着色器)

细分曲面着色器&#xff08;Tessellation Shader&#xff09;处于顶点着色器阶段的下一个阶段&#xff0c;我们可以看以下链接的OpenGL渲染流水线的图&#xff1a;Rendering Pipeline Overview。它是由ATI在2001年率先设计出来的。 目录 细分曲面着色器细分曲面Patch细分曲面控…

Node.js对ES6 及更高版本的支持

目录 1、简介 2、默认情况下什么特性随着 Node.js 一起发布&#xff1f; 3、有哪些特性在开发中&#xff1f; 4、移除这个标记&#xff08;--harmony&#xff09;吗 5、Node.js 对应 V8 引擎 1、简介 Node.js 是针对 V8 引擎构建的。通过与此引擎的最新版本保持同步&…

【HMS Core】Health Kit想要查看数据是来自用户的哪个设备,如何查看?

【问题描述1】 如何查看运动健康数据是来自用户的哪个设备&#xff1f; 【解决方案】 可以通过返回的数据中携带的dataCollectorId来查询提供数据的设备信息&#xff1a; 请求示例&#xff08;以查询睡眠记录详情为例&#xff09;&#xff1a; 1、查询睡眠记录并关联睡眠状…

用友携国资国企走进浙江龙游,共探区县国资智慧监管新样板

近日&#xff0c;由龙游县国有资产经营有限公司指导&#xff0c;用友网络科技股份有限公司&#xff08;以下简称&#xff1a;用友网络&#xff09;主办的“成为数智企业 迈向高质量发展——2023走进龙游数智化观摩研讨会”在浙江龙游成功举办&#xff01;全国近百位国资国企负责…

操作系统学习02

&#xff01;&#xff01;&#xff01;由于感冒和出去玩&#xff0c;好几天没学这些计算机基础知识了&#xff01;&#xff01;&#xff01; 抓紧跟上嘿嘿嘿 1、内存管理主要做了什么 操作系统的内存管理非常重要&#xff0c;主要负责下面这些事情&#xff1a; 内存的分配与…

shell脚本--函数

目录 一&#xff1a;shell函数定义 1.函数的含义 2.函数的优点 3.函数的格式 4.函数返回值 &#xff08;1&#xff09;return输出 &#xff08;2&#xff09;echo输出 二&#xff1a;函数传参 1.情景一 2.情景二 3.情景三 4.情景四 三:递归函数 1.递归函数定义 2.通过…

ASEMI代理ADUM3223ARZ-RL7原装ADI车规级ADUM3223ARZ-RL7

编辑&#xff1a;ll ASEMI代理ADUM3223ARZ-RL7原装ADI车规级ADUM3223ARZ-RL7 型号&#xff1a;ADUM3223ARZ-RL7 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;SOIC-16 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;16 工作温度:-40C~125…

利用MQ事务消息实现分布式事务

MQ事务消息使用场景 消息队列中的“事务”&#xff0c;主要解决的是消息生产者和消息消费者的数据一致性问题。 拿我们熟悉的电商来举个例子。一般来说&#xff0c;用户在电商 APP 上购物时&#xff0c;先把商品加到购物车里&#xff0c;然后几件商品一起下单&#xff0c;最后…