首页/开发/软件测试速查/Page Object 模式
自动化测试66 条

Page Object 模式

Page Object 把页面元素定位与操作封装成类,用例只调用业务动作(如 login(user, pwd));页面改版时定位集中修改,用例层保持稳定。

软件测试速查开发更新于 2026-10-13

Page Object 模式是什么

Page Object 把页面元素定位与操作封装成类:用例只调用业务动作(如 login(user, pwd)),页面改版时定位集中修改,用例层保持稳定。它是 UI 自动化最常见的设计模式,核心价值是把「怎么操作」与「验证什么」分开,让两边各自演化。

基本信息

结构每个页面或组件一个类,封装定位与操作
用例职责调用业务动作并做断言,不碰选择器
职责边界页面类不做断言、不写测试流程
演进方式页面动作可组合;按组件拆分,避免巨型类
收益改版集中改定位;多个用例共享同一套操作

封装示例

封装示例
class LoginPage:
    def __init__(self, driver):
        self.driver = driver
        self.user = (By.ID, "user")

    def login(self, name, password):
        # 只封装操作,不做断言
        self.driver.find_element(*self.user).send_keys(name)
        self.driver.find_element(By.ID, "pwd").send_keys(password)
        self.driver.find_element(By.ID, "submit").click()

典型使用场景

  • 大型界面回归:同一页面被大量用例操作,封装避免复制。
  • 改版应对:选择器变化只改页面类一处。
  • 团队协作:元素命名与操作语义统一,评审容易。
  • 新人上手:页面类相当于操作手册,快速了解系统用法。
  • 分层测试:页面类可被冒烟、回归等不同套件复用。
  • 重构演进:随页面拆分细化类,控制单类规模。

设计细化

  • 组件复用:导航、弹窗等公共区块抽为组件类,页面类组合调用。
  • 命名即动作:方法名描述业务(login、add_to_cart),断言只依赖返回值。
页面类只负责「怎么操作」,断言与业务预期留在用例层,职责更清晰。
页面类里避免 sleep 与隐式假设:等待条件封装成方法,超时与重试集中管理。
选择器集中为类属性或常量表,避免散落在方法体内。
页面类不返回元素细节:需要断言值时通过 getter 方法暴露,防止调用方耦合定位。
页面类与断言库解耦:返回业务值(订单号、提示文案),由用例决定断言内容。

易错点

  • 在 Page Object 里写断言与测试流程,职责边界被打破
  • 单个页面类堆入全部元素与动作,规模变大后难以维护
  • 页面类方法返回裸 driver 或元素,调用方又写选择器,封装失效
  • 选择器散落在方法体内,改版时全局搜索替换风险高
  • 页面类之间互相依赖链条过长,单页改动引发连锁失败
  • 构造函数里执行导航与等待,实例化即产生副作用,复用困难

数据来源与参考

  • Selenium 官方文档:Page object models(selenium.dev)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