Python 自动化测试:Selenium 与 Pytest 结合的 UI 测试框架搭建
·
Python自动化测试:Selenium与Pytest结合的UI测试框架搭建
引言
随着Web应用复杂度的提升,UI自动化测试成为保障产品质量的关键环节。Selenium作为主流的Web自动化工具,配合Pytest测试框架,可构建灵活可靠的测试解决方案。本文将详细阐述如何搭建基于Python的UI测试框架。
环境准备
# 安装核心库
pip install selenium pytest pytest-html
同时需下载对应浏览器的WebDriver(如ChromeDriver),并配置环境变量。
框架结构设计
test_framework/
├── conftest.py # 全局配置
├── page_objects/ # 页面对象封装
├── test_cases/ # 测试用例
├── utils/ # 工具类
└── reports/ # 测试报告
核心组件实现
1. 浏览器驱动封装(conftest.py)
import pytest
from selenium import webdriver
@pytest.fixture(scope="session")
def browser():
driver = webdriver.Chrome()
driver.implicitly_wait(10)
yield driver
driver.quit()
2. 页面对象模型(page_objects/login_page.py)
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.url = "https://example.com/login"
def open(self):
self.driver.get(self.url)
def login(self, username, password):
self.driver.find_element("id", "username").send_keys(username)
self.driver.find_element("id", "password").send_keys(password)
self.driver.find_element("id", "submit-btn").click()
3. 参数化测试用例(test_cases/test_login.py)
import pytest
from page_objects.login_page import LoginPage
@pytest.mark.parametrize("credential", [
{"user": "valid@test.com", "pw": "Pass123", "result": True},
{"user": "invalid@test.com", "pw": "WrongPW", "result": False}
])
def test_login(browser, credential):
page = LoginPage(browser)
page.open()
page.login(credential["user"], credential["pw"])
if credential["result"]:
assert "Dashboard" in browser.title
else:
assert "Login Failed" in browser.page_source
高级特性应用
1. 失败截图功能
# conftest.py 追加
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item):
outcome = yield
report = outcome.get_result()
if report.failed and "browser" in item.funcargs:
driver = item.funcargs["browser"]
driver.save_screenshot(f"reports/{item.name}_fail.png")
2. HTML测试报告生成
pytest --html=reports/report.html
3. 复杂元素定位策略 使用相对XPath提升稳定性:
# 替代绝对路径
self.driver.find_element("xpath", "//button[contains(@class,'primary-btn')]")
最佳实践
- 隔离测试数据:使用JSON/YAML文件管理测试参数
- 等待策略优化:显式等待替代固定等待
WebDriverWait(driver, 10).until( EC.visibility_of_element_located(("id", "dynamic-element")) ) - 跨浏览器支持:通过配置文件切换浏览器
- 异常处理:添加try-except块捕获特定异常
结论
该框架实现了:
- 测试逻辑与业务逻辑分离(POM模式)
- 参数化驱动测试
- 自动报告与失败分析
- 可扩展的架构设计
通过Selenium与Pytest的结合,可构建适应不同业务场景的UI测试解决方案。持续优化方向包括添加API测试集成、容器化执行环境等,进一步提升测试效率与可靠性。
测试框架的时间复杂度分析:
设测试用例数为$n$,页面操作数为$m$
最优执行时间复杂度为$O(n \times m)$
实际复杂度受网络延迟$t$影响:
$$T(n) = O(n \times (m + t))$$
更多推荐
所有评论(0)