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")
相关推荐
笨鸟先飞,勤能补拙1 天前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能1 天前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂1 天前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study1 天前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境1 天前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境1 天前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1231 天前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102161 天前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb001 天前
一个项目带你入门AI应用开发01
python
0566461 天前
Python康复训练——常用标准库
开发语言·python·学习