优先使用id定位,因其唯一、快速且稳定;xpath因需遍历dom树而较慢且易受结构变动影响;class name仅支持单个类名,多类名须用css选择器;//为全局搜索易误匹配,/为绝对路径易失效;link text对可见文本大小写敏感且不识别属性值。

能直接用 By.id 就别绕路写 XPath —— 大多数页面里,ID 是最稳、最快、最不容易出错的定位依据。
为什么优先用 ID 定位而不是 XPath
ID 在 HTML 规范中必须唯一,浏览器原生支持快速查找,Selenium 底层调用的就是 document.getElementById,性能远高于 XPath 解析。而 XPath 需要遍历 DOM 树,尤其带 // 的相对路径,在复杂页面里容易慢半拍,还容易因 DOM 结构微调就失效。
- 只要元素有稳定、不变的
id属性(比如<input id="login-username">),就直接用driver.find_element(By.ID, "login-username") - 遇到动态 ID(如
id="user-input-12345"),别硬写By.ID,改用By.XPATH配合contains(@id, "user-input")或starts-with(@id, "user-input") - 某些前端框架(如 React、Vue)会抹掉或不生成
id,这时才退到其他方式,不是“默认就该写 XPath”
class name 定位经常失败的真实原因
By.CLASS_NAME 只接受单个 class 名,且不支持空格分隔 —— 这是它被频繁误用的核心坑点。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- HTML 中
class="btn btn-primary js-submit"是三个 class,但By.CLASS_NAME("btn btn-primary")会报错Compound class names not permitted - 正确做法是只传一个:
By.CLASS_NAME("btn-primary"),前提是这个 class 在当前上下文里足够唯一 - 更稳妥的替代是 CSS 选择器:
By.CSS_SELECTOR(".btn.btn-primary"),它天然支持多 class 组合 - 如果 class 名含特殊字符(如连字符、下划线),记得加引号;CSS 选择器里写
.my-class-name没问题,但By.CLASS_NAME("my-class-name")会直接抛异常
XPath 里 // 和 / 的区别不是语法题,是稳定性问题
// 是全局搜索,/ 是严格路径 —— 前者灵活但易撞车,后者精确但脆。
-
//button[@type='submit']可能匹配到页脚的“重置”按钮,而非表单里的“提交”按钮 -
/html/body/div[2]/form/button看似精准,但只要页面加了个 banner 或调整了 div 层级,就立刻失效 - 真正实用的写法是混合路径:
//form[@id='login-form']//button[@type='submit'],先锚定父容器再找子元素 - 避免用
[1]、[2]这类索引定位,除非你确认该位置永远不变;DOM 插入新节点、异步加载都可能让序号偏移
Link Text 定位只适用于可见文本,且大小写敏感
它匹配的是 a 标签内肉眼可见的字符串,不是 href 或 title 属性值。
-
By.LINK_TEXT("登录")只能匹配<a>登录</a>,对<a title="登录">Sign In</a>完全无效 -
By.PARTIAL_LINK_TEXT("登")能匹配 “登录”“登出”“用户登录中心”,容易误命中 - 中文空格、全角/半角符号、换行符都会破坏匹配 —— 比如
<a>登 录</a>中的 会让LINK_TEXT找不到 - 更鲁棒的方式是用 CSS 或 XPath:
By.CSS_SELECTOR("a[href='/login']")或By.XPATH("//a[contains(@href, 'login')]")
真实项目里,90% 的定位失败不是因为不会写 XPath,而是没看清元素是否真有稳定 ID、class 是否被复用、链接文本是否被 JS 动态渲染 —— 先 inspect 元素,再决定用什么方式,比背语法重要得多。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










