AI 辅助编程实现了简易版的UI automation Test 📅 2026/8/7 8:03:26 前言借助 AI 快速构建质量中台框架为了偷懒全程用deepseek 先丢给它一个提示语请帮我生成一份质量中台的需求文档然后它帮我生成了需求jdk用的是11 开源版所以相对应的其他jar也得降版本。第二个提示语 需要兼容jmeter selenium第三个提示语framework 底层接收selenium webdriver 抛出的异常。第三个提示语我想对https://xxxx/login进行UI自动化测试使用selenium webdriver page object 分层概念代码中将数据、页面元素和业务逻辑都分开。公司电脑和网络受限制JDK 用的是 11 开源版所以相对应的其他 jar 也得降版本。1. 核心需求与兼容性第二个提示语需要兼容 JMeter、Selenium。第三个提示语Framework 底层接收 Selenium WebDriver 抛出的异常。2. 异常容错与自愈机制Selenium WebDriver 专项2.1 设计目标目标说明屏蔽噪音将 WebDriver 原生冗长的堆栈信息转化为业务可读的“失败原因标签”智能重试区分“环境抖动”与“业务 Bug”对不同类型异常采取差异化重试策略现场保留任何异常发生时必须保留页面源码HTML、截图、DOM 快照供离线分析资源兜底确保无论抛出何种异常WebDriver 实例均能被正确关闭防止内存泄露2.2 异常分类与映射表WebDriver 异常 → 中台内部错误码Framework 底层需对org.openqa.selenium包下的核心异常进行统一拦截转换为内部标准化错误码便于上层展示及决策。Selenium 原生异常中台错误码错误标签是否自动重试重试策略NoSuchElementExceptionUI_ELEM_NOT_FOUND元素未找到✅ 是仅 1 次等待 5s 后刷新 DOM 再查找一次TimeoutExceptionUI_TIMEOUT等待超时❌ 否直接失败标记为“环境或性能问题”StaleElementReferenceExceptionUI_STALE_ELEM陈旧元素引用✅ 是最多 3 次重新获取 WebElement 并重试操作NoSuchFrameExceptionUI_FRAME_NOT_FOUNDFrame 切换失败❌ 否打印当前所有 Frame 树结构后失败NoAlertPresentExceptionUI_ALERT_NOT_FOUND弹窗不存在❌ 否失败建议业务方增加显式等待UnhandledAlertExceptionUI_UNHANDLED_ALERT未处理的弹窗✅ 是1 次自动 Dismiss 弹窗后重试WebDriverException网络层UI_DRIVER_CONN_LOST驱动连接断开✅ 是最多 3 次指数退避重连1s, 2s, 4sInvalidSessionIdExceptionUI_SESSION_EXPIREDSession 失效/过期✅ 是1 次重新创建 Driver 实例JavascriptExceptionUI_JS_ERRORJS 执行错误❌ 否记录 JS 错误栈直接失败ElementNotInteractableExceptionUI_ELEM_NOT_ACTIVE元素不可交互✅ 是2 次先执行scrollIntoViewmoveToElement再尝试ElementClickInterceptedExceptionUI_CLICK_INTERCEPTED点击被遮挡✅ 是2 次关闭遮挡层如弹窗/浮层后重试SessionNotCreatedExceptionUI_SESSION_CREATE_FAIL浏览器启动失败❌ 否直接终止任务告警运维检查执行机2.3 异常处理流程全局兜底拦截器Framework 底层需提供一个全局异常拦截器Global Exception Handler所有 WebDriver 操作均需通过该拦截器进行代理包装。执行流程时序1. 业务脚本调用 driver.findElement() / click() / getText() 等 ↓ 2. 拦截器捕获任意 WebDriverException ↓ 3. 判断异常类型映射为内部错误码见上表 ↓ 4. 根据“是否自动重试”标志决策 ├── 若允许重试 → 执行相应重试策略 → 重试成功则返回结果重试失败则进入步骤5 └── 若不允许重试 → 直接进入步骤5 ↓ 5. 执行“现场保留”操作截图、HTML 源码、页面 URL、当前窗口句柄 ↓ 6. 打印结构化错误日志JSON 格式包含错误码、错误标签、操作类型、元素定位表达式、当前页面 URL ↓ 7. 抛出中台封装的统一异常BizException携带错误码和现场附件路径 ↓ 8. AfterMethod / AfterClass 钩子中强制销毁 WebDriver 实例driver.quit()2.4 现场保留Crash Dump规范当异常发生且无法通过重试恢复时中台必须自动保存以下四类现场数据并关联至测试报告产物类型文件命名规则存储路径用途浏览器截图{caseId}_{timestamp}_screenshot.png/artifacts/screenshots/快速定位视觉异常页面 HTML 源码{caseId}_{timestamp}_pageSource.html/artifacts/html/分析 DOM 结构与元素层级浏览器 Console 日志{caseId}_{timestamp}_console.log/artifacts/logs/排查前端 JS 报错当前元素定位上下文{caseId}_{timestamp}_locator.json/artifacts/locators/记录失败时的 xpath/cssSelector 及其父级层级2.5 重试机制的细化规则防雪崩为避免无限制重试导致任务耗时过长需设定以下全局约束参数项默认值说明单用例最大重试次数3 次超过后直接标记为失败全局重试总耗时上限60 秒包括等待时间超时则终止重试重试间隔策略指数退避1s → 2s → 4s避免高频重试加重服务器负担可重试异常白名单仅上述表格标记“✅”的异常其他异常一律不重试直接失败2.6 日志输出规范供运维/SRE 排查异常日志必须采用结构化格式JSON便于接入 ELK 日志平台{ level: ERROR, timestamp: 2026-08-03T14:32:01.123Z, service: quality-mesh-framework, caseId: TC_ORDER_001, taskId: TASK_20260803_001, errorCode: UI_ELEM_NOT_FOUND, errorLabel: 元素未找到, driverType: ChromeHeadless, sessionId: abc123-def456, locator: //button[idsubmit], pageUrl: https://xxx.com/order/confirm, stackTrace: org.openqa.selenium.NoSuchElementException: ..., retryCount: 2, artifacts: { screenshot: /artifacts/screenshots/TC_ORDER_001_20260803_143201.png, pageSource: /artifacts/html/TC_ORDER_001_20260803_143201.html } }2.7 业务侧使用规范对测试脚本开发者的约束为保证 Framework 底层异常处理机制生效需对脚本编写做出以下约定约定项要求违规后果禁止捕获吞异常脚本中禁止使用try-catch捕获 WebDriverException 后不抛出中台无法感知异常导致误判为通过使用统一封装 API必须继承中台提供的BasePage/BaseTest类使用click()、input()等封装方法原生方法无法触发拦截器显式等待规范推荐使用ExpectedConditions中台会自动兜底pageLoadTimeout无强制约束但建议遵守元素定位表达式必须同时提供xpath和cssSelector中台会缓存备用定位策略若主定位失败且无备选重试机制可能无效3. 补充时序图异常处理全链路4. 代码框架生成4.1 提示词与生成结果提示词帮我直接生成 framework 的代码框架全局异常拦截器。生成Framework 底层完整的代码框架包含全局异常拦截器、异常分类映射、重试机制和现场保留功能。基于Java TestNG Selenium技术栈采用责任链模式和装饰器模式设计。quality-mesh-framework/ ├── src/main/java/com/qualitymesh/framework/ │ ├── core/ │ │ ├── driver/ │ │ │ ├── DriverManager.java // WebDriver 管理器 │ │ │ ├── DriverFactory.java // Driver 创建工厂 │ │ │ └── BrowserType.java // 浏览器类型枚举 │ │ ├── exception/ │ │ │ ├── QualityMeshException.java // 中台统一异常 │ │ │ ├── ErrorCode.java // 错误码枚举 │ │ │ └── ErrorLabel.java // 错误标签枚举 │ │ ├── interceptor/ │ │ │ ├── WebDriverInterceptor.java // 全局拦截器核心 │ │ │ ├── RetryHandler.java // 重试处理器 │ │ │ └── ExceptionMapper.java // 异常映射器 │ │ ├── listener/ │ │ │ ├── TestNGListener.java // TestNG 监听器 │ │ │ └── ScreenshotListener.java // 截图监听器 │ │ └── context/ │ │ ├── ExecutionContext.java // 执行上下文 │ │ └── ArtifactStorage.java // 产物存储 │ ├── page/ │ │ └── BasePage