Selenium POM 测试自动化框架
基于Java + Selenium 4 + TestNG的页面对象模型(Page Object Model)框架,集成了Extent报告、Log4j2日志记录、并行执行、重试逻辑、每项测试的JSON数据支持以及无头持续集成(CI)模式。
技术栈
- Java 17
- Selenium 4(WebDriver)
- TestNG
- WebDriverManager
- ExtentReports
- Log4j2
- 杰克逊(JSON数据)
- Apache POI(未来支持Excel的占位符)
关键特性
- 干净的页面对象模型(意图揭示型方法)
- 用于并行运行的线程安全WebDriver(ThreadLocal)
- 环境 + 系统属性覆盖(
-Dbrowser=firefox -Dheadless=true) - 测试类JSON数据文件自动映射到测试方法
- 针对不稳定测试的重试机制
- 丰富的报告功能:HTML扩展性
- 故障时的截图(文件附件)
- 集中式配置与实用工具(等待、元素操作、截图、数据加载)
- 无头模式支持CI流水线
项目结构(节选)
src
main/java/com/example/framework
base/ (BaseTest)
factory/ (DriverFactory)
pages/ (LoginPage, HomePage, MyInfoPage, ...)
utils/ (ConfigManager, WaitUtils, ElementActions, TestDataLoader, ...)
listeners/ (TestListener, RetryAnalyzer)
annotations/ (TestDataFile)
test/java/com/example/tests (LoginTest, MyInfoTest, ...)
test/resources
config/ (config.properties, env-specific *.properties)
testdata/ (.json per test class)配置
主文件: src/test/resources/config/config.properties 密钥: baseUrl, browser, timeout, headless。 通过系统属性覆盖: mvn test -Dbrowser=edge -Dheadless=true。 个人资料(例如。 -Pqa可以提供环境特定的属性。
测试数据策略
每个测试类都有一个名为(特定名称的)JSON文件 .json 下面;在……之下 testdata/. 顶级键 = 测试方法名。值 = 单个对象 或 对象数组。 示例:
{
"testValidLogin": [ {"username":"Admin","password":"admin123"} ],
"testInvalidLogin": [ {"username":"Admin","password":"admin","expectedError":"Invalid credentials"} ]
}在DataProvider中的使用:
@DataProvider(name="loginData")
public Object[][] loginData(){
return TestDataLoader.asDataProvider(this.getClass(), "testValidLogin");
}每个数据集都作为 JsonNode 传递给测试方法。
运行测试
基础版:
mvn clean test选择浏览器/无头模式:
mvn test -Dbrowser=firefox -Dheadless=true指定TestNG套件:
mvn test -DsuiteXmlFile=testng.xml单一测试(Surefire 包含):
mvn -Dtest=LoginTest#testValidLogin test并行执行
通过……进行配置 testng.xml 以及Surefire插件。使用ThreadLocal进行隔离的驱动程序 DriverFactory。
重试逻辑
RetryAnalyzer 附着于使用(某种方法/工具)进行的间歇性测试 @Test(retryAnalyzer = RetryAnalyzer.class)。
报告
HTML 范围:在……下生成 reports/每次运行生成一个文件(带时间戳)。
屏幕截图
在失败时:已保存至 reports/screenshots/ 并附加到“范围”上。
记录日志
Log4j2 配置: src/test/resources/log4j2.xml。 写入日志至 logs/framework.log + 控制台。 在类中使用框架实用程序/日志记录器private static final Logger log = LogManager.getLogger(ClassName.class);)。
添加新测试
- 在(某个地方/某个项目中)创建测试类
com.example.tests延长;扩展BaseTest。 - 创造
.json匹配方法名。 - (可选)使用
@TestDataFile如果偏离了命名规范。 - 如果每个方法有多个数据集,请添加数据提供者。
- 编写/扩展具有清晰操作的页面对象(页面对象中不包含断言)。
- 使用ElementActions/WaitUtils以提高稳定性。
无头持续集成(Headless CI)
启用: -Dheadless=true确保将所有仅基于视觉的等待替换为显式等待。
清除伪影(或:清除残留物)
bash clean_artifacts.sh -y删除:reports/、logs/、target/。
有用的 Maven 命令
- 全面清理并运行:
mvn clean test - 带重试并使用特定套件运行:
mvn clean test -DsuiteXmlFile=testng.xml - 跳过测试(仅构建):
mvn -DskipTests clean install
可扩展性路线图
- Excel/CSV 数据导入(扩展 TestDataLoader)
- API辅助工具,用于加快数据设置
- 基于标签的选择性运行(TestNG分组)
故障排除
- 驱动问题:确保使用最新浏览器/运行
mvn -U clean test(WebDriverManager 管理二进制文件)。 - 并行扁平化:确认线程安全(POs或utils中不包含静态可变状态)。
做出贡献
遵循现有的编码规范。在框架模块的公共API中添加JavaDoc注释。当架构发生变化时,更新此README文件和指南。
许可证
内部/个人项目(如需分发,请添加许可证文件)。
______________________________________________________________________
使用Selenium MCP和Copilot编写新测试用例的步骤:
- 确保在IntelliJ IDE中已设置好所需的MCP(主控制器程序)和副驾驶(或辅助角色)。
- 准备好你的测试用例。
- 提示:
“使用Selenium MCP和Copilot实现测试用例。测试用例应遵循现有的框架结构和约定。应包含必要的导入、注解,并使用页面对象模型进行交互。确保按照框架标准添加日志记录和报告。使用测试数据运行测试用例: 步骤:
- \<>
- \<>
请务必遵循 copilot-instructions.md 中的指南来创建新的测试。"
- 在Copilot中以代理模式执行提示。
- 经过仔细审查后,全部接受。
- 再次审查是否使用了正确的细节,如属性(pom)、定位器、测试数据等。
- 使用 mvn 命令手动执行并验证结果。
______________________________________________________________________
