一、项目概述本文针对一个模拟博客系统设计完整的测试方案。该系统包含四大核心页面登录页、博客列表页、博客编辑页和博客详情页。系统目前只实现登录功能未实现注册功能。测试范围覆盖功能测试、性能测试、界面测试、安全测试、兼容性测试和易用性测试并配套设计基于 Java Selenium ChromeDriver 的自动化测试用例。二、测试环境与工具分类名称版本/配置操作系统Windows 10 / Windows 1164 位浏览器Chrome最新稳定版自动化驱动ChromeDriver与 Chrome 版本匹配开发语言JavaJDK 8 及以上自动化框架Selenium WebDriver4.x测试框架JUnit / TestNGJUnit 5 或 TestNG 7.x构建工具Maven3.6 及以上数据库MySQL5.7 及以上三、测试范围3.1 测试对象登录页用户名输入框、密码输入框、登录按钮。博客列表页网站名、主页、写博客、注销等菜单每篇博客展示标题、发布时间、内容摘要和查看全文按钮。博客编辑页标题输入框、内容编辑区、发布按钮。博客详情页查看完整博客内容、编辑博客、删除博客。3.2 测试优先级定义优先级说明P0核心功能阻塞级缺陷必须通过P1重要功能严重缺陷优先修复P2一般功能非阻塞缺陷P3优化建议可延后处理四、功能测试用例4.1 登录页功能测试用例编号测试标题前置条件测试步骤测试数据预期结果优先级LOGIN_FUNC_001正确用户名和密码登录成功系统存在有效账号1. 打开登录页2. 输入正确用户名3. 输入正确密码4. 点击登录按钮用户名zhangsan密码123456登录成功跳转到博客列表页P0LOGIN_FUNC_002用户名错误登录失败系统存在有效账号1. 打开登录页2. 输入错误用户名3. 输入正确密码4. 点击登录按钮用户名wrong密码123456登录失败提示用户名或密码错误停留在登录页P0LOGIN_FUNC_003密码错误登录失败系统存在有效账号1. 打开登录页2. 输入正确用户名3. 输入错误密码4. 点击登录按钮用户名zhangsan密码wrong123登录失败提示用户名或密码错误停留在登录页P0LOGIN_FUNC_004用户名和密码均错误登录失败系统存在有效账号1. 打开登录页2. 输入错误用户名3. 输入错误密码4. 点击登录按钮用户名aaa密码bbb登录失败提示用户名或密码错误P0LOGIN_FUNC_005用户名为空登录失败系统存在有效账号1. 打开登录页2. 用户名不输入3. 输入正确密码4. 点击登录按钮用户名空密码123456登录失败提示用户名不能为空P1LOGIN_FUNC_006密码为空登录失败系统存在有效账号1. 打开登录页2. 输入正确用户名3. 密码不输入4. 点击登录按钮用户名zhangsan密码空登录失败提示密码不能为空P1LOGIN_FUNC_007用户名和密码均为空登录失败系统存在有效账号1. 打开登录页2. 用户名不输入3. 密码不输入4. 点击登录按钮用户名空密码空登录失败提示用户名和密码不能为空P1LOGIN_FUNC_008密码大小写敏感校验系统存在有效账号1. 打开登录页2. 输入正确用户名3. 输入大小写错误的密码4. 点击登录按钮用户名zhangsan密码Admin123登录失败提示用户名或密码错误P2LOGIN_FUNC_009登录成功后菜单展示已成功登录1. 登录系统2. 观察博客列表页顶部菜单栏账号zhangsan页面展示网站名、主页、写博客、注销四个菜单项P14.2 博客列表页功能测试用例编号测试标题前置条件测试步骤测试数据预期结果优先级LIST_FUNC_001网站名正常展示已登录系统1. 登录系统进入博客列表页2. 查看页面顶部网站名无网站名正确显示样式正常P2LIST_FUNC_002点击主页跳转列表页已登录系统当前在写博客页1. 点击顶部菜单「主页」无成功跳转到博客列表页P1LIST_FUNC_003点击写博客跳转编辑页已登录系统1. 在列表页点击「写博客」按钮无成功跳转到博客编辑页P0LIST_FUNC_004点击注销退出登录已登录系统1. 点击「注销」按钮2. 确认退出行为无成功退出登录返回登录页P0LIST_FUNC_005博客标题正常展示数据库中存在博客数据1. 进入博客列表页2. 查看每篇博客的标题已存在博客测试博客A标题完整正确展示P1LIST_FUNC_006博客发布时间正常展示数据库中存在博客数据1. 进入博客列表页2. 查看每篇博客的发布时间已存在博客发布时间 2026-10-31发布时间格式正确展示P2LIST_FUNC_007博客内容摘要正常展示数据库中存在博客数据1. 进入博客列表页2. 查看每篇博客的内容摘要已存在博客内容为一段测试内容内容摘要正确展示P2LIST_FUNC_008点击查看全文跳转详情页数据库中存在博客数据1. 进入博客列表页2. 点击某篇博客的「查看全文」按钮已存在博客测试博客A成功跳转到对应博客详情页内容与列表项一致P0LIST_FUNC_009空博客列表展示数据库中无博客数据1. 清空博客数据2. 进入博客列表页无博客数据页面提示暂无博客不报错P24.3 博客编辑页功能测试用例编号测试标题前置条件测试步骤测试数据预期结果优先级EDIT_FUNC_001标题和内容均填写正常发布已登录系统1. 进入写博客页2. 输入标题3. 输入内容4. 点击发布按钮标题测试博客标题内容这是一段测试内容发布成功跳转博客列表页列表中展示新博客P0EDIT_FUNC_002标题为空发布失败已登录系统1. 进入写博客页2. 标题不输入3. 输入内容4. 点击发布按钮标题空内容测试内容发布失败提示标题不能为空P0EDIT_FUNC_003内容为空发布失败已登录系统1. 进入写博客页2. 输入标题3. 内容不输入4. 点击发布按钮标题测试标题内容空发布失败提示内容不能为空P0EDIT_FUNC_004标题和内容均为空发布失败已登录系统1. 进入写博客页2. 标题不输入3. 内容不输入4. 点击发布按钮标题空内容空发布失败提示标题和内容不能为空P0EDIT_FUNC_005标题超长边界测试已登录系统1. 进入写博客页2. 输入超长标题3. 输入正常内容4. 点击发布按钮标题200 字符内容正常内容按系统规则处理超长提示或截断页面不崩溃P2EDIT_FUNC_006内容超长发布已登录系统1. 进入写博客页2. 输入正常标题3. 输入超长内容4. 点击发布按钮标题正常标题内容5000 字符按系统规则处理发布成功或提示内容过长P2EDIT_FUNC_007特殊字符标题发布已登录系统1. 进入写博客页2. 输入含特殊字符的标题3. 输入正常内容4. 点击发布按钮标题测试 博客 标题内容测试内容特殊字符正确保存并展示不出现乱码或 XSS 执行P14.4 博客详情页功能测试用例编号测试标题前置条件测试步骤测试数据预期结果优先级DETAIL_FUNC_001详情页完整展示博客信息数据库中存在博客数据1. 从列表页点击「查看全文」2. 查看详情页已存在博客测试博客A标题、发布时间、完整内容正确展示P0DETAIL_FUNC_002点击编辑跳转编辑页已进入详情页1. 点击「编辑」按钮已存在博客测试博客A成功跳转到编辑页标题和内容回填当前博客数据P0DETAIL_FUNC_003编辑后保存成功已进入详情页并点击编辑1. 修改标题2. 修改内容3. 点击发布按钮原标题测试博客A新标题测试博客A-修改保存成功详情页和列表页均展示修改后内容P0DETAIL_FUNC_004删除博客成功已进入详情页1. 点击「删除」按钮2. 确认删除已存在博客测试博客A删除成功返回博客列表页该博客不再展示P0DETAIL_FUNC_005删除时取消操作已进入详情页1. 点击「删除」按钮2. 在确认弹窗中点击取消已存在博客测试博客A博客未被删除停留在详情页P1DETAIL_FUNC_006删除弹窗确认提示已进入详情页1. 点击「删除」按钮2. 观察弹窗已存在博客测试博客A弹出确认删除提示框文案清晰P1五、性能测试用例Jmeter用例编号测试标题测试场景测试数据性能指标预期结果优先级PERF_001登录接口响应时间模拟并发用户登录10、50、100 并发用户响应时间 ≤ 3 秒登录接口在并发压力下响应正常P1PERF_002博客列表页加载时间存在 100 篇博客数据时加载列表页100 篇博客数据页面加载时间 ≤ 3 秒列表页在数据量较大时加载流畅P1PERF_003发布博客响应时间连续发布博客操作连续发布 50 次单次响应时间 ≤ 2 秒发布操作响应稳定无超时P2PERF_004详情页加载时间打开包含长内容的博客详情页内容长度 5000 字符页面加载时间 ≤ 2 秒长内容详情页加载流畅P2PERF_005系统长时间运行稳定性持续 30 分钟循环执行登录、查看、退出操作持续 30 分钟无内存泄漏、崩溃系统运行稳定资源占用正常P2六、界面测试用例用例编号测试标题测试步骤预期结果优先级UI_001登录页布局验证1. 打开登录页2. 检查用户名框、密码框、登录按钮位置和样式各元素布局合理、对齐一致、样式统一P2UI_002登录页提示信息样式1. 触发登录失败2. 观察错误提示样式错误提示颜色醒目、文案清晰、位置合理P3UI_003列表页菜单样式1. 登录后查看顶部菜单栏菜单排列整齐、字体统一、鼠标悬停有反馈P2UI_004博客卡片布局验证1. 查看列表页博客展示区域标题、时间、摘要、查看全文按钮排列规范间距合理P2UI_005编辑页表单布局1. 进入写博客页2. 检查标题框和内容框布局标题框在内容框上方尺寸合理标签清晰P2UI_006详情页按钮样式1. 进入详情页2. 检查编辑和删除按钮按钮样式区分明显删除为危险色编辑为常规色P3UI_007页面响应式适配1. 调整浏览器窗口大小2. 查看各页面布局页面在常见分辨率下无元素重叠、错位或溢出P3UI_008颜色与字体一致性1. 浏览所有页面2. 检查颜色、字体、字号全站颜色和字体风格一致符合设计规范P3七、安全测试用例用例编号测试标题测试步骤预期结果优先级SEC_001SQL 注入防护1. 在登录用户名框输入 or 112. 点击登录系统不执行注入语句登录失败或参数被安全处理P0SEC_002XSS 跨站脚本防护1. 在博客标题或内容中输入scriptalert(xss)/script2. 发布后查看列表页和详情页脚本作为纯文本展示不执行弹窗P0SEC_003密码不以明文展示1. 打开登录页2. 在密码框输入密码密码以圆点或星号形式显示不以明文展示P1SEC_004登录失败次数限制1. 连续输入错误密码 10 次2. 观察系统响应系统按规则进行限制如锁定账号、验证码或冷却时间P1SEC_005越权访问防护1. 未登录状态直接访问列表页、编辑页、详情页 URL系统拦截未授权访问重定向到登录页P0SEC_006会话失效验证1. 登录后等待会话超时2. 再次操作页面功能会话失效后操作被拦截跳转登录页P1SEC_007删除操作二次确认1. 在详情页点击删除按钮必须弹出确认提示防止误删P1SEC_008密码传输安全1. 打开开发者工具2. 登录并观察网络请求密码不通过明文 URL 参数传递建议使用 POST 加密传输P1八、兼容性测试用例用例编号测试标题测试环境测试步骤预期结果优先级COMPAT_001Chrome 浏览器兼容Chrome 最新版1. 使用 Chrome 执行全流程操作各页面功能正常样式正常P1COMPAT_002Edge 浏览器兼容Microsoft Edge 最新版1. 使用 Edge 执行全流程操作各页面功能正常样式正常P2COMPAT_003Firefox 浏览器兼容Firefox 最新版1. 使用 Firefox 执行全流程操作各页面功能正常样式正常P2COMPAT_004不同分辨率兼容1920x1080、1366x768、1536x8641. 在不同分辨率下打开各页面页面布局正常无溢出或错位P2COMPAT_005移动端浏览器兼容手机浏览器或开发者工具移动模式1. 使用移动端模式访问系统页面基本可用布局适配或提示使用桌面端P3COMPAT_006不同操作系统兼容Windows 10、Windows 11、macOS1. 在不同系统上使用 Chrome 测试功能正常无系统相关异常P2九、易用性测试用例用例编号测试标题测试步骤预期结果优先级USABILITY_001登录页操作路径简洁1. 观察登录页2. 完成一次登录操作登录入口醒目操作步骤不超过三步P2USABILITY_002错误提示清晰易懂1. 触发各类登录失败2. 阅读错误提示提示文案通俗易懂明确指出错误原因和修改方式P1USABILITY_003菜单命名直观1. 登录后查看顶部菜单「主页」「写博客」「注销」命名直观符合用户习惯P2USABILITY_004查看全文入口可发现性1. 查看博客列表项「查看全文」按钮位置醒目用户能快速找到P2USABILITY_005发布成功反馈1. 在编辑页填写内容并发布发布成功后有明确提示如成功消息或页面跳转P1USABILITY_006删除操作防误触1. 进入详情页2. 点击删除按钮删除按钮有二次确认降低误操作风险P1USABILITY_007键盘操作支持1. 使用 Tab 键在登录页各元素间切换2. 使用 Enter 键提交登录支持键盘导航和 Enter 提交操作流畅P3USABILITY_008表单焦点自动定位1. 打开登录页2. 观察光标位置页面加载后光标自动定位到用户名输入框P3十、自动化测试设计10.1 环境准备自动化测试采用 Java Selenium WebDriver ChromeDriver 技术栈。首先在 Maven 项目的pom.xml中引入 Selenium 和测试框架依赖。dependencies dependency groupIdorg.seleniumhq.selenium/groupId artifactIdselenium-java/artifactId version4.25.0/version /dependency dependency groupIdorg.junit.jupiter/groupId artifactIdjunit-jupiter/artifactId version5.11.0/version scopetest/scope /dependency /dependencies在Maven项目中添加webdrivermanager依赖进行浏览器驱动管理dependency groupIdio.github.bonigarcia/groupId artifactIdwebdrivermanager/artifactId version5.8.0/version scopetest/scope /dependency10.2 元素定位策略以下是各个页面的元素定位信息。页面元素属性定位方式登录页用户名输入框cssSelector#usernameBy.cssSelector(#username)登录页密码输入框cssSelector#passwordBy.cssSelector(#password)登录页登录按钮cssSelector#submitBy.cssSelector(#submit)登录页错误提示信息alterdriver.switchTo().alert()alert.accept()列表页写博客菜单xpath/html/body/div[1]/a[2]By.xpath(/html/body/div[1]/a[2])列表页主页菜单xpath/html/body/div[1]/a[1]By.xpath(/html/body/div[1]/a[1])列表页注销菜单xpath/html/body/div[1]/a[3]By.xpath(/html/body/div[1]/a[3])列表页查看全文按钮cssSelectorbody div.container div.right div:nth-child(1) aBy.cssSelector(body div.container div.right div:nth-child(1) a)编辑页标题输入框xpath//*[ideditor]/div[1]By.xpath(//*[ideditor]/div[1])编辑页内容编辑区xpath//*[ideditor]/div[1]/div[6]/div[1]/div/div/div/div[5]/div/preBy.xpath(//*[ideditor]/div[1]/div[6]/div[1]/div/div/div/div[5]/div/pre)编辑页发布按钮xpath//*[idsubmit]By.xpath(//*[idsubmit])详情页编辑按钮cssSelectorbody div.container div.right div div.operating button:nth-child(1)By.cssSelector(body div.container div.right div div.operating button:nth-child(1))详情页删除按钮cssSelectorbody div.container div.right div div.operating button:nth-child(2)By.cssSelector(body div.container div.right div div.operating button:nth-child(2))删除确认弹窗弹窗确定按钮alterdriver.switchTo().alert()alert.accept()删除确认弹窗弹窗取消按钮alterdriver.switchTo().alert()alert.dismiss()10.3 隐式等待与弹窗处理自动化脚本中必须处理页面加载等待和弹窗交互以下为核心处理方式。3.3.1 隐式等待隐式等待是⼀种智能等待他可以规定在查找元素时在指定时间内不断查找元素。如果找到则代码 继续执行直到超时没找到元素才会报错隐式等待作用域是整个脚本的所有元素。即只要driver对象没有被释放掉driver.quit()隐式等待 就⼀直⽣效。// 设置隐式等待全局最多等待 10 秒元素出现即继续 driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));3.3.1 显式等待显式等待也是⼀种智能等待在指定超时时间范围内只要满足操作的条件就会继续执行后续代码 new WebDriverWait(driver, Duration.ofSeconds(3)).until($express)返回值booleanWebDriverWait wait new WebDriverWait(driver, Duration.ofSeconds(3)) wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(#submit)));3.3.2 弹窗处理弹窗是在页面找不到任何元素的这种情况怎么处理使用selenium提供的Alert接口// 处理浏览器原生 alert 弹窗 Alert alert driver.switchTo().alert(); System.out.println(弹窗内容 alert.getText()); alert.accept(); // 点击确定 // alert.dismiss(); // 点击取消 // 处理页面自定义弹窗div 模拟的弹窗 WebDriverWait wait new WebDriverWait(driver, Duration.ofSeconds(10)); WebElement confirmBtn wait.until( ExpectedConditions.elementToBeClickable(By.id(confirmDeleteBtn)) ); confirmBtn.click();10.4 自动化测试用例用例编号自动化场景操作步骤断言点预期结果优先级AUTO_LOGIN_001正确账号登录成功1. 打开登录页2. 输入正确用户名密码3. 点击登录4. 断言跳转当前 URL 包含列表页地址登录成功URL 跳转到/blog_listP0AUTO_LOGIN_002空用户名登录失败1. 打开登录页2. 输入正确密码3. 点击登录4. 断言错误提示错误提示元素可见提示参数校验失败停留登录页P0AUTO_LOGIN_003错误密码登录失败1. 打开登录页2. 输入正确用户名3. 输入错误密码4. 点击登录5. 断言错误提示错误提示元素可见弹窗提示密码错误停留登录页P0AUTO_EDIT_001正常发布博客1. 登录2. 点击写博客3. 输入标题和内容4. 点击发布5. 断言跳转和数据展示跳转到列表页列表包含新博客标题发布成功列表展示新博客且博客数量1P0AUTO_EDIT_002空标题发布失败1. 登录2. 点击写博客3. 只输入内容4. 点击发布5. 断言提示弹窗元素可见且提示“参数校验失败”发布失败提示标题不能为空P0AUTO_EDIT_003空内容发布失败1. 登录2. 点击写博客3. 只输入标题4. 点击发布5. 断言提示弹窗元素可见且提示“参数校验失败”发布失败提示内容不能为空P0AUTO_DETAIL_001删除博客成功1. 登录2. 进入详情页3. 点击查看全文按钮并且点击删除按钮4. 处理确认弹窗5. 断言列表无该博客列表页不包含已删除博客标题删除成功返回列表页且博客消失P0AUTO_DETAIL_002删除博客取消1. 登录2. 进入详情页点击查看全文按钮3. 点击删除4. 点击取消5. 断言博客仍存在详情页标题仍为原博客标题取消删除博客保持不变P1AUTO_LOGOUT_001注销退出登录1. 登录2. 点击注销3. 断言跳转登录页当前 URL 包含登录页地址退出成功返回登录页P010.5 自动化测试脚本示例以下给出核心自动化测试脚本覆盖登录成功、登录失败、发布博客和删除博客四个典型场景。脚本中使用隐式等待、显式等待、弹窗处理和断言。3.5.1 基础测试类package common; import io.github.bonigarcia.wdm.WebDriverManager; import io.github.bonigarcia.wdm.managers.ChromeDriverManager; import org.apache.commons.io.FileUtils; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.support.ui.WebDriverWait; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.time.Duration; import java.util.ArrayList; import java.util.List; public class Utils { public static WebDriver driver null; public static WebDriverWait wait null; public static String detailUrl null; public Utils(String url){ driver createDriver(); driver.get(url); wait new WebDriverWait(driver,Duration.ofMillis(3000)); } //创建浏览器驱动并实例化 public static WebDriver createDriver(){ if (drivernull) { //使用WebDriverManager管理浏览器驱动 WebDriverManager.chromedriver().setup(); //添加浏览器配置 ChromeOptions options new ChromeOptions(); ListString list new ArrayList(); list.add(--remote-allow-origins*); list.add(--disable-blink-featuresAutomationControlled); options.addArguments(list); //创建浏览器对象 driver new ChromeDriver(options); } //添加隐式等待,作用域为当前标签页的所有元素以及driver对象的整个生命周期 driver.manage().timeouts().implicitlyWait(Duration.ofMillis(5000)); return driver; } public void stop(){ driver.quit(); } }3.5.2 登录自动化测试package cases; import common.ClearLoginText; import common.Url; import common.Utils; import common.WaitAlert; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.support.ui.ExpectedConditions; import java.io.IOException; public class Test_Login extends Utils { ClearLoginText clearLoginText new ClearLoginText(); public Test_Login() { super(Url.Login_Url); } public void checkPageEle() throws IOException { //屏幕截图,使用方法获取当前方法名 screenShot(Thread.currentThread().getStackTrace()[1].getMethodName()); //确认登录页的关键元素是否存在 driver.findElement(By.cssSelector(#username)); driver.findElement(By.cssSelector(#password)); driver.findElement(By.cssSelector(#submit)); } public void sucLogin() throws IOException { //清空输入框的内容 clearLoginText.clear(driver); //输入用户名和密码登录 driver.findElement(By.cssSelector(#username)).sendKeys(zhangsan); driver.findElement(By.cssSelector(#password)).sendKeys(123456); driver.findElement(By.cssSelector(#submit)).click(); //屏幕截图 screenShot(Thread.currentThread().getStackTrace()[1].getMethodName()); //校验是否登录成功--是否有注销元素按钮 String text driver.findElement(By.cssSelector(body div.nav a:nth-child(6))).getText(); assert text.equals(注销); } /** * 登录失败: * 1.错误的用户名,正确的密码 * 2.正确的用户名,错误的密码 * 3.错误的用户名,错误的密码 * 4.错误的用户名,空白的密码 * 5.正确的用户名,空白的密码 * 6.空白的用户名,正确的密码 * 7.空白的用户名,错误的密码 * ...... */ public void failLogin(){ //回退到登录页面 driver.navigate().back(); //清空输入框的内容 clearLoginText.clear(driver); //输入错误的用户名 driver.findElement(By.cssSelector(#username)).sendKeys(zhang); //输入正确的密码 driver.findElement(By.cssSelector(#password)).sendKeys(123456); //点击登录 driver.findElement(By.cssSelector(#submit)).click(); //处理弹窗 //等待弹窗出现 wait.until(ExpectedConditions.alertIsPresent()); Alert alert driver.switchTo().alert(); alert.dismiss(); //清空输入框的内容 clearLoginText.clear(driver); //输入错误的用户名 driver.findElement(By.cssSelector(#username)).sendKeys(zhangsan); //输入错误的密码 driver.findElement(By.cssSelector(#password)).sendKeys(123); //点击登录 driver.findElement(By.cssSelector(#submit)).click(); //等待弹窗出现 WaitAlert.waitAlertAppear(driver); }3.5.3 发布博客自动化测试package cases; import common.Url; import common.Utils; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.SearchContext; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.support.ui.ExpectedConditions; import java.text.SimpleDateFormat; import java.util.List; public class Test_edit extends Utils { public Test_edit() { super(Url.List_Url); } //编辑博客并发布 public void edit_blog() throws InterruptedException { //自动化创建标题 SimpleDateFormat sim new SimpleDateFormat(yyyy-MM-dd HH_mm_ss); //使用当前系统时间创建标题 String titleTime sim.format(System.currentTimeMillis()); String title 自动化创建标题:titleTime; driver.findElement(By.cssSelector(body div.nav a:nth-child(5))).click(); Thread.sleep(5000); //输入标题 driver.findElement(By.cssSelector(#title)).sendKeys(title); //输入内容 Thread.sleep(5000); WebElement ele driver.findElement(By.cssSelector(#editor div.CodeMirror.cm-s-default.CodeMirror-wrap div.CodeMirror-scroll div.CodeMirror-sizer div div div div.CodeMirror-code div pre)); //方法一与不可交互的元素进行操作并输入内容 // new Actions(driver) // .click() // .keyDown(ele, Keys.CONTROL) // .sendKeys(a) // .sendKeys(自动化创建内容) // .keyUp(Keys.CONTROL) // .perform(); //方法二与不可交互的元素进行操作并输入内容 new Actions(driver) .doubleClick(ele) .sendKeys(自动化创建内容titleTime) .perform(); //点击提交 Thread.sleep(2000); driver.findElement(By.cssSelector(#submit)).click(); } //校验是否发布成功 /** * 1.轻度校验:跳转到列表页 * 2.列表的博客数量1 * 3.发布成功后,检查列表页是否存在刚才发布的博客(标题唯一) */ public void checkPublishSuc() throws InterruptedException { //获取发布前的博客数量 ListWebElement list1 driver.findElements(By.cssSelector(body div.container div.right div)); System.out.println(发布前的博客数量list1.size()); edit_blog(); //发布后的博客数量 Thread.sleep(3000); driver.navigate().refresh(); ListWebElement list2 driver.findElements(By.cssSelector(body div.container div.right div)); System.out.println(发布后的博客数量:list2.size()); assert list1.size()1 list2.size(); } }3.5.4 博客列表页自动化测试含弹窗处理package cases; import common.Url; import common.Utils; import org.openqa.selenium.By; public class Test_List extends Utils { public Test_List() { super(Url.List_Url); } //测试列表页的页面元素是否存在 public void checkListEle(){ //博客标题 String title driver.findElement(By.cssSelector(body div.container div.right div:nth-child(2) div.title)).getText(); //博客发布时间 String pushTime driver.findElement(By.cssSelector(body div.container div.right div:nth-child(2) div.date)).getText(); //博客发布内容 String content driver.findElement(By.cssSelector(body div.container div.right div:nth-child(2) div.desc)).getText(); //查看全文按钮 String bth driver.findElement(By.cssSelector(body div.container div.right div:nth-child(2) a)).getText(); //校验是否存在 assert !title.isEmpty(); assert !pushTime.isEmpty(); assert !content.isEmpty(); assert !bth.equals(查看全文); } public void checkJumpBth() throws InterruptedException { //获取列表页标题信息 String title driver.findElement(By.cssSelector(body div.container div.right div:nth-child(2) div.title)).getText(); //点击查看全文的按钮 driver.findElement(By.cssSelector(body div.container div.right div:nth-child(2) a)).click(); //等待页面加载 Thread.sleep(3000); //获取详情页的标题信息 String detailTitle driver.findElement(By.cssSelector(body div.container div.right div div.title)).getText(); //校验是否一致 assert title.equals(detailTitle); //保存有效博客文章的Url detailUrl driver.getCurrentUrl(); } }3.5.5 测试主类main函数package cases; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException, InterruptedException { //测试登录页 Test_Login test_login new Test_Login(); //检查页面元素 test_login.checkPageEle(); //测试成功登录 test_login.sucLogin(); //测试登录失败 test_login.failLogin(); //登录成功进行下一步的列表页测试 test_login.sucLogin(); //测试列表页 Test_List test_list new Test_List(); //强制等待页面资源加载刷新 Thread.sleep(3000); test_list.checkListEle(); //测试列表页的跳转按钮 test_list.checkJumpBth(); //测试博客编辑页 Test_edit test_edit new Test_edit(); //测试自动化编辑博客并发布 test_edit.edit_blog(); //校验博客发布是否成功 test_edit.checkPublishSuc(); //测试结束退出自动化测试 test_edit.stop(); } }十一、发现的BUG11.1 登录页面未对用户名空值情况下进行登录前的校验而且未对密码的长度进行任何的限制进行用户名的输入时没有任何输入提示如手机号/邮箱号码/微信号并且大小写切换时输入框未提示大小写的状态以及缺失密码的组成和长度等的提示用户难以快速精确输入11.2 博客编辑页标题为空或者内容为空的情况下统一显示参数校验失败未对各自为空的情况进行分化提示11.3 博客列表页缺少批量管理博客文章的功能想要删除博客就必须要查看详情才能进行删除对于批量删除博客的情况用户就得消耗大量时间和精力十二、自动化测试脚本https://gitee.com/xiaolin-c/Test_code十三、测试总结与建议本测试方案覆盖了博客系统的六个测试维度共设计了 60 余条测试用例其中核心功能用例以 P0 级别为主确保登录、发布、查看、编辑、删除等关键链路质量可控。自动化测试部分重点覆盖登录成功与失败、博客发布成功与失败、删除确认与取消等高频场景。后续建议从以下三点继续完善测试体系补充接口测试对登录、发布、删除等接口进行独立接口自动化测试提前暴露后端缺陷。完善数据驱动将登录和发布的测试数据抽离为外部数据文件实现一条脚本覆盖多组测试数据。引入持续集成将自动化脚本接入 Jenkins 或 GitLab CI实现代码提交后自动回归测试。