PO模式:PageObjece
- Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一,Page Object 的主要体现于对界面交互细节的封装,这样可以使测试案例更关注与业务而非界面细节,提高测试案例的可读性。
普通模式:
def test_baidu():
driver = webdriver.Chrome()
driver.get('https://baidu.com.com')
driver.find_element(By.ID, "kw").send_keys('python')
driver.find_element(By.ID, "su").click()
- 易读性差:一连串的find element会使代码显得杂乱无章
- 可扩展性不好:用例孤立,无法扩展
- 可复用性差:无公共方法,很难复用
- 可维护性差:一旦元素变化,需要维护修改大量测试用例
PageObjece设计模式:
- 效率高 :同理,PO模式的逻辑层方法有具体定义,情况和元素发生变化一样 修改逻辑层,业务层不变。这样看来结构简单清晰,舒服更符合人类习惯, 普通方式就是继续堆case。
- 复用多收益大: 同样这里如果逻辑复用越多,PO模式收益越大,因为对于PO模式来说都只需要修改一个地方多处受益。
设计原则
- 公共方法表示页面提供的服务
- 尽量不要暴露页面的内部结构
- 一般不做断言
- 方法返回其他PageObject
- 不需要代表整个页面,只需要封装重要的页面元素
- 同一动作的不同结果被建模为不同的方法
对上述六大原则进行更详细的解释:
- 原则一:要封装页面中的功能(或者服务),比如点击页面中的元素,可以进入到新的页面,于是,可以为这个服务封装一个方法“进入新页面”。
- 原则二:封装细节,对外只提供方法名(或者接口)。
- 原则三:封装的操作细节中不要使用断言,把断言放到单独的模块中,比如 testcase。
- 原则四:点击一个按钮会开启新的页面,可以用 return 方法表示跳转,比如return MainPage()表示跳转到新的 PO:MainPage。
- 原则五:只为页面中重要的元素进行 PO 设计,舍弃不重要的内容。
- 原则六:一个动作可能产生不同结果,比如点击按钮后,可能点击成功,也可能点击失败,为两种结果封装两个方法,click_success和click_error。
分层机制
- 让不同层去做不同类型的事情,让代码结构清晰,增加复用性。
主要有以下几种分层方式:
- 两层:对象逻辑层+业务数据层
- 三层:对象库层+逻辑层+业务数据层
- 四层:对象库层+逻辑层+业务层+数据层
示例:PO模式(四层)
BasePage.py(核心方法)
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class BasePage(object):
def __init__(self, driver):
self.driver = driver
def open(self, url):
"""
打开浏览器获取url地址
:param url:
:return:
"""
self.driver.get(url)
self.driver.maximize_window()
self.driver.implicitly_wait(20)
def quit(self):
self.driver.quit()