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

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

zonemu2个月前 (08-16)技术文章29

还在为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 #代码重构

相关文章

费用报销单填写及粘贴全攻略:避免常见错误!附费用报销管理系统

费用报销单是企业日常财务管理中的重要工具,用于记录和核销员工在工作中产生的各类费用。填写准确的费用报销单不仅能够保证财务报销流程的顺利进行,还能提高工作效率,确保公司资金的合理使用。在填写报销单时,员...

【Vue3 基础】05.组件化(组件使用vuex)

这是 Vue3 + Vite + Pinia +TS + Element-Plus 实战系列文档。最近比较忙没什么时间写文章,争取早日把这个系列完结吧~生命周期和模板引用在本章之前,我们通过响应式 a...

gitlab简单搭建与应用(gitlab怎么用)

一、gitlab1、简介GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。与Github类似,GitLab...

基于Docker构建安装Git/GitLab,以及制作springboot工程镜像

今天给大家分享的是《领先的开源自动化服务器Jenkins的应用实战》之基于Docker安装构建Git/GitLab版本控制与代码云存储的场所;使用Git管理项目,springboot工程制作镜像知识体...

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

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

HTML5学习笔记三:HTML5语法规则(html5语法详解)

1.标签要小写2.属性值可加可不加””或”3.可以省略某些标签 html body head tbody4.可以省略某些结束标签 tr td li例:显示效果:5.单标签不用加结束标签img inpu...