五分钟搞懂 POM 设计模式

今天,我们来聊聊 Web UI 自动化测试中的 POM 设计模式。

为什么要用 POM 设计模式

前期,我们学会了使用 Python+Selenium 编写 Web UI 自动化测试线性脚本

线性脚本(以快递 100 网站登录举栗):

PYTHON

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get("https://sso.kuaidi100.com/sso/v2/authorize.do")
driver.maximize_window()
driver.find_element(By.ID, 'name').send_keys("***********")
driver.find_element(By.ID, 'password').send_keys("***********")
driver.find_element(By.ID, 'submit').click()
time.sleep(2)
text = driver.find_element(By.PARTIAL_LINK_TEXT, '首页').text
assert text == '首页'
driver.close()

使用以上代码,最基础最简单的 Web UI 自动化测试就做起来了,但是,问题也随之而来,线性脚本的缺点也暴露出来了:

  • Web UI 自动化测试,简单来说,就是模拟人在浏览器上的操作,打开浏览器 - 定位元素 - 操作元素 - 模拟页面动作 - 断言结果
  • 由于线性脚本中的元素定位元素操作细节测试数据结果验证(断言)是捆绑在一起的,代码会显得非常冗余、可读性差、不可复用、工作量大且可维护性差
  • 刚开始,少数的测试用例维护起来可能很容易,但随着时间迁移、产品迭代、测试套件持续增长,脚本也越来越臃肿,可能需要维护几十个页面,且很多页面是公用的,元素的任何改变都会让我们的脚本变得繁琐复杂、耗时易出错。例如:十几个用例中都用到了 A 元素,某一天 A 元素被前端改成了 B 元素,我们就需要去十几个用到 A 元素的地方,将 A 元素修改为 B 元素
  • 如果可以把公共元素抽取出来,即使元素被前端修改,我们也只需更新元素的定位方式,而不用修改每条测试用例,无论多少用例用到该元素,都只需修改元素定位方式,重新获取元素即可
  • 所以我们引入了 PageObject 这种解决方案,它可以帮我们解决设计上的问题,可以将 testcase 和 page 分层,形成一个非常好的结果
什么是 POM 设计模式
  • POM:Page Object Model,页面对象模型的简称

  • 2013 年,由 Martin Fowler提出了Page Object的观点

  • 作者的观点是一种封装思想,旨在为每个待测页面创建一个页面对象,从而将繁琐的定位操作、操作细节封装到这个页面对象中,对外只提供必要的操作接口,在调用的时候只调用提供的接口,不用去调用操作细节,最终实现程序的高内聚低耦合,使程序模块的可重用性、移植性大大增强

  • 在这种模式下,对于应用程序中的每个页面都应该有相应单独的页面类(例如:login_page、userinfo_page),类中应该包含此页面上的元素对象操作这些元素对象所需要的方法

  • 再将流程所关联的页面作为对象,将对象串联起来形成不同的业务流程,例如:在登录页面完成登录操作后跳转到用户中心页面进行个人信息的修改

Selenium 官方对 PageObject 的引入

历史简介

  • 2015 年,Selenium 官方对 PageObject 进行引入:

  • 2020 年,Selenium 更新文档地址:

PageObject 六大原则

  • The public methods represent the services that the page offers

    用公共方法表示页面提供的服务

    例如:登录页面,有用户名输入框、密码输入框、登录按钮,于是就可以用 input_username () 代表输入用户名、用 input_password () 代表输入密码、用 click_submit () 代表点击登录按钮

  • Try not to expose the internals of the page

    尽量不要暴露页面的内部信息

    将操作细节封装成方法,对外只提供对应的方法供调用

  • Generally don’t make assertions

    一般不使用断言

    断言要和 Page 代码分开,不要将断言写在 PageObject 层

  • Methods return other PageObjects

    方法返回其他 PageObjects

    例如:首页有个方法是点击登录图标跳转到登录页面,因此这个方法应该返回 login_page

  • Need not represent an entire page

    不需要表示整个页面

    不需要对页面中的每一个元素进行建模,只需要关注我们需要用到的元素。例如:登录页面除了账号密码登录,还有快捷登录、手机短信登录、扫码登录等

  • Different results for the same action are modelled as different methods

    同一行为的不同结果可以用不同的方法来模拟

    例如:对一个页面进行操作,可能出现正确的结果或者错误的结果,可以为这两种不同的结果分别创建两个不同的方法

