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")
相关推荐
bellus-6 分钟前
ubuntu26测试win10的ollama大模型性能
python
水木流年追梦7 分钟前
大模型入门-Reward 奖励模型训练
开发语言·python·算法·leetcode·正则表达式
JavaWeb学起来8 分钟前
Python学习教程(六)数据结构List(列表)
数据结构·python·python基础·python教程
liuyunshengsir21 分钟前
PyTorch 动态量化(Dynamic Quantization)
人工智能·pytorch·python
电子云与长程纠缠29 分钟前
UE5制作六边形包裹球体效果
开发语言·python·ue5
DFT计算杂谈38 分钟前
KPROJ编译教程
java·前端·python·算法·conda
念恒123061 小时前
Python(循环中断)
开发语言·python
tsfy20031 小时前
Python 处理中文文件名的3个坑(附 Flask 上传解决函数)
开发语言·python·flask·文件上传·中文编码
AI技术控2 小时前
KV Cache 缓存机制的原理和应用:从 Transformer 推理到大模型服务优化
人工智能·python·深度学习·缓存·自然语言处理·transformer
vx-程序开发2 小时前
基于机器学习的动漫可视化系统的设计与实现-计算机毕业设计源码08339
java·c++·spring boot·python·spring·django·php