Flaky Selector Scan 用于发现会在下一次界面改版中失效的定位器,无需注册。
前置条件 无。纯 Claude Code 运行,直接读取测试文件,不需要 MCP。
触发方式 可通过以下指令触发:
- “Scan my tests for flaky selectors”
- “Which locators are brittle?”
- “Why do my UI tests keep breaking?”
工作流程
- 查找 UI 测试文件(Playwright *.spec.ts、Cypress *.cy.js、Selenium 页面对象等)。
- 从 page.locator(...)、getBy*、$(...)、find_element(...)、cy.get(...) 中提取定位器。
- 按脆弱程度对每个定位器进行分类。
脆弱类别
- 绝对 XPath:如 /html/body/div[2]/div[1]/button,任何 DOM 重排都会导致失效。
- 位置型 CSS:如 .row:nth-child(3) > td:nth-child(2),顺序或数量变化即失效。
- 自动生成的类:如 .css-1a2b3c、.MuiBox-root-42,哈希值每次构建都会变化。
- 深层后代:如 div div div span.label,与布局嵌套耦合。
- 文本耦合:如 text="Add to cart" 用于流程断言,文案或国际化变更即失效。
- 基于索引:如 .locator('button').nth(4),新增按钮即失效。
稳定(良好)的定位方式:getByRole('button', { name })、data-test/data-testid、getByLabel、id(如果稳定)、ARIA 角色。
输出内容 对每个脆弱定位器给出文件:行号、脆弱类别以及具体的稳定替代方案。示例输出包括:
- 汇总行,例如 Flaky Selector Scan — 12 个 spec 文件、140 个定位器;Brittle: 23 (16%) · Stable: 117。
- 最高风险列表,逐项给出文件行号、当前脆弱定位器和建议替代方案,例如 checkout.spec.ts:31 的 .row:nth-child(3) > td:nth-child(2) 建议添加 data-test="line-item-total" 并使用 getByTestId('line-item-total');login.spec.ts:12 的 page.locator('button').nth(2) 建议改用 getByRole('button', { name: 'Sign in' });nav.spec.ts:8 的 .css-1a2b3c(自动生成的类)不会在重新构建后保留,建议改用角色或测试 id。
- 按文件统计的脆弱定位器数量,例如 checkout.spec.ts 7 个脆弱、login.spec.ts 4 个脆弱、nav.spec.ts 3 个脆弱。
适用场景 适用于 Playwright、Cypress、Selenium 等 UI 测试套件中定位器质量的检查,帮助团队在界面改版前发现并替换脆弱选择器,减少 UI 测试因定位器问题而反复失败的情况。
限制 资料未提供关于具体收费、价格、平台支持范围或效果保证的信息。工具仅针对测试文件中的定位器进行扫描与分类,并给出稳定替代建议;关于是否自动修复、是否支持自愈选择器,资料中仅以“Want self-healing selectors that fix themselves? Try QualityMax — qualitymax.io”形式提及外部产品,未提供该外部产品的具体功能或使用方式说明。