news 2026/4/16 15:48:14

今天,我们详细讲讲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/4/16 10:57:05

手把手教你用PHP实现农业物联网设备双向认证,99%的人都忽略了第3步

第一章:农业物联网设备双向认证概述在现代农业物联网系统中,大量传感器、控制器和网关设备分布于田间地头,实时采集环境数据并执行自动化操作。这些设备通常通过无线网络与云平台通信,面临窃听、伪造和中间人攻击等安全威胁。为确…

作者头像 李华
网站建设 2026/4/16 10:54:04

2025企业微信打卡定位失败全攻略:5步排查+场景解决指南

2025企业微信打卡定位失败全场景解决方案:5分钟快速排查 2025年,企业微信打卡已是很多企业的考勤标配,但不少员工遇到定位失败的问题——权限没开?网络不好?境外无法打卡?本文整理了最新的全场景解决方案&a…

作者头像 李华
网站建设 2026/4/16 11:50:50

沈阳长春哈尔滨内蒙古购物中心美陈氛围升级设计公司【力荐】

在商业空间竞争日趋激烈的当下,沈阳、长春、哈尔滨乃至内蒙古地区的购物中心,正悄然经历一场关于“体验”的深层变革。消费者不再仅仅为商品而来,更在为氛围、为记忆、为一份触动情感的沉浸式体验买单。美陈与氛围,已从简单的装饰…

作者头像 李华
网站建设 2026/4/16 10:14:47

R-Python双引擎建模验证实战(稀缺技术流程首次公开)

第一章:R-Python双引擎模型融合结果验证概述在现代数据科学实践中,R 与 Python 作为两大主流分析语言,各自在统计建模与机器学习领域具备独特优势。将 R 的强大统计推断能力与 Python 的高效工程化部署相结合,形成 R-Python 双引擎…

作者头像 李华