以博客系统为目标 Web 应用,从零开始设计自动化测试用例、搭建测试框架、编写脚本并生成测试报告。以下是对整个实战过程的详细总结,包括测试用例设计思路、项目文件结构、核心函数作用以及运行流程。
一、项目背景与目标
目标 :针对一个Web博客系统,使用 Selenium + Python 实现完整的UI自动化测试。
测试覆盖的四大模块:
-
登录页面(登陆界面)
-
博客首页/博客列表页(博客首页)
-
博客详情页(博客详情页)
-
编辑博客页(博客编辑页)




二、测试实施步骤
-
编写 Web 测试用例 -- 使用思维导图(脑图)梳理功能点与异常场景。
-
搭建自动化测试项目 -- 创建 Python 工程,引入 Selenium,设计通用工具类。
-
编写自动化测试脚本 -- 分模块实现登录、列表、详情、编辑页的测试逻辑。
-
生成测试报告 -- 汇总执行结果,按模板输出报告,评估上线风险。
三、测试用例设计
针对博客系统各页面,我们设计了以下核心测试点:

四、项目目录结构

五、核心文件及函数详解
5.1 common/Utils.py --- 公共工具模块
作用 :封装项目中公共的配置和通用功能,避免代码重复,实现驱动对象的单例管理。
import datetime
import os.path
import sys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
#创建一个浏览器对象
class Driver:
driver = ""
def __init__(self):
options = webdriver.ChromeOptions()
self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)
def getScreeShot(self):
#创建屏幕截图
#图片文件名称:./2026-05-30-173456.png
#图片路径: ./images/2026-05-30-173456.png
dirname = datetime.datetime.now().strftime("%Y-%m-%d")
#判断dirname文件夹是否已经存在,若不存在则创建文件夹
if not os.path.exists("./images/" + dirname):
os.mkdir("./images/" + dirname)
#2026-05-30-173456.png
filename = sys._getframe().f_back.f_code.co_name + "-" + datetime.datetime.now().strftime(
"%Y-%m-%d-%H%M%S") + ".png"
self.driver.save_screenshot("./images/" + dirname + "/" + filename)
BlogDriver = Driver()
关键知识点:
| 代码/技术 | 作用说明 |
|---|---|
ChromeDriverManager().install() |
自动检测并下载对应版本的ChromeDriver,无需手动配置路径 |
sys._getframe().f_back.f_code.co_name |
反射获取调用当前方法的函数名,用于截图命名,方便定位是哪个测试用例报的错 |
page_load_strategy = 'eager' |
页面加载策略:normal(等所有资源)、eager(DOM就绪即可)、none(不等待) |
BlogDriver = Driver() |
单例模式,确保整个测试过程中只打开一个浏览器窗口,各页面测试共享登录状态 |
5.2 tests/BlogLoginTest.py --- 登录页测试
作用 :测试博客系统的登录功能,包括正常登录和异常登录场景。


5.3 tests/BlogListTest.py --- 博客列表页测试
作用 :测试**博客首页(列表页)**的功能,包括页面元素检查、文章数量验证、文章跳转等。


5.4 tests/BlogDetailTest.py --- 博客详情页测试

5.5 tests/BlogEditTest.py --- 博客编辑页测试
作用 :测试发布博客功能,包括正常发布和异常发布场景


5.6 RunTest.py --- 测试执行入口
作用 :作为测试执行的主入口,按顺序调用各模块的测试方法。

执行顺序设计:先登录 → 再访问需要登录状态的页面 → 最后关闭浏览器。由于使用单例Driver,登录状态会一直保持。
六、常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
ElementNotInteractableException |
元素存在但不可交互(被遮挡、隐藏、未启用) | 等待元素可见/可点击;滚动到元素位置;检查是否有弹窗遮挡 |
InvalidElementStateException |
元素状态不允许操作(如disabled、readonly) | 对于富文本编辑器,使用JavaScript执行输入;检查iframe切换 |
NoSuchElementException |
元素未找到 | 添加显式等待;检查定位器是否正确;确认页面是否已加载 |
| 登录状态丢失 | 每次新建driver实例 | 使用单例模式共享driver,保持session |
| 截图覆盖 | 文件名重复 | 加入时间戳和调用函数名,确保唯一 |
