Page Object 是 UI 自动化测试项目开发实践的最佳设计模式之一,它的主要特点体现在对界面交互细节的封装上,使测试用例更专注于业务的操作,从而提高测试用例的可维护性。
1. 认识 Page Object
当为 Web 页面编写测试时,需要操作该 Web 页面上的元素。直接操作这些元素,这样代码十分脆弱,因为 UI 会经常变动。
page 对象的一个基本经验法则是:凡是人能做的事,page 对象通过软件客户端都能做到。它提供一个易于编程的接口,并隐藏窗口中底层的部件。page 对象把在 GUI 控件上所有查询和操作数据的行为封装为方法。
一个好的经验法则是,即使改变具体的元素,page 对象的接口也不应当发生变化。
页面上有重要意义的元素可以独立为一个 page 对象。经验法则的目的是通过给页面建模,使其对应用程序的使用者变得有意义。
Page Object 是一种设计模式,在自动化测试开发中应遵循这种设计模式来编写代码。
Page Object 应该遵循以下原则进行开发:
- Page Object 应该易于使用。
- 有清晰的结构,如 PageObjects 对应页面对象,PageModules 对应页面内容。
- 只写测试内容,不写基础内容。
- 在可能的情况下防止样板代码。
- 不需要自己管理浏览器。
- 在运行时选择浏览器,而不是类级别。
- 不需要直接接触 Selenium。
2. 实现 Page Object
(1)Page Object 简单实例
当有以下测试代码 test_baidu.py ,两条测试用例中重复使用了元素的定位和操作,当元素定位变化后,那么这两条测试用例都需要修改。如果测试用例有几百条,UI 频繁变化,那么自动化测试用例维护成本较高。
...
def test_baidu_search_case1(self):
""" 搜索关键字:selenium """
self.driver.get(self.base_url)
self.driver.find_element_by_id('kw').send_keys('selenium')
self.driver.find_element_by_id('su').click()
sleep(2)
def test_baidu_search_case2(self):
""" 搜索关键字:page object """
self.driver.get(self.base_url)
self.driver.find_element_by_id('kw').send_keys('page object')
self.driver.find_element_by_id('su').click()
sleep(2)
...
Page Object 的设计思想上是把元素定位与元素操作进行分层,这样带的来最直接的好处就是当元素发生变化时,只需维护 page 层的元素定位,而不需要关心在哪些测试用例当中使用了这些元素。
创建 baidu_page.py 文件,代码如下:
class BaiduPage():
def __init__(self, driver):
self.driver = driver
def search_input(self, search_key):
self.driver.find_element_by_id('kw').send_keys(search_key)
def search_button(self):
self.driver.find_element_by_id('su').click()
修改 test_baidu.py,修改部分如下:
from baidu_page import BaiduPage
...
def test_baidu_search_case1(self):
""" 搜索关键字:selenium """
s