news 2026/6/23 21:38:49

今天,我们详细讲讲UI自动化测试最佳设计模式POM

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
今天,我们详细讲讲UI自动化测试最佳设计模式POM

概念

什么是POM?

POM是PageObjectModule(页面对象模式)的缩写,其目的是为了WebUI测试创建对象库。

在这种模式下,应用涉及的每一个页面应该定义为一个单独的类,类中应该包含此页面上的页面元素对象和处理这些元素对象所需要的方法等。

将流程所关联的页面作为对象,将对象串联起来,形成一个个不同的流程,POM是业内公认最佳的设计模式。

POM的优点:

(1)PO提供了页面元素操作和业务流程相分离的模式,可以使测试的代码结构比之前清晰,可读性强。

(2)更方便地复用对象和方法。

(3)对象库是独立于测试用例的、统一的对象库,可以通过集成不同的工具类来达到不同的测试目的。比如集成UnitTest可以用来做单元测试、自动化/功能测试,同时也可以集成JBehave/Cucumber等来做验收测试。

(4)使得整体自动化测试的优点变得更容易一些,如果有某个页面的元素需要变更,那么就可以直接更改封装好的页面元素类即可,而不用更改调用它的其他测试类/代码。这样整个的代码维护成本也会缩减。

PO的核心就是分层思想,把同属于一个页面的元素都放在一个页面类中。

简要结构设计

逻辑代码:基类,实现所有工具函数封装,类似于关键字驱动设计模式。

页面对象代码:基于系统页面,通过调用工具函数来实现业务的操作,生成对应的页面对象。

测试代码:基于测试需要,组件页面对象,实现核心流程的自动化,执行测试用例。

测试数据:为测试用例的执行提供所需要的测试数据。

POM完整框架

Base层:定义项目需要的基础方法,特别是一些基础操作,如元素click操作、sendkeys操作,调用JavaScript脚本的方法和其他一些与基本浏览器相关的操作。

Common层:包含处理Excel文件的方法,获取项目路径、测试系统URL的信息和框架执行相关日志功能的实现方法。

Data层:存放测试数据,在这里可以维护测试数据,这样存放是为了让项目的可维护性强、整体的条理性强。测试数据有时是自动化测试的驱动因素,因此对Data的管理和维护就显的特别重要。

Logs层:存放项目在运行过程中产生的日志文件。

PageObject层:这里是PO的核心层,该层不但涉及代码技术,还涉及对项目业务的分析,进而对项目的页面进行分析。

Reports层:存放项目执行过程中产生的测试报告文件,测试报告是对测试结果的总结。

TestCase层:管理测试用例和执行测试,相当于测试的总入口。

config.ini:整个项目需要用到的配置项。

项目实战

以百度搜索为例

我们首先新建一个简单的项目结构:base、data、page_object、cases,如下图所示:

在base包下新建一个base_page.py文件,在base_page.py文件下新建一个BasePage类作为基类,提供各个常用的已封装好的函数,便于后续的页面对象类进行调用。

selenium中常用的函数:元素定位、输入、点击、访问URL、等待、关闭等。代码如下:

''' 基类:提供各个常用的已封装好的函数,便于后续的页面对象类进行调用。 selenium中常用的函数:元素定位、输入、点击、访问URL、等待、关闭 ''' from time import sleep from selenium import webdriver class BasePage: driver = webdriver.Chrome() # 访问URL def visit(self, url): self.driver.get(url) # 元素定位 def locator(self, loc): return self.driver.find_element(*loc) # 输入 def input(self, loc, txt): self.locator(loc).send_keys(txt) # 点击 def click(self, loc): self.locator(loc).click() # 等待 def wait(self, time): sleep(time) # 关闭 def close(self): self.driver.quit()

selenium中常用的函数:元素定位、输入、点击、访问URL、等待、关闭

在page_object包下新建一个search_page.py文件,在该文件下新建一个SearchPage类继承BasePage类,调用基础类中的方法实现页面操作,生成对应的页面对象。代码如下:

