系统学习 ID / Name / Class / Tag / Link / XPath / CSS 七种定位方式,一页掌握 Selenium 元素定位核心技能
本页面整合了属性定位、标签定位、链接定位、XPath 定位和 CSS 选择器定位的全部核心教学内容。每种定位方式都配有:定位语法说明、代码示例、可交互的练习区域。建议按顺序学习,从简单到复杂。
driver.find_element(By.ID, "user_account")(匹配第一个ID属性为user_account的元素)driver.find_element(By.ID, "btn_id_submit")(匹配第一个ID属性为btn_id_submit的元素)driver.find_elements(By.ID, "repeated_field")(理论上 ID 应唯一,不建议)driver.find_element(By.NAME, "login_name")(匹配第一个name属性为login_name的元素)driver.find_element(By.NAME, "csrf_token")(匹配第一个name属性为csrf_token的元素)driver.find_elements(By.NAME, "hobby")(获取所有name属性为hobby的元素)driver.find_element(By.CLASS_NAME, "card-item")(匹配第一个class属性为card-item的元素)driver.find_element(By.CLASS_NAME, "primary-btn")(匹配第一个class属性为primary-btn的元素)driver.find_elements(By.CLASS_NAME, "card-item")(获取所有class属性为card-item的元素)driver.find_elements(By.CLASS_NAME, "badge")(获取所有class属性为badge的元素)
以下元素带有 demo- 前缀 class,与下方 demo-box 的 card-item / input-text / action-btn 完全隔离。
| 定位方式 | 适用场景 | 优点 | 注意事项 |
|---|---|---|---|
| By.ID | 元素具有唯一 id | 最快最稳定,优先使用 | id 必须唯一,动态 id 不适用 |
| By.NAME | 表单元素有 name 属性 | 常用于输入框/单选/复选 | 可能不唯一,需 find_elements |
| By.CLASS_NAME | 一组相同样式的元素 | 批量定位同类元素方便 | 只能传单个 class,不能有空格 |
driver.find_element(By.TAG_NAME, "h1")(匹配第一个h1标签元素)driver.find_element(By.TAG_NAME, "title")(匹配第一个title标签元素)driver.find_elements(By.TAG_NAME, "a")(获取所有a标签元素)driver.find_elements(By.TAG_NAME, "input")(获取所有input标签元素)driver.find_elements(By.TAG_NAME, "li")(获取所有li标签元素)这是练习区第一段 p 元素。
这是练习区第二段 p 元素。
H1 - 一级标题
H2 - 二级标题
H3 - 三级标题
段落 1:第一个 p 标签,可用 find_element 定位或者用 find_elements 获取列表加上索引 0 定位。
段落 2:第二个 p 标签,可用 find_elements 获取列表加上索引 1 定位。
段落 3:第三个 p 标签,可用 find_elements 获取列表加上索引 2 定位。
| 序号 | 课程名称 | 标签名 | 说明 |
|---|---|---|---|
| 1 | Selenium 基础 | tr / td | 表格行与单元格 |
| 2 | 元素定位 | tr / td | 用 XPath 定位表格 |
| 3 | 元素操作 | tr / td | 表格操作场景 |
find_elements() 返回列表。driver.find_element(By.LINK_TEXT, "返回首页")(匹配第一个"返回首页"链接)driver.find_element(By.LINK_TEXT, "Selenium 官方文档")(匹配第一个"Selenium 官方文档"链接)driver.find_elements(By.LINK_TEXT, "点击查看")(获取所有"点击查看"链接元素)driver.find_element(By.PARTIAL_LINK_TEXT, "关于")(匹配第一个包含"关于"的链接)driver.find_element(By.PARTIAL_LINK_TEXT, "教程")(匹配第一个包含"教程"的链接)driver.find_elements(By.PARTIAL_LINK_TEXT, "帮助")(获取所有含"帮助"的链接元素)driver.find_elements(By.PARTIAL_LINK_TEXT, "文档")(获取所有含"文档"的链接元素)下方导航栏包含多个链接,使用 PARTIAL_LINK_TEXT 可模糊匹配:
教程类链接(用"教程"可匹配全部):
<a> 标签,其他标签需用 XPath 或 CSS。driver.find_element(By.XPATH, "/html/body/div[1]/header/h1")(绝对路径(从根节点开始))driver.find_element(By.XPATH, "//input[2]")(元素索引,从 1 开始)driver.find_element(By.XPATH, "//input[@id='userName']")(属性)driver.find_element(By.XPATH, "//input[starts-with(@type,'pass')]") (模糊属性值)driver.find_element(By.XPATH, "//div[contains(@class,'demo')]")(模糊属性值,包含属性匹配)driver.find_element(By.XPATH, "//button[normalize-space()='提交表单']")(文本精确匹配)driver.find_element(By.XPATH, "//div[@class='form-grid']/div[last()]")(函数条件匹配)driver.find_element(By.XPATH, "//*[@name='email' and @type='text']")(逻辑运算符,多属性组合)driver.find_element(By.XPATH, "//form[@id='xpathForm']/following-sibling::div/button")(轴定位)driver.find_elements(By.XPATH, "/html/body/div[1]/header/h1")(绝对路径(从根节点开始))driver.find_elements(By.XPATH, "//input[2]")(元素索引,从 1 开始)driver.find_elements(By.XPATH, "//input[@id='userName']")(属性)driver.find_elements(By.XPATH, "//input[starts-with(@type,'pass')]") (模糊属性值)driver.find_elements(By.XPATH, "//div[contains(@class,'demo')]")(模糊属性值,包含属性匹配)driver.find_elements(By.XPATH, "//button[normalize-space()='提交表单']")(文本精确匹配)driver.find_elements(By.XPATH, "//div[@class='form-grid']/div[last()]")(函数条件匹配)driver.find_elements(By.XPATH, "//*[@name='email' and @type='text']")(逻辑运算符,多属性组合)driver.find_elements(By.XPATH, "//form[@id='xpathForm']/following-sibling::div/button")(轴定位)@id/@name/@class/@type 等属性,多属性 and 更稳定。text()='xxx' 或 contains(text(),'xxx')。(//...)[n],XPath 下标从 1 开始。driver.find_element(By.CSS_SELECTOR, "html body div.container div.product-list div.product-card") (绝对路径)driver.find_element(By.CSS_SELECTOR, "#userName") (id 选择器)driver.find_elements(By.CSS_SELECTOR, ".product-card") (class 选择器)driver.find_element(By.CSS_SELECTOR, "input[name='email']") (属性选择器)driver.find_element(By.CSS_SELECTOR, "input[name]") (属性名称选择器)driver.find_element(By.CSS_SELECTOR, "a[href*='selenium']") (部分属性值选择器)driver.find_element(By.CSS_SELECTOR, "a") (标签名选择器)driver.find_element(By.CSS_SELECTOR, ".product-card:nth-child(3)") (伪类选择器)driver.find_element(By.CSS_SELECTOR, "div.product-list > div.product-card") (父子层级)driver.find_elements(By.CSS_SELECTOR, "html body div.container div.product-list div.product-card") (绝对路径)driver.find_elements(By.CSS_SELECTOR, "#userName") (id 选择器)driver.find_elements(By.CSS_SELECTOR, ".product-card") (class 选择器)driver.find_elements(By.CSS_SELECTOR, "input[name='email']") (属性选择器)driver.find_elements(By.CSS_SELECTOR, "input[name]") (属性名称选择器)driver.find_elements(By.CSS_SELECTOR, "a[href*='selenium']") (部分属性值选择器,href 以 https 开头)driver.find_elements(By.CSS_SELECTOR, "a") (标签名选择器)driver.find_elements(By.CSS_SELECTOR, ".product-card:nth-child(3)") (伪类选择器)driver.find_elements(By.CSS_SELECTOR, "div.product-list > div.product-card") (父子层级)#idValue,比 XPath 更简洁。.product-card.featured 同时包含两个 class。[attr='val'] 完全等于,[attr*='val'] 包含,[attr^='pre'] 开头。driver.execute_script("return document.getElementById('demo-js-username');") (getElementById)driver.execute_script("return document.getElementsByName('demo-js-input')[0];") (getElementsByName)driver.execute_script("return document.getElementsByClassName('demo-js-btn')[0];") (getElementsByClassName)driver.execute_script("return document.getElementsByTagName('button')[0];") (getElementsByTagName)driver.execute_script("return document.querySelector('.demo-js-card');") (querySelector)driver.execute_script("return document.querySelectorAll('.demo-js-card');") (querySelectorAll)document.getElementById('id'),返回单个元素,速度最快。document.querySelector('.cls'),CSS 选择器语法,返回首个匹配。document.querySelectorAll('.cls'),返回 NodeList,需 list() 转换。arguments[0],向 execute_script 传递已定位的 WebElement。.value = '...',绕过 send_keys 直接注入值。| 定位方式 | 语法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| By.ID | By.ID | 元素有唯一 id | 最快最稳定 | id 必须唯一 |
| By.NAME | By.NAME | 表单元素 | 表单常用 | 可能不唯一 |
| By.CLASS_NAME | By.CLASS_NAME | 同类元素批量 | 批量定位方便 | 只能单个 class |
| By.TAG_NAME | By.TAG_NAME | 按标签名获取 | 获取同类元素 | 过于宽泛 |
| By.LINK_TEXT | By.LINK_TEXT | a 链接完整文本 | 精准匹配 | 仅 a 标签 |
| By.PARTIAL_LINK_TEXT | By.PARTIAL_LINK_TEXT | a 链接部分文本 | 灵活模糊 | 仅 a 标签 |
| By.XPATH | By.XPATH | 任何复杂结构 | 功能最强大 | 语法稍复杂 |
| By.CSS_SELECTOR | By.CSS_SELECTOR | 任何元素 | 简洁快速 | 部分高级功能不支持 |
| execute_script | driver.execute_script | 特殊场景(Shadow DOM / iframe / 动态属性) | 浏览器原生 API,灵活强大 | 可读性差,调试不便 |