Selenium 4 + JUnit 5 自动化测试:JeeSite 内容管理模块 15 个功能点实战

📅 2026/7/11 22:07:03
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