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")
相关推荐
TechWayfarer21 分钟前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php
2601_967980111 小时前
Python列表操作方法详解
python·数据类型·修改·列表操作·功能汇总
Patrick在香港2 小时前
台风在变少,来香港的没有
python·数据分析·香港·开放数据·热带气旋
qq_406981032 小时前
大白话rust系列09 函数调用两次有什么错?
开发语言·python·rust
benchmark_cc2 小时前
QuantDash 安装成功后,如何验证 Python 环境可以正常导入 SDK?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
zh路西法3 小时前
【模型式强化学习】(二)PETS——从概率动力学模型到模型预测控制(MPC)
pytorch·python·强化学习·pe·mpc·ces·pets
Python自动化直播5 小时前
智能脚本批量管理拆开看:导入、导出、重写、试听
前端·python·ai·秒播
伤心的梧桐叶7 小时前
Picset与创客贴比等待时间,没做完的任务不能从表里消失
python
没有气的汽水7 小时前
一次 SQS 消费者静默退出的排查:问题最后竟然出在日志里
python
用户450030140237 小时前
物业催缴系统为什么总在"冷却"这一步翻车:账期建模与规则命中的几个取舍
python