在做 Web 自动化(Selenium、Playwright、Cypress 等)时,选择器就是我们与页面元素交流的“语言”。
选择器写得好,脚本稳如老狗;写得差,随便 UI 一改,测试全挂。
本文我们从 不同的选择方式 出发,聊聊各种 CSS 选择器的特性、优缺点,以及在自动化中的实战建议。
🗂️ 目录
1. ID 选择器 —— 优先选用的“身份证”
- 语法:
#id
示例:
#login-button
Selenium (Java) 用法:
WebElement btn = driver.findElement(By.cssSelector("#login-button"));
✅ 优点:唯一、性能最好、代码最清晰
⚠️ 缺点:部分项目 ID 不稳定(动态生成)
👉 建议:如果 ID 稳定,那它就是首选。
2. 类选择器 —— 最常见的“标签”
- 语法:
.class
示例:
.btn-primary
Java 代码:
WebElement btn = driver.findElement(By.cssSelector(".btn-primary"));
✅ 优点:常用,书写方便
⚠️ 缺点:class 可能跟样式走,不一定唯一
👉 建议:结合其他属性保证唯一性。
3. 属性选择器 —— 最灵活的方式
- 常见写法:
[name='q']
[data-test='login']
[class^='btn-'] /* 前缀 */
[class$='-error'] /* 后缀 */
[class*='active'] /* 包含 */
示例(Java):
WebElement input = driver.findElement(By.cssSelector("input[name='q']"));
✅ 优点:支持自定义属性,推荐使用 data-test、data-qa
⚠️ 缺点:动态值容易导致失效
👉 建议:和前端约定 data-test 属性,选择器就稳。
4. 层级与组合选择器 —— 结构化定位
- 后代:
div p - 子元素:
ul > li - 相邻兄弟:
h1 + p - 通用兄弟:
h1 ~ p
示例:
WebElement item = driver.findElement(By.cssSelector("ul#menu > li.active > a"));
✅ 优点:表达层级关系清晰
⚠️ 缺点:DOM 一改动,脚本就挂
👉 建议:避免太深的嵌套选择器。
5. 伪类选择器 —— “结构位置”的利器
常见语法:
:first-child
:last-child
:nth-child(n)
:nth-of-type(n)
:not(selector)
示例:
WebElement firstRow = driver.findElement(By.cssSelector("table tr:nth-child(1)"));
✅ 优点:方便定位第几个元素
⚠️ 缺点:依赖顺序,容易变动
👉 建议:只在没有稳定属性时使用。
6. Level 4 新选择器 —— 更强大的工具箱
现代浏览器支持的语法:
:is(button, a)[data-action='submit']
:where(.nav, .menu)
:not(.disabled)
div:has(> input[type='checkbox'])
✅ 优点:写法更简洁,功能更强大
⚠️ 缺点:浏览器/驱动兼容性需要确认
7. 通配符选择器 —— 不推荐的“核弹”
- 语法:
* - 示例:
div *
⚠️ 缺点:性能差,匹配过多元素
👉 建议:仅用于调试。
8. 自动化中的选择器实战建议
-
优先级排序
data-test 属性 > id > class/属性选择器 > 层级关系 > nth-child > 通配符 -
避免 fragile 选择器
- 长链式 DOM 路径
- 动态 class/id
- nth-child 硬编码
-
调试技巧
在 Chrome 控制台用:document.querySelector('selector')
总结
在 Web 自动化中,选择器的写法决定了用例的稳定性:
- ID / data-test 属性 → 稳定可靠 ✅
- Class / 属性选择器 → 灵活常用 🛠️
- 层级 / 伪类选择器 → 谨慎使用 ⚠️
- Level 4 新语法 → 现代项目利器 🚀
写选择器就像打磨武器,越锋利,自动化测试越有战斗力。
729

被折叠的 条评论
为什么被折叠?



