创建Page Object(PO)模式是自动化测试中实现代码复用和可维护性的关键步骤。以下是创建PO模式的详细步骤和最佳实践:
一、核心概念与分层结构
分层设计 - 基础层(BasePage):
封装Selenium原生API,如元素定位、页面跳转等通用操作。
- PO层:包含页面元素定位、操作封装及返回值(如页面对象或断言结果)。
- 测试用例层:定义业务逻辑和数据驱动测试,调用PO层方法执行操作。
松耦合与复用性 通过分层设计,实现页面逻辑与测试用例的解耦,便于维护和复用。例如,不同测试用例可共享同一页面的PO类,仅需关注输入数据和断言结果。
二、具体实现步骤
创建基础层(BasePage)
定义通用方法,如`open_page(driver, url)`、`find_element_by_*`、`click_element`等,封装常用的Selenium操作。
```python
class BasePage:
def __init__(self, driver):
self.driver = driver
def open_page(self, url):
self.driver.get(url)
def find_element(self, by, value):
return self.driver.find_element(by, value)
def click_element(self, by, value):
element = self.find_element(by, value)
element.click()
```
设计PO层
为每个页面创建独立的类,封装页面特定元素和操作。例如,登录页面的PO类可能包含`login`方法:
```python
class LoginPage(BasePage):
USERNAME_INPUT = (By.ID, 'username')
PASSWORD_INPUT = (By.ID, 'password')
LOGIN_BUTTON = (By.ID, 'login-btn')
def login(self, username, password):
self.find_element(*self.USERNAME_INPUT).send_keys(username)
self.find_element(*self.PASSWORD_INPUT).send_keys(password)
self.click_element(*self.LOGIN_BUTTON)
return self.driver.current_url 返回跳转后的页面URL
```
编写测试用例
继承`unittest.TestCase`,调用PO层方法执行测试逻辑,并进行断言。
```python
import unittest
from selenium import webdriver
class TestLogin(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.login_page = LoginPage(self.driver, 'https://example.com/login')
def test_valid_credentials(self):
response_url = self.login_page.login('user', 'pass')
self.assertEqual(response_url, 'https://example.com/dashboard')
def test_invalid_credentials(self):
response_url = self.login_page.login('wrong_user', 'wrong_pass')
self.assertIn('error', response_url)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
```
三、设计原则与注意事项
方法返回值设计
- 若操作导致页面跳转,方法应返回新页面对象或当前页面引用。
- 若操作需断言,方法应返回断言结果(如文本、状态码)。
封装粒度
仅封装与页面逻辑相关的操作,避免将UI细节暴露给测试用例。例如,`select AlbumWithTitle`方法应仅包含查找元素和获取文本的操作,而不应包含具体的定位策略。
数据驱动测试
结合数据驱动框架(如`unittest`的`setUp`参数或第三方库),实现多组数据的灵活测试。
四、工具与框架支持
框架集成: Selenium Grid、Appium等框架均支持PO模式,可简化跨浏览器/平台的测试。 代码生成工具
通过以上步骤,可构建清晰、可维护的自动化测试框架,提升测试效率和质量。