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")
相关推荐
hhh3u3u3u1 分钟前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
好家伙VCC38 分钟前
**发散创新:基于Python与ROS的机器人运动控制实战解析**在现代机器人系统开发中,**运动控制**是实现智能行为的核心
java·开发语言·python·机器人
2401_8274999938 分钟前
python项目实战09-AI智能伴侣(ai_partner_2-3)
开发语言·python
派葛穆40 分钟前
汇川PLC-Python与汇川easy521plc进行Modbustcp通讯
开发语言·python
代码小书生1 小时前
Matplotlib,Python 数据可视化核心库!
python·信息可视化·matplotlib
默 语2 小时前
Records、Sealed Classes这些新特性:Java真的变简单了吗?
java·开发语言·python
架构师老Y2 小时前
013、数据库性能优化:索引、查询与连接池
数据库·python·oracle·性能优化·架构
Kel2 小时前
PydanticAI 源码深潜:类型安全依赖注入与图执行引擎的双核架构解析
人工智能·python·架构
卷心菜狗2 小时前
Python进阶-深浅拷贝辨析
开发语言·python
Thomas.Sir2 小时前
重构诊疗效率与精准度之【AI 赋能临床诊断与辅助决策从理论到实战】
人工智能·python·ai·医疗·诊断