''' 百度查询页面,搜索功能 ''' from selenium.webdriver.common.by import By from base.base_page import BasePage from selenium import webdriver class SearchPage(BasePage): url = 'http://www.baidu.com' # 定位百度输入框 search_input = (By.NAME, 'wd') # 定位百度一下按钮 search_button = (By.ID, 'su') # 封装实现业务流程的函数 def search(self, txt): self.visit(self.url) self.wait(2) self.input(self.search_input, txt) self.wait(2) self.click(self.search_button)

在cases包下新建一个testcase.py文件作为测试类,实现在百度中分别搜索selenium、python,代码如下:

''' 测试类 ''' import unittest from page_object.search_page import SearchPage from selenium import webdriver class Case(unittest.TestCase): def test_search1(self): driver = webdriver.Chrome() txt = 'selenium' SearchPage(driver).search(txt) def test_search2(self): driver = webdriver.Chrome() txt = 'python' SearchPage(driver).search(txt) if __name__ == '__main__': unittest.main()

运行以上代码发现,因为创建了两次webdriver,所以每运行一次代码都会打开一个Chrome浏览器,同时,代码中也存在冗余。

优化方案:可以增加@classmethod作为前置条件和后置条件,搜索的条件也可以采用数据驱动的方式完成,提高代码的可读性与维护性。

在data包下新建一个searchTXT.yaml文件,存放搜索的内容如下:

优化之后代码如下:

''' 测试类 ''' import unittest from page_object.search_page import SearchPage from selenium import webdriver import ddt @ddt.ddt() class Case(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.driver = webdriver.Chrome() cls.se = SearchPage(cls.driver) @classmethod def tearDownClass(cls) -> None: cls.driver.quit() @ddt.file_data('../data/searchTXT.yaml') def test_search(self, txt): self.se.search(txt) if __name__ == '__main__': unittest.main()

运行以上代码,发现测试用例执行了四次,分别搜索了selenium、python、java、php,如此实现了数据驱动,同时也在一个浏览器中完成了操作。

后记

以上简单的实现了POM的设计模式,完成了基类、页面对象层、数据层、测试层的代码编写,若读者有兴趣,可以完成报告层、日志层等内容的编写,最终实现完整的框架。

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料和我花了3个月整理的软件测试自学全栈,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 1:00:49

基于单片机的视力保护器设计

一、系统设计背景与总体架构 随着电子设备普及,青少年近视率逐年攀升,长时间近距离用眼、不良光照环境是主要诱因。传统视力保护手段依赖人工提醒,缺乏实时性与准确性。基于单片机的视力保护器,能自动监测用眼环境并及时干预&…

作者头像 李华
网站建设 2026/6/23 1:18:43

WebSocket 协议详解:ws 和 wss 的区别与应用

WebSocket 协议详解:ws 和 wss 的区别与应用 WebSocket 是一种全双工通信协议,允许客户端和服务器之间建立持久的双向通信连接。它是 HTML5 标准的一部分,旨在解决传统 HTTP 协议在实时通信中的局限性。本文将详细介绍 WebSocket 的工作原理…

作者头像 李华
网站建设 2026/6/23 18:33:35

【Matlab】基于图像处理的苹果质量检测分级系统

苹果质量检测分级系统可以利用图像处理技术来实现。下面是一个简单的基于MATLAB的示例代码,用于检测苹果的质量并对其进行分级。 % 读取苹果图像 appleImage = imread(apple.jpg);% 转换为灰度图像 grayImage = rgb2gray(appleImage);% 对图像进行平滑处理,减少噪音 smoothe…

作者头像 李华
网站建设 2026/6/23 9:07:21

从零构建高质量纹理管线:5个专业团队都在用的行业标准流程

第一章:从零构建高质量纹理管线在现代图形渲染中,纹理是赋予3D模型真实感的关键元素。构建一条高效且可扩展的纹理处理管线,不仅能提升视觉质量,还能优化资源加载与内存占用。纹理格式的选择 不同的应用场景需要权衡压缩比、画质和…

作者头像 李华
网站建设 2026/6/23 18:33:22

【紧急避坑】:低代码项目中事件冒泡失控的6大诱因及应对策略

第一章:低代码组件的事件概述在低代码开发平台中,组件事件是实现用户交互与业务逻辑联动的核心机制。通过监听和响应用户操作(如点击、输入、选择等),开发者可以在无需编写大量前端代码的前提下,构建动态且…

作者头像 李华