【python爬虫与自动化】selenium 元素定位器_selenium3 locator-CSDN博客
版权声明:本文为CSDN博主「景元元大猫猫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2301_81084742/article/details/149386160
【python爬虫与自动化】selenium 元素定位器
原创
已于 2025-07-17 09:40:42 修改
·
623 阅读
·
26
·
10
·
CC 4.0 BY-SA版权
文章标签:
selenium
测试工具
I. 引言
什么是元素定位器
在 Web 自动化测试(如 Selenium)中,元素定位器(Locator) 是用于在页面上唯一识别和定位 HTML 元素的机制。无论是输入框、按钮、链接还是复杂的动态组件,自动化脚本都需要通过定位器来找到目标元素,并执行点击、输入、读取等交互操作。
为什么需要元素定位器?
自动化交互:测试脚本需要精确找到页面元素才能模拟用户操作。
动态页面适配:现代 Web 应用(如单页应用 SPA)常动态渲染元素,稳定的定位策略至关重要。
可维护性:良好的定位策略能减少脚本因前端改动而失效的情况。
基本使用方式 – selenium
from selenium.webdriver.common.by import By
通过ID定位
element = driver.find_element(By.ID, “username”)
通过CSS选择器定位
submit_button = driver.find_element(By.CSS_SELECTOR, “button.submit”)
AI运行代码
python
目录
I. 引言
II. By.ID
- 定位外层工具栏
- 定位内部元素
III. By.XPATH
- 基本用法
- 绝对路径 vs 相对路径
- 常用符号组合
- 常用表达式
IV. By.CSS_SELECTOR
- 基本用法
- 基础选择器
- attribute属性选择器
- 层级关系
- 通配符:*
- 组合选择器
- 伪类选择器
- 常见表达式
II. By.ID
优点:唯一标识,定位最快
定位只依靠id唯一标识,无需区分内外部元素框架
- 定位外层工具栏
toolbar = driver.find_element(By.ID, “csdn-toolbar”)
AI运行代码
python
- 定位内部元素
inputbox = driver.find_elemenet(By.ID, ‘toolbar-search-input’)
AI运行代码
python
III. By.XPATH
- 基本用法
driver.find_elemenet(By.XPATH, xpath表达式)
AI运行代码
python
例子
driver.find_elemenet(By.XPATH, “//div[@class=’aClass’])”)
AI运行代码
python
- 绝对路径 vs 相对路径
绝对路径(完整路径)
当我们在开发者工具中复制xpath的时候,我们一定会发现这个xpath元素比较丑陋,直接将所有页面元素拼起来组成的。
/html/body/div/div[2]/div[1]/input
AI运行代码
python
试想,如果前端代码一有改动,那我们的xpath是不是全部都要变化。因此,相对路径更适合写在程序中。
相对路径
//input[@id=’toolbar-search-input’]
AI运行代码
python
//*[@id=”toolbar-search-input”]
AI运行代码
python
- 常用符号组合
3.1 斜杠://
// 是一个 缩写符号,表示 从当前节点开始,递归搜索所有子孙节点(即任意层级的后代)
在 Selenium WebDriver 中使用 XPath 时,以 // 开头的表达式会从 整个 HTML 文档的根节点(即 标签)开始递归搜索
对比 / 与 //
/ 表示 直接子节点(严格的一级层级关系)。
// 表示 任意深度的后代节点(无论嵌套多深)。
例子
AI运行代码
html
XPath 表达式 匹配的节点 说明
//input 所有 标签(#username 和 #pwd)
递归搜索整个文档中的 input,无论嵌套多深。
会把所有input标签都找出来
/html/body/div//input 所有 标签(#username 和 #pwd) 从绝对路径开始,但在 div 后使用 // 表示其所有后代中的 input。
//div[@id=’container’]//input 所有 标签(#username 和 #pwd) 先定位 id=”container” 的 div,再在其后代中找 input。
//form/input 仅匹配 #username input 必须是 form 的 直接子节点(因为用了单斜杠 /)。
3.2 通配符:‘ * ’
‘ * ’ 代表 任意 HTML 标签(如
、
、 等)。
它不关心具体的标签类型,只关注 属性条件(比如 @id=”toolbar-search-input”)
例子
精准匹配标签名
//input[@id=’toolbar-search-input’]
AI运行代码
python
仅匹配 标签且 id 为 toolbar-search-input 的元素。
通配符 ‘ * ’
//*[@id=”toolbar-search-input”]
AI运行代码
python
匹配 任何标签(、
、 等)中 id 为 toolbar-search-input 的元素
3.3 匹配元素属性:@
在 XPath 中,@ 表示 选择元素的属性,用于按属性值过滤元素。
标签名:tag
属性名:attribute
//标签名[@属性名=’属性值’]
AI运行代码
python
匹配id
driver.find_element(By.XPATH, ‘//input[@id=”username”]’)
AI运行代码
python
匹配class
driver.find_element(By.XPATH, ‘//button[contains(@class, “submit-btn”)]’)
AI运行代码
python
3.4 字符串匹配函数:contains()
判断一个字符串中是否包含目标片段,返回布尔值(true/false)
匹配属性名
contains(@属性名, ‘子字符串’)
AI运行代码
python
匹配文本内容
contains(text(), ‘文本片段’)
AI运行代码
python
注意: contains() 区分大小写(’Search’ ≠ ‘search’)
a. 匹配部分值
HTML 中 class 通常是多个值的组合(如 class=”btn btn-primary”),用 = 精确匹配会失败,此时需用 contains
例子:匹配所有 class 包含 btn-primary 的
class=”btn btn-primary”
//div[contains(@class, ‘btn-primary’)]
AI运行代码
python
对比精准匹配
遇到空格的时候,用‘ . ’ 代替空格
//div[@class = ‘btn.btn-primary’]
AI运行代码
python
b. 模糊匹配
匹配动态变化属性
若属性值的一部分是动态生成的(如 id=”user-12345″)
//*[contains(@id, ‘user-‘)]
AI运行代码
python
模糊匹配文本
匹配 标签内文本包含“搜索”的元素(如“高级搜索”、“搜索图标”等)
//span[contains(text(), ‘搜索’)]
AI运行代码
python
3.5 多条件组合:and
当你不仅希望匹配一个属性,还需要匹配另一个
例子:匹配 class 包含 search 且 placeholder 为“关键词”的输入框
//input[contains(@class, ‘search’) and @placeholder=’关键词’]
AI运行代码
python
- 常用表达式
表达式 说明 示例
//tag[@attr=’value’] 属性精确匹配 //input[@placeholder=’cubumber’]
//tag[contains(@attr,’value’)] 属性部分匹配 //div[contains(@class,’toolbar’)]
//tag[text()=’text’] 文本精确匹配 //span[text()=’搜索’]
//tag[starts-with(@attr,’val’)] 属性开头匹配 //a[starts-with(@href,’https://blog’)]
//tag1//tag2 层级关系(tag2是tag1的后代) //div[@id=’csdn-toolbar’]//input
//tag1/tag2 直接子节点 //ul/li
IV. By.CSS_SELECTOR - 基本用法
driver.find_elemenet(By.CSS_SELECTOR, css_selector表达式)
AI运行代码
python
from selenium.webdriver.common.by import By
element = driver.find_element(By.CSS_SELECTOR, “css_selector_expression”)
AI运行代码
python
- 基础选择器
2.1 标签定位
driver.find_element(By.CSS_SELECTOR, “input”)
driver.find_element(By.CSS_SELECTOR, “div”)
AI运行代码
python
2.2 class类定位
前面有个 ‘ . ’
driver.find_element(By.CSS_SELECTOR, “.username-field”)
AI运行代码
python
2.3 ID 定位
前面有个 ‘ # ’
driver.find_element(By.CSS_SELECTOR, “#submit-btn”)
AI运行代码
python
2.4 组合使用
driver.find_element(By.CSS_SELECTOR, “‘标签名’ + ‘.’ + ‘类/id/…'”)
AI运行代码
python
driver.find_element(By.CSS_SELECTOR, “input.username-field”)
AI运行代码
python
- attribute属性选择器
3.1 属性名定位
driver.find_element(By.CSS_SELECTOR, “[name]”)
AI运行代码
python
3.2 属性值完全匹配 element_value = target_value
driver.find_element(By.CSS_SELECTOR, “[type=’submit’]”)
AI运行代码
python
3.3 属性值部分匹配
driver.find_element(By.CSS_SELECTOR, “[href*=’example.com’]”) # 包含
driver.find_element(By.CSS_SELECTOR, “[href^=’https’]”) # 开头
driver.find_element(By.CSS_SELECTOR, “[href$=’.pdf’]”) # 结尾
AI运行代码
python - 层级关系
4.1 空格 – 后代选择器(任意层级)
选择div内的所有span(任何嵌套层级)
div span
AI运行代码
css
4.2 直接子元素:>
只选择div的直接子span
这个选择器专门用于选择直接嵌套在父元素内的子元素,无论有多少符合条件的子元素。
也就是说,可以选择多个子元素。
div > span
AI运行代码
css
示例
直接子元素1直接子元素2 非直接子元素
直接子元素3
AI运行代码
html
直接选择所有子元素
会匹配到3个元素:
- “直接子元素1”
- “直接子元素2”
- “直接子元素3”
spans = driver.find_elements(By.CSS_SELECTOR, “div.container > span”)
AI运行代码
python
结合其他选择器
选择直接子元素中特定class的span
spans = driver.find_elements(By.CSS_SELECTOR, “div.container > span.highlight”)
选择直接子元素中特定属性的span
spans = driver.find_elements(By.CSS_SELECTOR, “div.container > span[data-id]”)
AI运行代码
python
与其他选择器组合
选择直接子元素中的第一个span
first_span = driver.find_element(By.CSS_SELECTOR, “div.container > span:first-child”)
选择直接子元素中的最后一个span
last_span = driver.find_element(By.CSS_SELECTOR, “div.container > span:last-child”)
选择直接子元素中的第n个span
third_span = driver.find_element(By.CSS_SELECTOR, “div.container > span:nth-child(3)”)
AI运行代码
python
4.3 相邻兄弟选择器:+
选择紧接在h1后的第一个p元素
h1 + p
AI运行代码
css
4.4 通用兄弟选择器:~
h1后面的所有同级p元素
h1 ~ p
AI运行代码
css
- 通配符:*
选择div内的所有元素
div *
AI运行代码
css
- 组合选择器
6.1 AND
无间隔连续写
input.form-control[name=”username”] /* class为form-control且name为username的input */
AI运行代码
css
6.2 OR
逗号分隔
button, input[type=”button”] /* 所有button和type为button的input */
AI运行代码
css
- 伪类选择器
7.1 选择第一个元素/最后一个元素:first-child / :last-child
li:first-child /* 第一个li元素 / li:last-child / 最后一个li元素 / AI运行代码 css 7.2 选择第n行:nth-child(n) tr:nth-child(odd) / 奇数行 / tr:nth-child(even) / 偶数行 / tr:nth-child(3) / 第3行 */
AI运行代码
css
7.3 :not(selector)
排除某个属性
input:not([type=”hidden”]) /* 不是隐藏输入框的input / AI运行代码 css 7.4 selenium支持 – contains语法 div:contains(“Hello”) / 包含”Hello”文本的div */
AI运行代码
css
- 常见表达式
表达式 说明 示例
tag#id ID选择器 input#username
tag.class 类选择器 button.submit-btn
[attr=”value”] 属性精确匹配 [placeholder=”关键词”]
[attr=”value”] 属性部分匹配 [class=”toolbar”]
:contains(“text”) 文本包含 div:contains(“搜索”)
[attr^=”val”] 属性开头匹配 a[href^=”https://blog”]
parent child 后代选择器 div.container input
parent > child 直接子元素 ul > li
