PageObject 模式是什么?它如何起到到减少冗余代码,提升测试效率的目的?
先想象下这个例子:
在自动化测试过程中,特别是基于UI的功能自动化,我们经常要进行查找元素,操作元素的操作,一般来说,代码是如下这个样子的:
如果这个元素会被多个method用到,那么当元素变化时(例如XPATH变了), 我们就不得不更新每个引用到这个元素的代码,非常麻烦。
有没有好的办法解决这个问题呢? PageObject 应运而生
Page Objects
Within your web app’s UI there are areas that your tests interact with. A Page Object simply models these as objects within the test code. This reduces the amount of duplicated code and means that if the UI changes, the fix need only be applied in one place.
简单来说就是:
PageObject是一种程序设计模式,将面向过程转变为面向对象(页面对象),将测试对象及单个的测试步骤封装在每个Page对象中,以page为单位进行管理。可以使代码复用,降低维护成本,提高程序可读性和编写效率。
PageObject可以将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),提高用例的可维护性。
记住,PageObject是一种程序设计模式,是一种思想,
PageObject 的好处是:
Creating reusable code that can be shared across multiple test cases
Reducing the amount of duplicated code
If the user interface changes, the fix needs changes in only one place
PageObject应该怎么使用呢?基于测试实践,我们一般这样应用:
- 把每个要测试的对象封装在一个page内, 这个page里包含这个对象可能的所有操作。
- 创建一个BasePage,这个BasePage包含所有待测page都能用到的公用方法,这个BasePage对应的类应该是个抽象类。
- 测试脚本自由引用page及page里的方法。
python里有个第三方库page-objects, 基于python实现了PageObject模式,并且封装了很多有用的方法。我们以它为例,举例如下(例子基于我的Github项目):
abstract_base_page.py
|
|
解释如下:
1.abc 模块用来创建抽象类。
2.page_objects模块用来实现pageobject模式。
语法请自行google。
baidu.py
|
|
解释如下:
1.page_objects封装了Selenium的一些方法,我们不需要通过driver.find_element_by_xpath()等来查找元素,转而用
pageelement(locator)这样的方式来定位, page-objects支持的locator如下:
keyword Arg | Description |
---|---|
id_ | Element ID attribute |
css | CSS Selector |
name | Element name attribute |
class_name | Element class name |
tag_name | Element HTML tag name |
link_text Anchor | Element text content |
partial_link_text | Anchor Element partial text content |
xpath | XPath |
2.每个子类,都应该实现抽象类里的抽象方法, 在本例中是is_target_page().
test.py(测试用例)
|
|
测试脚本,可以任何组合各个page的任意方法。
由此可以见, 使用了page_objects 后, 测试对象, 测试方法, 测试脚本全部解耦, 测试对象的任何改变,只需要更改相应的page对应的类就好了。
最后附上:
Page_objects的pypi地址