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

相关新闻

最新新闻

终极字体资源库:15款专业字体一站式获取指南

终极字体资源库:15款专业字体一站式获取指南

终极字体资源库:15款专业字体一站式获取指南 【免费下载链接】fonts My favorite fonts: SF Pro Text, Pingfang SC, Avenir Next, Roboto, Uber and more. 项目地址: https://gitcode.com/gh_mirrors/font/fonts 还在为设计项目寻找合适的字体而烦恼吗&…

2026/7/12 0:17:20
ChatGPT创意写作提示词终极矩阵(2024Q2更新):覆盖12大垂直领域、47种文体、9类受众心智模型的即插即用指令集

ChatGPT创意写作提示词终极矩阵(2024Q2更新):覆盖12大垂直领域、47种文体、9类受众心智模型的即插即用指令集

更多请点击: https://kaifayun.com 第一章:ChatGPT创意写作提示词的底层逻辑与范式演进 创意写作提示词并非简单指令堆砌,而是人机协同认知建模的语言接口。其底层逻辑根植于大语言模型的三重机制:上下文感知的注意力权重分配、…

2026/7/12 0:17:20
企业决策者建立研发体系的真正价值——从“被动防御稽查”到“主动构建增长引擎”

企业决策者建立研发体系的真正价值——从“被动防御稽查”到“主动构建增长引擎”

企业决策者建立研发体系的真正价值——从“被动防御稽查”到“主动构建增长引擎”一套好的研发体系,既能让你“不被查”,更能让你“赚更多”一、为什么你的研发投入没有带来增长?很多企业决策者面临一个共同的困惑:研发费用年年涨…

2026/7/12 0:17:20
高企税务稽查常态下,研发体系中技术人员与财务人员的责任分配

高企税务稽查常态下,研发体系中技术人员与财务人员的责任分配

高企税务稽查常态下,研发体系中技术人员与财务人员的责任分配研发合规不是财务的“独角戏”,也不是技术的“甩手掌柜”一、一个普遍的认知误区很多企业认为:研发合规是财务部门的事——财务负责归集费用、填报数据、应对税务稽查,…

2026/7/12 0:17:20
高企税务稽查常态下,研发体系如何从“被动应对”转向“主动防御”?

高企税务稽查常态下,研发体系如何从“被动应对”转向“主动防御”?

高企税务稽查常态下,研发体系如何从“被动应对”转向“主动防御”?一、研发人员的身份危机2025年,陕西一家煤矿企业被税务稽查,原因出人意料:申报的70名研发人员中,有13人是会计和后勤人员。12个研发项目全…

2026/7/12 0:17:20
当目标停留在抽象层时,大脑无法生成具体的运动计划

当目标停留在抽象层时,大脑无法生成具体的运动计划

第一层:神经基底——语义区与运动区的物理隔离(Semantic-Motor Disconnect) 这是问题的“硬件架构”,解释了为什么抽象目标无法直接驱动身体。脑区功能的特异性分工: 本质: 前额叶皮层(PFC&…

2026/7/12 0:12:20

月新闻