用途:在 Spock 框架下编写 Geb 浏览器自动化测试,并在生成、修复或评审测试时遵循其中级最佳实践。Geb 文档位于 https://groovy.apache.org/geb/manual/current/。
主要能力与原则:始终使用 Page Objects,不在 spec 内联选择器;每个 Page Object 必须声明静态 at 检查器;优先 CSS 选择器而非 XPath,避免脆弱的 nth-child 和基于位置的选择器;动态内容显式使用 waitFor,禁止 Thread.sleep;优先把 waitFor 调用封装进继承 geb.Page、geb.Module 等的方法中以便复用;使用 GebReportingSpec 而非 GebSpec,以便失败时截图;spec 用 given/when/then 块,每个 feature 方法一个行为,多步旅程可含多组 when/then;重复出现的 UI 组件(导航栏、模态框、表单行)用 Module 封装。
文件结构:spec 含 package、import geb.spock.GebReportingSpec 及页面类,仅在步骤真正相互依赖时使用 @Stepwise。Page Object 含 static at、static url 和 static content 的 DSL。Module 用于跨页面重复组件。
waitFor:可等待元素出现、指定超时秒数、返回元素,或在 content DSL 中声明 wait: true。若超时持续,应检查断言最终是否为真、页面是否尽快完成工作,或在 GebConfig.groovy 中增大超时,而非 sleep。
常见模式:检查列表项、填写表单(value)、处理非原生 JS 下拉、通过 at 和 currentUrl 断言导航。
应避免:滥用 @Stepwise、在 when 块内写断言、任何 sleep、硬编码绝对 URL、在 spec 中直接访问 DOM、过度使用 required: false。
防不稳定:在 setup() 中引入网络延迟(如 browser.networkLatency = java.time.Duration.ofMillis(500))并多次重跑;使用 RepeatUntilFailure 的 maxAttempts 本地重复运行验证一致性。