五、Page Object模式
1、PO(Page Object)
- 概念:是一种设计模式。将面向过程转变为面向对象(页面对象),整体思想是分层。将某个页面的所有“元素(包含控件)属性”及“元素操作”封装在一个类(Page类)中,以page为单位进行管理。
- 目的:
-
- 提高复用率,可读性和编写效率。
- 测试代码与被测页面对象代码分离,降低页面变化带来的维护成本。
- 尽量使用XPath,不建议使用name,link等。 xpath是基于页面元素所处的区域。
- 分层:
-
- 两层
-
-
- 对象库层:页面元素和操作;
- 业务层:测试用例操作;
-
-
- 三层
- 对象库层:页面元素和操作;
- 逻辑层:封装好的功能用例模块;
- 业务层:测试用例操作;
- 三层
-
- 四层
- 对象库层:页面元素和操作;
- 逻辑层:封装好的功能用例模块;
- 业务层:测试用例操作;
- 数据层:测试数据;
- 四层
- 原则
-
- 方法意义
- 用公共方法代表UI所提供的的服务;
- 方法应该返回其他PO 或返回用于断言的数据;
- 同样的行为不同的结果可建模为不同的方法;
- 不要在方法中加断言;
- 方法意义
-
- 字段意义
- 不要暴露页面内部的元素给外部;
- 不需要建模UI内的所有元素;
- 字段意义
- 实践
- 把每个要测试的对象封装在一个page内, 这个page里包含这个对象可能的所有操作。
- 创建一个BasePage,这个BasePage包含所有待测page都能用到的公用方法,这个BasePage对应的类应该是个抽象类。
- 测试脚本自由引用page及page里的方法。
- python里有个第三方库page-objects, 基于python实现了PageObject模式,并且封装了很多有用的方法。
- webium是基于Python的一个Page Object实现。
- PO结构大致如下
2、使用PO的例子
- BasePage---对象层
- LoginPage---逻辑层
- test_login_case---业务层
BasePage.py
LoginPage.py
test_login_case
3、总结:
- case越多使用PO模式会使代码结构更清晰
- 元素复用越多PO模式下维护非常容易
- 逻辑复用越多PO模式下维护非常容易 (如果逻辑复用多,需要多考虑逻辑层的颗粒度)
- 元素/逻辑/数据复用越多应选择更多层的PO模式