POM 框架

开源代码请点击文末小卡片获取

  • base:base_page,基类,定义项目所需的基础方法,对 Selenium 一些常用的 api 进行二次封装,如:find_element、click、send_keys、screenshot、调用 JavaScript 脚本的方法以及其他与浏览器相关的操作

    为什么要有基类?

    • 由于每个页面都会频繁使用这些方法,若单纯使用 Selenium 原始 api,可能遇到一些问题,例如:某个按钮未加载完成,但已触发了点击事件,导致元素定位不到而报错。这时就可以对原始 api 进行二次封装,如:加入等待时间、对异常进行捕获并打印日志等,之后所有的 PageObject 都继承 BasePage 类,后续只需要调用这些封装好的方法,增强复用性
    • 假设以后不使用 Selenium 这个框架,就只需要修改 BasePage 中的方法,不用去修改具体的测试用例业务代码
  • pages:page_object,页面对象层,也是 PO 的核心层,继承 BasePage,管理页面元素以及操作元素的方法(将操作元素的动作写成方法)

  • cases:测试用例层,用于管理测试用例,这里会用到单元测试框架,如:Pytest、Unittest。

  • data:测试数据层,用于测试数据的管理,数据与脚本分离,降低维护成本,提高可移植性,如:yml 文件数据

  • config:配置文件层,存放整个项目需要用到的配置项,如:URL、数据库信息等

  • utils:CommonUtil,公共模块,将一些公共函数、方法以及通用操作进行封装,如:日志模块、yaml 操作模块、时间模块等

  • run.py:批量执行测试用例的主程序,根据不同需求不同场景进行组装,遵循框架的灵活性和扩展性

  • logs:日志模块,用于记录和管理日志,针对不同情况,设置不同的日志级别,方便定位问题

  • reports:测试报告层,用于测试报告的生成和管理,如:基于 Allure 生成的定制化报告

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作

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

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

相关文章

MapReduce概述

文章目录 1. 分布式系统的驱动力和挑战2. 分布式系统的抽象和实现工具3. 可扩展性、可用性、一致性4. MapReduce基本工作方式5. Map函数和Reduce函数 1. 分布式系统的驱动力和挑战 分布式系统的核心是通过网络来协调,共同完成一致任务的一些计算机。构建分布式系统…

shopee最新选品:Shopee平台上的最新选品策略和方法

在Shopee平台上进行选品是卖家们必须经历的重要步骤。通过精心选择和定位产品,卖家可以提高产品的市场接受度和销售业绩。然而,要在竞争激烈的电商市场中脱颖而出,并不是一件容易的事情。本文将介绍一些在Shopee平台上进行最新选品时可以采用…

动态权限有哪些

定位权限: ACCESS_FINE_LOCATION:精确位置ACCESS_COARSE_LOCATION:大致位置 相机权限: CAMERA:访问摄像头 存储权限: READ_EXTERNAL_STORAGE:读取外部存储WRITE_EXTERNAL_STORAGE:…

【测试必备】汉化Postman竟如此简单,秒变中文,真香

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

RTX 4090D解禁真香警告?核心阉割性能“只下降”了5%

从 RTX 4090 传出禁售消息,再到反转再反转最终落实,这几个月所发生的可以用猝不及防来形容。 当然放现在来说,这一切又都可以理解了,毕竟 2022 年发布的 RTX 4090 性能「过于强大」。 好在老黄可不会就这么放弃国内市场&#xff…

路飞项目--03

二次封装Response模块 # drf提供的Response,前端想接收到的格式 {code:xx,msg:xx} 后端返回,前端收到: APIResponse(tokneasdfa.asdfas.asdf)---->{code:100,msg:成功,token:asdfa.asdfas.asdf} APIResponse(code101,msg用户不存在) ---…

分布式日志

1 日志管理 1.1 日志管理方案 服务器数量较少时 直接登录到目标服务器捞日志查看 → 通过 rsyslog 或shell/python 等脚本实现日志搜集并集中保存到统一的日志服务器 服务器数量较多时 ELK 大型的日志系统,实现日志收集、日志存储、日志检索和分析 容器环境 …

Redis学习——入门篇①

