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 方法暴露,防止调用方耦合定位。
页面类与断言库解耦:返回业务值(订单号、提示文案),由用例决定断言内容。