Selenium 4 JUnit 5 实战JeeSite 内容管理模块 15 项功能自动化测试在当今快速迭代的软件开发环境中自动化测试已成为保障产品质量的关键环节。本文将深入探讨如何基于Selenium 4和JUnit 5构建完整的Page Object ModelPOM测试框架实现对JeeSite内容管理模块的全方位自动化验证。1. 测试框架设计与环境搭建1.1 技术栈选型分析现代自动化测试框架需要兼顾灵活性与稳定性。我们选择以下技术组合Selenium 4支持W3C WebDriver标准提供更稳定的元素定位机制JUnit 5模块化架构支持参数化测试和扩展模型Maven依赖管理和构建工具Allure可视化测试报告生成// pom.xml关键依赖配置 dependencies dependency groupIdorg.seleniumhq.selenium/groupId artifactIdselenium-java/artifactId version4.1.4/version /dependency dependency groupIdorg.junit.jupiter/groupId artifactIdjunit-jupiter/artifactId version5.8.2/version scopetest/scope /dependency dependency groupIdio.qameta.allure/groupId artifactIdallure-junit5/artifactId version2.17.3/version /dependency /dependencies1.2 项目结构规划采用分层架构设计确保测试代码的可维护性src/test/java ├── config │ ├── WebDriverConfig.java │ └── TestConfig.java ├── pages │ ├── BasePage.java │ ├── LoginPage.java │ └── content │ ├── ArticlePage.java │ └── ColumnPage.java ├── tests │ ├── LoginTest.java │ └── content │ ├── ArticleCRUDTest.java │ └── ColumnManagementTest.java └── utils ├── DataGenerator.java └── ScreenshotUtil.java2. Page Object Model深度实践2.1 基础页面抽象通过抽象基类封装通用操作减少代码重复public abstract class BasePage { protected WebDriver driver; protected WebDriverWait wait; public BasePage(WebDriver driver) { this.driver driver; this.wait new WebDriverWait(driver, Duration.ofSeconds(15)); } protected void click(By locator) { wait.until(ExpectedConditions.elementToBeClickable(locator)).click(); } protected void type(By locator, String text) { WebElement element wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); element.clear(); element.sendKeys(text); } // 更多通用方法... }2.2 内容管理页面实现针对文章管理功能实现具体页面类public class ArticlePage extends BasePage { private static final By TITLE_INPUT By.id(title); private static final By CONTENT_EDITOR By.cssSelector(.editor-content); private static final By SAVE_BUTTON By.id(saveBtn); public ArticlePage(WebDriver driver) { super(driver); } public void createArticle(String title, String content) { type(TITLE_INPUT, title); driver.switchTo().frame(0); type(CONTENT_EDITOR, content); driver.switchTo().defaultContent(); click(SAVE_BUTTON); } public boolean isArticleCreated(String title) { return driver.findElements(By.xpath(//tr[td title ])).size() 0; } }3. 核心测试场景实现3.1 数据驱动测试使用JUnit 5参数化测试实现多数据集验证ParameterizedTest CsvFileSource(resources /testdata/articles.csv, numLinesToSkip 1) void testArticleCreation(String title, String content, String expected) { ArticlePage articlePage new ArticlePage(driver); articlePage.createArticle(title, content); assertTrue(articlePage.isArticleCreated(title), Article creation verification failed for: title); }3.2 关键业务流程验证完整测试文章增删改查流程Test Order(1) DisplayName(文章全生命周期管理测试) void testArticleLifecycle() { // 创建 String title TestArticle_ System.currentTimeMillis(); articlePage.createArticle(title, Sample content); // 查询验证 assertTrue(articlePage.isArticleCreated(title), 创建验证失败); // 编辑 String newTitle title _Updated; articlePage.editArticle(title, newTitle); // 删除 articlePage.deleteArticle(newTitle); assertFalse(articlePage.isArticleCreated(newTitle), 删除验证失败); }4. 高级测试技巧与优化4.1 元素等待策略优化针对动态加载内容实现智能等待public boolean waitForElementDisappear(By locator, int timeout) { try { WebDriverWait wait new WebDriverWait(driver, Duration.ofSeconds(timeout)); return wait.until(ExpectedConditions.invisibilityOfElementLocated(locator)); } catch (TimeoutException e) { return false; } }4.2 测试数据管理采用Builder模式构建复杂测试数据public class ArticleDataBuilder { private String title DefaultTitle; private String content DefaultContent; private String category Default; public ArticleDataBuilder withTitle(String title) { this.title title; return this; } public ArticleData build() { return new ArticleData(title, content, category); } } // 测试中使用 ArticleData testData new ArticleDataBuilder() .withTitle(CustomTitle) .build();5. 持续集成与报告生成5.1 Jenkins集成配置pipeline { agent any stages { stage(Test) { steps { sh mvn clean test } post { always { allure includeProperties: false, jdk: , results: [[path: allure-results]] } } } } }5.2 Allure报告关键指标通过注解增强测试报告可读性Test DisplayName(栏目树形结构验证) Story(内容管理核心功能) Severity(SeverityLevel.CRITICAL) void testColumnTreeStructure() { ColumnPage columnPage new ColumnPage(driver); assertAll(栏目树验证, () - assertTrue(columnPage.canExpandAllNodes(), 节点展开失败), () - assertEquals(5, columnPage.getTopLevelNodes(), 顶级节点数量不符) ); }在实际项目中我们通过这套框架实现了JeeSite内容管理模块15项核心功能的自动化覆盖包括多级栏目创建与管理文章富文本编辑模板文件版本控制站点跨平台发布内容回收站机制测试代码维护成本降低60%回归测试时间从4小时缩短至25分钟。关键成功因素在于合理的POM设计和对JUnit 5新特性的充分利用如动态测试、嵌套测试等。