当前位置:首页 > 技术文章 > 正文内容

告别屎山代码!测试工程师必学的Page Object模式,效率提升70%

zonemu2周前 (08-16)技术文章10

还在为UI自动化测试的维护噩梦头疼?一个登录按钮改了ID,要改100个测试脚本?2025年最火的Page Object模式来了!作为测试工程师,我用这套方案让团队维护成本直降70%,手把手教你玩转PO模式!


科普:什么是Page Object模式?

PO模式 = 把每个页面变成Python类!
三大核心思想

  1. 元素定位 → 封装成类属性
  2. 操作行为 → 封装成类方法
  3. 业务流 → 方法组合调用

传统 vs PO模式对比
传统:
page.locator("#login-btn").click() 散落在100个脚本里
PO模式:
login_page.click_login() 统一维护,一次修改全局生效


实战:电商系统PO架构设计

分层架构

text

pages/  
├── login_page.py    # 登录页封装  
├── home_page.py     # 首页封装  
└── cart_page.py     # 购物车封装  

1. 登录页封装(高可复用版)

python

class LoginPage:
    def __init__(self, page):
        self.page = page
        self.username = page.get_by_placeholder("手机号/邮箱")  # 推荐:面向用户定位
        self.password = page.get_by_label("密码")
        self.submit_btn = page.get_by_role("button", name="登录")

    def login(self, user, pwd):  # 业务语义封装!
        self.username.fill(user)
        self.password.fill(pwd)
        self.submit_btn.click()
        expect(self.page).to_have_url("**/dashboard")  # 自动等待

测试技巧
get_by_role/text替代CSS选择器,稳定性提升90%!


2. 购物车页封装(含智能断言)

python

class CartPage:
    def apply_coupon(self, code):
        self.page.get_by_test_id("coupon-input").fill(code)  # 测试ID最稳定!
        self.page.get_by_text("应用优惠券").click()
        expect(self.page.get_by_text("优惠券已生效")).to_be_visible()  # 自动等待+断言

科普小知识
什么是testid定位?
给元素加
data-testid属性,前端怎么改样式都不影响测试!


三大高阶技巧

1. 组件化复用(Header抽离)

python

class HeaderComponent:  # 头部导航抽成组件
    def __init__(self, page):
        self.search_bar = page.get_by_role("searchbox")

class HomePage:
    def __init__(self, page):
        self.header = HeaderComponent(page)  # 直接复用!

    def search(self, keyword):
        self.header.search(keyword)  # 调用组件方法

2. 多用户隔离测试

python

# conftest.py
@pytest.fixture
def user_context(playwright):
    context = playwright.chromium.new_context(
        storage_state="user1.json"  # 复用登录态
    )
    yield context
    context.close()  # 自动清理

3. 并发抢购测试

python

def test_concurrent_purchase():
    with ThreadPoolExecutor() as executor:
        # 3用户并发下单
        futures = [executor.submit(place_order, user) for user in ["u1","u2","u3"]]
        assert all("成功" in f.result() for f in futures)

四大避坑指南

  1. 元素失效 → 只用get_by_role/testid/text定位
  2. 异步加载 → PO方法内必须加wait_for_selector
  3. 页面跳转 → 返回新页面对象:return OrderPage(self.page)
  4. 多语言 → 文本抽离到locales/zh-CN.json

测试工程师总结

必做

  • 所有元素定位器必须集中管理
  • 业务操作封装成login()这种语义化方法
  • 多用Playwright的expect自动等待

效果

  • 新页面接入速度提升50%
  • 元素变更只需改1个文件
  • 用例可读性暴涨,产品经理都能看懂!

现在就用PO模式重构你的测试框架,让同事直呼专业!更多请戳 >>>
https://ceshiren.com/t/topic/34346

#自动化测试 #测试开发 #PageObject #Playwright #代码重构

相关文章

如何使用git clone克隆包含子模块的仓库

技术背景在软件开发中,当项目规模逐渐增大时,为了更好地管理代码,我们常常会使用子模块将项目拆分成多个独立的部分。Git 作为目前最流行的版本控制系统,提供了管理子模块的功能。但在克隆包含子模块的仓库时...

(在线编辑DWG)网页CAD二开实现焊接符号绘制

前言在工程制图和制造领域,焊接符号(Welding Symbols)是用于表示焊缝类型、尺寸、位置以及工艺要求的标准化图形语言。广泛应用于机械设计、钢结构、船舶制造、压力容器等行业中,帮助技术人员理解...

VIM配置整理(vim配置教程)

一、基本配色set number set showcmd set incsearch set expandtab set showcmd set history=400 set autoread se...

一键看懂Html5,就这么简单(查看html的app推荐)

HTML5是WEB开发世界的一次重大的改变,事实上不管你是否喜欢,它都是代表着未来趋势。曾几何时,当HTML5出现在web端开发领域的时候,并没有引起太多人的注意,究其原因,一方面是它还没有被广泛的支...

HTML5培训学习(简单明了)(html5教学视频教程)

这些事HTML5培训认为在学习HTML5前应该做好的准备,欢迎参考指正:为什么学习HTML5?软硬件环境介绍HTML5环境搭建常见问题解决掌握技能需求为什么学习HTML5?1:自从2010年HTML5...

Excel中的FILTER函数详细介绍及使用示例

在Excel中处理大量数据时,经常需要根据特定条件筛选出符合条件的数据行或列。这正是Excel的FILTER函数发挥作用的地方。FILTER函数是Excel中一个非常强大的工具,它可以基于一个或多个条...