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')]")

最佳实践
  1. 隔离测试数据:使用JSON/YAML文件管理测试参数
  2. 等待策略优化:显式等待替代固定等待
    WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located(("id", "dynamic-element"))
    )
    

  3. 跨浏览器支持:通过配置文件切换浏览器
  4. 异常处理:添加try-except块捕获特定异常
结论

该框架实现了:

  • 测试逻辑与业务逻辑分离(POM模式)
  • 参数化驱动测试
  • 自动报告与失败分析
  • 可扩展的架构设计

通过Selenium与Pytest的结合,可构建适应不同业务场景的UI测试解决方案。持续优化方向包括添加API测试集成、容器化执行环境等,进一步提升测试效率与可靠性。

测试框架的时间复杂度分析:
设测试用例数为$n$,页面操作数为$m$
最优执行时间复杂度为$O(n \times m)$
实际复杂度受网络延迟$t$影响:
$$T(n) = O(n \times (m + t))$$

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