Selenium 4 + JUnit 5 自动化测试:JeeSite 内容管理模块 15 个功能点实战 Selenium 4 JUnit 5 自动化测试JeeSite 内容管理模块 15 个功能点实战在企业级应用开发中内容管理系统CMS作为核心业务模块其稳定性和可靠性直接影响用户体验。本文将基于JeeSite平台的内容管理模块通过Selenium 4和JUnit 5的组合构建一套完整的自动化测试解决方案。1. 测试框架搭建与环境配置1.1 依赖管理使用Maven构建项目时需在pom.xml中添加以下核心依赖dependencies !-- Selenium 4 -- dependency groupIdorg.seleniumhq.selenium/groupId artifactIdselenium-java/artifactId version4.1.4/version /dependency !-- JUnit 5 -- dependency groupIdorg.junit.jupiter/groupId artifactIdjunit-jupiter/artifactId version5.8.2/version scopetest/scope /dependency !-- WebDriverManager -- dependency groupIdio.github.bonigarcia/groupId artifactIdwebdrivermanager/artifactId version5.1.0/version /dependency /dependencies1.2 WebDriver管理策略推荐采用WebDriverManager自动管理浏览器驱动public class WebDriverFactory { private static WebDriver driver; public static WebDriver getChromeDriver() { if (driver null) { WebDriverManager.chromedriver().setup(); ChromeOptions options new ChromeOptions(); options.addArguments(--start-maximized); driver new ChromeDriver(options); } return driver; } public static void quitDriver() { if (driver ! null) { driver.quit(); driver null; } } }1.3 测试基类设计创建抽象测试基类处理公共逻辑public abstract class BaseTest { protected WebDriver driver; protected static final String BASE_URL http://localhost:8080/jeesite; BeforeEach void setUp() { driver WebDriverFactory.getChromeDriver(); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10)); login(); } AfterEach void tearDown() { WebDriverFactory.quitDriver(); } private void login() { driver.get(BASE_URL /login); driver.findElement(By.name(username)).sendKeys(admin); driver.findElement(By.name(password)).sendKeys(admin); driver.findElement(By.cssSelector(button[typesubmit])).click(); } }2. Page Object模式实现2.1 内容发布页面封装针对文章管理功能创建Page Objectpublic class ContentPublishPage { private final WebDriver driver; // 元素定位器 private final By searchButton By.id(searchBtn); private final By titleInput By.name(title); private final By addButton By.id(addBtn); public ContentPublishPage(WebDriver driver) { this.driver driver; } public void searchArticle(String title) { driver.findElement(titleInput).clear(); driver.findElement(titleInput).sendKeys(title); driver.findElement(searchButton).click(); } public void clickAddButton() { driver.findElement(addButton).click(); } public boolean isArticleDisplayed(String title) { return driver.findElements(By.xpath(//td[contains(text(), title )])).size() 0; } }2.2 页面工厂模式优化使用工厂方法管理页面对象public class PageFactory { private final WebDriver driver; public PageFactory(WebDriver driver) { this.driver driver; } public ContentPublishPage contentPublishPage() { return new ContentPublishPage(driver); } public ColumnManagePage columnManagePage() { return new ColumnManagePage(driver); } }3. 核心功能测试用例实现3.1 文章管理功能测试验证文章CRUD操作class ArticleManagementTest extends BaseTest { private PageFactory pages; BeforeEach void initPages() { pages new PageFactory(driver); } Test DisplayName(新增文章功能测试) void testAddArticle() { ContentPublishPage publishPage pages.contentPublishPage(); publishPage.clickAddButton(); // 填充表单数据 driver.findElement(By.name(title)).sendKeys(自动化测试文章); driver.findElement(By.name(keywords)).sendKeys(测试,自动化); driver.switchTo().frame(driver.findElement(By.cssSelector(iframe.ke-edit-iframe))); driver.findElement(By.cssSelector(body)).sendKeys(这是通过自动化测试创建的文章内容); driver.switchTo().defaultContent(); // 提交表单 driver.findElement(By.id(submitBtn)).click(); // 验证结果 assertTrue(publishPage.isArticleDisplayed(自动化测试文章)); } }3.2 栏目管理测试验证栏目树操作Test DisplayName(栏目树展开/折叠测试) void testColumnTreeOperation() { ColumnManagePage columnPage pages.columnManagePage(); columnPage.expandColumnTree(新闻中心); // 验证子栏目显示 assertTrue(columnPage.isSubColumnDisplayed(国内新闻)); columnPage.collapseColumnTree(新闻中心); assertFalse(columnPage.isSubColumnDisplayed(国内新闻)); }4. 测试数据管理与清理4.1 测试数据准备使用JUnit 5的BeforeAll准备基础数据BeforeAll static void prepareTestData() { // 使用JDBC或API准备测试数据 TestDataHelper.createTestColumns(); TestDataHelper.createTestTemplates(); }4.2 测试数据清理策略实现自动清理机制AfterEach void cleanTestData() { try { // 通过API删除测试数据 TestDataHelper.cleanArticlesCreatedToday(); } catch (Exception e) { System.err.println(清理测试数据失败: e.getMessage()); } }5. 高级测试场景处理5.1 文件上传测试处理富文本编辑器中的图片上传Test DisplayName(文章图片上传测试) void testImageUpload() { ContentPublishPage page pages.contentPublishPage(); page.clickAddButton(); // 触发文件上传对话框 driver.findElement(By.cssSelector(.ke-upload-area)).click(); // 处理文件上传 WebElement fileInput driver.findElement(By.cssSelector(input[typefile])); fileInput.sendKeys(/path/to/test/image.jpg); // 验证图片插入 driver.switchTo().frame(driver.findElement(By.cssSelector(iframe.ke-edit-iframe))); assertTrue(driver.findElement(By.tagName(img)).isDisplayed()); }5.2 多窗口切换测试验证站点管理中的新窗口操作Test DisplayName(站点管理窗口切换测试) void testSiteManagementWindowSwitch() { String mainWindow driver.getWindowHandle(); // 打开新窗口 driver.findElement(By.linkText(站点设置)).click(); driver.findElement(By.id(viewSiteBtn)).click(); // 切换到新窗口 SetString windows driver.getWindowHandles(); for (String window : windows) { if (!window.equals(mainWindow)) { driver.switchTo().window(window); break; } } // 验证新窗口内容 assertTrue(driver.getTitle().contains(站点首页)); // 关闭窗口并切换回主窗口 driver.close(); driver.switchTo().window(mainWindow); }6. 测试报告与问题定位6.1 失败截图机制通过TestWatcher扩展实现自动截图public class ScreenshotOnFailureExtension implements TestWatcher { private final WebDriver driver; public ScreenshotOnFailureExtension(WebDriver driver) { this.driver driver; } Override public void testFailed(ExtensionContext context, Throwable cause) { File screenshot ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); String testName context.getDisplayName(); try { Files.copy(screenshot.toPath(), new File(screenshots/ testName .png).toPath()); } catch (IOException e) { e.printStackTrace(); } } }6.2 日志记录策略集成Log4j2记录详细操作日志!-- log4j2.xml配置 -- Configuration Appenders File nameTestLog fileNamelogs/automation.log PatternLayout pattern%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n/ /File /Appenders Loggers Root leveldebug AppenderRef refTestLog/ /Root /Loggers /Configuration7. 持续集成集成方案7.1 Jenkins流水线配置示例Jenkinsfile配置pipeline { agent any stages { stage(Checkout) { steps { git url: https://github.com/your/repo.git } } stage(Test) { steps { sh mvn clean test } post { always { junit **/target/surefire-reports/*.xml archiveArtifacts screenshots/*.png } } } } }7.2 测试并行化方案利用JUnit 5的并行执行特性# junit-platform.properties junit.jupiter.execution.parallel.enabledtrue junit.jupiter.execution.parallel.mode.defaultconcurrent junit.jupiter.execution.parallel.config.strategyfixed junit.jupiter.execution.parallel.config.fixed.parallelism4

相关新闻

最新新闻

数据科学实战:从建模到论文,深圳杯数学建模竞赛A题全流程解析

数据科学实战:从建模到论文,深圳杯数学建模竞赛A题全流程解析

1. 项目概述:从数据到洞察,一次完整的数据科学实战复盘去年带队参加“深圳杯”数学建模挑战赛A题的经历,至今记忆犹新。题目“影响城市居民身体健康的因素分析”听起来宏大,但内核非常明确:它考察的是参赛者如何将现实…

2026/8/27 7:02:50
Agent长期记忆实战:用Mem0搭建跨会话智能助手

Agent长期记忆实战:用Mem0搭建跨会话智能助手

一个典型的尴尬场景:用户昨天刚在自动化助手对话中详细描述了自己的技术栈、希望每天几点收到日报、当前项目的核心指标。今天打开新会话,助手像第一次见面一样,把同样的问题又问了一遍。这类问题的根源不是模型不够聪明,而是 Age…

2026/8/27 7:02:50
AI虚假繁荣背后:大模型工程落地的真相与破局方法

AI虚假繁荣背后:大模型工程落地的真相与破局方法

最近两年,AI 圈时不时就会吵一轮“虚假繁荣”的话题:一边是融资新闻、产品发布、热词榜单刷屏,一边是很多开发者在真实项目里发现“大模型很强,但用不起来”。这种割裂感是真实存在的,它说明一个关键问题——AI 行业的…

2026/8/27 7:02:50
大模型长期记忆增强:原理、架构与最小实现

大模型长期记忆增强:原理、架构与最小实现

如果你正在开发基于大模型的应用,大概率已经撞到过这样一堵墙:用户明确说过“以后不要用专业术语回复我”,下一次提问时,模型照样抛出一堆术语;用户上次提到自己是项目负责人,这次继续追问时,模…

2026/8/27 7:02:49
092、批量输入事务(BDC)概述

092、批量输入事务(BDC)概述

092、批量输入事务(BDC)概述 那天半夜,用户打电话说MIGO收货批不了,几百条物料凭证卡在那边,一条条手工做要干到天亮。我远程一看,前台操作一切正常,但用户就是不想一条条点。那时候我脑子里第一个蹦出来的,不是LSMW,也不是Excel上传,而是BDC——Batch Data Communi…

2026/8/27 7:02:49
航拍滑坡泥石流检测数据集:VOC+YOLO双格式与YOLOv8实战

航拍滑坡泥石流检测数据集:VOC+YOLO双格式与YOLOv8实战

简介:在地质灾害识别与遥感影像目标检测领域,高质量标注数据是模型落地的关键前提。目标检测算法依赖统一的标注格式来描述目标位置,其中VOC格式采用绝对像素坐标,YOLO格式则使用归一化的中心点与宽高,两种格式各有适用…

2026/8/27 6:57:49