news 2026/2/4 16:08:48

今天,我们详细讲讲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/1/29 14:24:12

Cox回归分析效率提升3倍,R语言高级建模技巧大公开

第一章:临床数据的 R 语言 Cox 回归优化在处理生存分析问题时,Cox 比例风险模型是临床研究中广泛应用的统计方法。它能够评估多个协变量对生存时间的影响,同时无需假设基础风险函数的具体形式。利用 R 语言中的 survival 包,可以高…

作者头像 李华
网站建设 2026/2/4 6:41:49

【渲染的抗锯齿终极指南】:揭秘图像锯齿根源与5种高效解决方案

第一章:渲染的抗锯齿在计算机图形学中,抗锯齿(Anti-Aliasing)是提升图像视觉质量的关键技术之一。由于数字图像由离散像素构成,在渲染斜线或曲线边缘时容易出现阶梯状的“锯齿”现象。抗锯齿通过平滑这些边缘&#xff…

作者头像 李华
网站建设 2026/2/3 11:55:34

【医疗行业数据防护】:满足HIPAA合规要求的5大技术控制措施

第一章:医疗数据的 HIPAA 合规概述在医疗信息化快速发展的背景下,保护患者隐私和确保数据安全成为核心议题。HIPAA(Health Insurance Portability and Accountability Act)作为美国医疗数据保护的基石性法规,为个人健康…

作者头像 李华
网站建设 2026/2/4 0:02:38

为什么你的低代码PHP系统总被越权?5大核心校验机制必须掌握

第一章:为什么你的低代码PHP系统总被越权?在低代码开发盛行的今天,许多PHP系统通过可视化拖拽快速构建业务模块,但随之而来的安全问题日益突出,尤其是越权访问。开发者往往误以为“功能上线即安全”,却忽略…

作者头像 李华