Redis学习——入门篇① 1、2:Redis入门概述3:Redis安装配置10 安装Redis-cli命令 4:Redis——十大数据类型11 redis数据类型12 命令查阅13 key常用命令介绍14 类型大小写和帮助命令15 String 命令(上)16 String 命令&a…

peer eslint-plugin-vue@“^7.0.0“ from @vue/eslint-config-standard@6.1.0

问题: 用vue/cli脚手架安装项目时,选择ESlint,再安装依赖包的时候,会报以下错误, 原因: npmV7 之前的版本遇到依赖冲突时,会忽视冲突,继续安装; npmV7版本开始不再自动忽…

安裝火狐和穀歌流覽器插件FoxyProxy管理海外動態IP代理

代理生態系統擁有大量有用的實用程式,使海外代理IP代理設置的使用變得簡單起來。其中一種類型叫做代理管理工具,像FoxyProxy就是該工具集比較受歡迎的。 本文將全面解析FoxyProxy擴展的功能和特性、Foxyproxy怎麼下載、以及如何在穀歌流覽器和火狐流覽器…

9款最新文生图模型汇总!含华为、谷歌、Stability AI等大厂创新模型(附论文和代码)

2023年真是文生图大放异彩的一年,给数字艺术界和创意圈注入了新鲜血液。从起初的基础图像创作跃进到现在的超逼真效果,这些先进的模型彻底变革了我们制作和享受数字作品的途径。 最近,一些大公司比如华为、谷歌、还有Stability AI等人工智能巨…

信用评价研究MATLAB仿真代码

信用评价是各种店铺卖家分析买家信用行为的重要内容, 本文给出随机仿真代码模拟实际交易过程的信用评价. 主要研究内容有: (1)研究最大交易额和信用度的关系 (2)研究买家不评价率对信用度影响 (3)研究交易次数对信用度影响 MATLAB程序如下: 主程序main.m %% clc;close a…

宝塔FTP文件传输服务结合cpolar内网穿透实现远程连接本地服务

⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固…

NVMe TCG安全数据存储简介

NVMe(非易失性内存主机控制器接口规范)与TCG(可信计算组)的集成主要体现在数据安全、固件验证和硬件信任根等方面,以确保存储设备的数据保护能力和安全性。 TCG Opal定义了一套针对自加密硬盘(SED, Self-En…

人工智能原理实验4(2)——贝叶斯、决策求解汽车评估数据集

🧡🧡实验内容🧡🧡 汽车数据集 车子具有 buying,maint,doors,persons,lug_boot and safety六种属性,而车子的好坏分为uncc,ucc,good and vgood四种。 🧡🧡贝叶斯求解🧡🧡…

gmpy2与一些python库在vscode下没有自动补全的一种缓解方案

经过一定的研究,该问题的原因初步判断是gmpy2这个库天生没有把补全的函数doc说明附在pip包中。且因gmpy2是由C编译而来,以dll或so的形式作为动态链接库给python调用,这意味着无法从源码薅到可用的源码注释。 接下来先讲解决方案,再…

vue3路由报错解决方法

报错: 解决办法: createWebHashHistory是否为 createWebHashHistory()方法 //指定路由模式为哈希模式 修改:改为方法就行了

春节声量高涨213%!如何撬动过年市场?小红书数据洞察入场玩家

春节将临,网上讨论声量渐起。近来关于新年的讨论层出不穷,春运、春晚、放假回家的大学生“德华”……人们开始为新春做准备。前两天,小红书牵手春晚,登上热门。可以预见的是,今年小红书与春节话题将深度绑定&#xff0…

JUC并发编程-集合不安全情况以及Callable线程创建方式

6. 集合不安全 1&#xff09;List 不安全 //java.util.ConcurrentModificationException 并发修改异常&#xff01; public class ListTest {public static void main(String[] args) {List<Object> arrayList new ArrayList<>();for(int i1;i<30;i){new Thr…

【书生·浦语大模型实战营06】《OpenCompass 大模型评测》学习笔记

《OpenCompass 大模型评测》 文档&#xff1a;OpenCompass大模型评测教程 1、主观评测 2、提示词工程 李华每周给2个不同的朋友写一封3页的信&#xff0c;一周写两次。他一年总共写了多少页的信? 李华每周给2个不同的朋友写一封3页的信&#xff0c; 一周写两次。他一年总共…