Selenium元素定位

复制代码
# 1.导包
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 2.打开浏览器(创建浏览器驱动对象)
path = r"C:\Program Files\Python311\chromedriver.exe"//驱动程序路径
ser = Service(executable_path=path)  # Chrome浏览器驱动服务对象
driver = webdriver.Chrome(service=ser)  # 打开Chrome浏览器
# 3.输入网址
driver.get("url地址")
# 4.页面操作
# # 输入操作
# 元素对象.send_keys("内容")
# # 点击操作
# 元素对象.click()

# 5.等待2秒
time.sleep(2)
# 6.退出浏览器
driver.quit()

定位:driver.find_element(by=By.定位方式, value="属性值")

Selenium 页面元素定位方法速查表

定位方式 语法 (By) 适用场景 HTML 示例 劣势/注意
ID 定位 By.ID 首选。元素拥有唯一的 id 属性时。 <input id="username" ...> 若 ID 是动态生成的则无法使用。
Name 定位 By.NAME 表单元素(input, select等)有 name 属性且无 ID 时。 <input name="password" ...> 部分元素可能没有 name 属性;若有多个同名元素需配合下标。
Class Name By.CLASS_NAME 元素 class 属性具有辨识度,且类名唯一时。 <button class="btn-submit"> 若 class 包含多个值(如 class="a b"),只能传其中一个;若类名重复需结合其他方法。
Tag Name By.TAG_NAME 批量定位同类型元素(如获取所有输入框、链接)。 <input type="text"> 精确性差,页面中同名标签很多,通常返回第一个或列表。
Link Text By.LINK_TEXT 专门用于定位超链接 (<a>), 且知道完整文本。 <a href="...">立即注册</a> 链接文本发生变化时代码需修改;必须完全匹配。
Partial Link By.PARTIAL_LINK_TEXT 定位超链接,只知道部分文本时。 <a href="...">忘记密码?</a> 可能匹配到多个元素,需确保部分文本的唯一性。
XPath By.XPATH 万能。复杂层级、动态属性、无 ID/Name 时。支持路径、属性、文本、逻辑组合。 <div><input type="text"></div> 语法相对复杂;绝对路径性能低且易受页面结构变化影响(建议用相对路径)。
CSS Selector By.CSS_SELECTOR 基于 DOM 结构快速定位,语法比 XPath 简洁。 <input class="form" id="email"> 不支持通过文本内容定位;复杂层级表达略逊于 XPath。

ID > Name > CSS Selector > XPath > Class Name > Link Text > Tag Name

常见 XPath 与 CSS 表达式速记

需求 XPath 表达式示例 CSS 表达式示例
ID 定位 //*[@id='kw'] #kw
Class 定位 //*[@class='btn'] .btn (若有多个类名取其中一个)
属性定位 //input[@name='q'] input[name='q']
层级定位 //form[@id='login']/input form#login > input (子) 或 form#login input (后代)
文本定位 //*[text()='登录'] CSS 不支持直接文本定位
模糊匹配 //*[contains(@class, 'btn')] input[class*='btn']

<div class="a b c">

(CSS): By.CSS_SELECTOR, ".a.b.c"By.CSS_SELECTOR, ".a" (如果 a 唯一)

(XPath): By.XPATH, "//*[@class='a b c']" (需注意 class 顺序) 或 contains(@class, 'a')

匹配动态ID(如id="btn-123")

driver.find_element(By.XPATH, "//button[starts-with(@id, 'btn-')]")

css选择器

元素1>元素2 父子关系

元素1 元素2 上下级关系

标签名[属性名*='局部属性值'] 局部属性值定位

复制代码
# 1. By.ID
# HTML: 元素拥有唯一的 id 属性
<input type="text" id="user_id" class="form-control" placeholder="请输入ID">
user_input = driver.find_element(By.ID, "user_id")

# 2. By.NAME
# HTML: 表单元素拥有 name 属性
<input type="text" name="username" class="form-control" placeholder="用户名">
username_input = driver.find_element(By.NAME, "username")

# 3. By.CLASS_NAME
# HTML: 元素拥有独特的类名 (注意:若有多个类名,只能取其中一个)
<button class="btn-submit-primary">提交订单</button>
submit_btn = driver.find_element(By.CLASS_NAME, "btn-submit-primary")

# 4. By.TAG_NAME
# HTML: 页面中普通的标签 (通常用于批量获取,此处演示获取第一个)
<input type="checkbox" name="agree">
first_checkbox = driver.find_element(By.TAG_NAME, "input")

# 5. By.LINK_TEXT
# HTML: 超链接标签,文本完全匹配
<a href="/register" class="link">立即注册</a>
register_link = driver.find_element(By.LINK_TEXT, "立即注册")

# 6. By.PARTIAL_LINK_TEXT
# HTML: 超链接标签,文本部分匹配 (例如链接文本很长,只记得一部分)
<a href="/help center">忘记密码怎么办?</a>
help_link = driver.find_element(By.PARTIAL_LINK_TEXT, "忘记密码")

# 7. By.XPATH
# HTML: 复杂结构或无唯一属性时,通过路径或属性组合定位
<div class="login-box"><input type="password" placeholder="密码"></div>
password_input = driver.find_element(By.XPATH, "//input[@placeholder='密码']")

# 8. By.CSS_SELECTOR
# HTML: 通过选择器语法快速定位 (支持 ID(#), Class(.), 属性([]))
<input type="email" id="email_addr" class="form-input">
email_input = driver.find_element(By.CSS_SELECTOR, "input#email_addr")
相关推荐
李昊哲小课2 小时前
matplotlib多子图与复杂布局实战
python·数据分析·matplotlib·数据可视化
2401_831920742 小时前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
写代码的【黑咖啡】2 小时前
Python Web 开发新宠:FastAPI 全面指南
前端·python·fastapi
吴佳浩 Alben2 小时前
GPU 编号错乱踩坑指南:PyTorch cuda 编号与 nvidia-smi 不一致
人工智能·pytorch·python·深度学习·神经网络·语言模型·自然语言处理
曲幽2 小时前
FastAPI实战:WebSocket vs Socket.IO,这回真给我整明白了!
python·websocket·nginx·socket·fastapi·web·async·socketio
阿钱真强道2 小时前
27 Python 分类-从概率角度做分类,一文认识朴素贝叶斯
python·分类·朴素贝叶斯·分类算法·贝叶斯分类·gaussiannb
2301_776508723 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
2401_879693873 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
I'm Jie3 小时前
Swagger UI 本地化部署,解决 FastAPI Swagger UI 依赖外部 CDN 加载失败问题
python·ui·fastapi·swagger·swagger ui