Python中Selenium最常用的八大元素定位的实战指南

 更新时间:2025年10月16日 09:16:27   作者:成成成成成成果  
在 Selenium 自动化测试中,元素定位是核心基础,本文将系统讲解 Selenium 最常用的八大元素定位方法,结合图标、实战代码和对比图表,帮你快速掌握定位技巧

在 Selenium 自动化测试中,元素定位是核心基础—— 只有精准找到页面上的目标元素(如按钮、输入框、链接等),才能执行后续的点击、输入、获取文本等操作。本文将系统讲解 Selenium 最常用的八大元素定位方法,结合图标、实战代码和对比图表,帮你快速掌握定位技巧。

一、元素定位的核心逻辑

页面中的每个 HTML 元素都有独特的 “身份标识”(如 ID、类名、标签名等),Selenium 通过这些标识在 DOM(文档对象模型)中匹配目标元素。其核心逻辑可概括为:

定位策略 → 匹配规则 → 找到元素 → 执行操作

为了更直观理解,我们先看一个简单的 HTML 元素示例,后续代码将基于此元素展开:

<!-- 示例元素:一个登录按钮 -->

<button id="loginBtn" class="btn primary-btn" name="submit" value="login"

onclick="submitForm()">登录</button>

二、八大元素定位方法详解

Selenium 提供了 8 种定位方法,对应find_element(By.XXX, value)中的By类属性。以下按 “常用程度 + 定位精度” 排序讲解,每种方法均包含定位原理图标代码示例适用场景

1. ID 定位(By.ID)

原理

通过元素的id属性定位,ID 在页面中通常是唯一的(规范的前端开发会保证 ID 唯一性),是优先级最高的定位方式。

代码示例

from selenium import webdriver
from selenium.webdriver.common.by import By

# 初始化浏览器
driver = webdriver.Chrome()
driver.get("https://example.com/login")
# 通过ID定位登录按钮并点击
login_btn = driver.find_element(By.ID, "loginBtn") # value为元素的id属性值
login_btn.click()
# 关闭浏览器
driver.quit()

适用场景

  • 元素有明确且唯一的id属性(如登录按钮、核心输入框);
  • 追求最高定位效率和稳定性时优先使用。

2. 名称定位(By.NAME)

原理

通过元素的name属性定位,name常用于表单元素(如输入框),但可能不唯一。

代码示例

# 定位用户名输入框并输入内容
username_input = driver.find_element(By.NAME, "username") # value为元素的name属性值
username_input.send_keys("test_user")
# 定位密码输入框并输入内容
password_input = driver.find_element(By.NAME, "password")
password_input.send_keys("123456")

适用场景

  • 元素有name属性(常见于表单元素如输入框、单选框);
  • 当 ID 不存在但 name 存在时使用,需注意 name 可能重复(重复时需结合其他策略)。

3. 类名定位(By.CLASS_NAME)

原理

通过元素的class属性定位,class用于定义元素样式,可能对应多个元素(同一类样式的元素)。

代码示例

# 定位所有“主要按钮”(假设class="primary-btn"对应多个按钮)
primary_btns = driver.find_elements(By.CLASS_NAME, "primary-btn") # 注意是find_elements(复数)
# 遍历所有主要按钮,找到“登录”按钮并点击
for btn in primary_btns:
if btn.text == "登录":
btn.click()
break

适用场景

  • 元素有class属性,且需要批量定位同一类元素(如列表项、表格行);
  • 注意:class属性值若包含空格(如class="btn primary-btn"),需拆分取单个类名(如用"btn"或"primary-btn")。

4. 标签名定位(By.TAG_NAME)

原理

通过 HTML 标签名(如button、input、a)定位,标签名通常对应大量元素(如页面中所有按钮都是<button>标签)。

代码示例

# 定位页面中所有按钮,统计按钮数量
all_buttons = driver.find_elements(By.TAG_NAME, "button")
print(f"页面中共有 {len(all_buttons)} 个按钮")
# 定位页面中唯一的<input type="submit">标签并点击
submit_input = driver.find_element(By.TAG_NAME, "input")
if submit_input.get_attribute("type") == "submit":
submit_input.click()

适用场景

  • 页面中某类标签唯一(如唯一的<form>标签);
  • 需要批量统计或操作同一标签的元素(如统计所有<a>链接)。

5. 链接文本定位(By.LINK_TEXT)

原理

通过超链接(<a>标签)的完整文本内容定位,仅适用于<a>标签。

代码示例

# 定位文本为“忘记密码?”的链接并点击
forgot_pwd_link = driver.find_element(By.LINK_TEXT, "忘记密码?") # value为完整链接文本
forgot_pwd_link.click()

适用场景

  • 元素是<a>标签(超链接);
  • 链接文本完整且唯一(如 “帮助中心”“退出登录” 链接)。

6. 部分链接文本定位(By.PARTIAL_LINK_TEXT)

原理

通过超链接(<a>标签)的部分文本内容定位,适用于链接文本较长或部分固定的场景。

代码示例

# 定位包含“忘记”文本的链接(如“忘记密码?”“忘记账号?”)
forgot_link = driver.find_element(By.PARTIAL_LINK_TEXT, "忘记") # value为部分链接文本
forgot_link.click()

适用场景

  • 链接文本较长(如 “点击查看用户协议和隐私政策”),只需匹配部分文本;
  • 链接文本部分固定(如 “2024 年度报告”“2025 年度报告”,可通过 “年度报告” 定位)。

7. XPath 定位(By.XPATH)

原理

XPath 是一种在 XML/HTML 文档中查找元素的语言,支持复杂的路径和条件匹配,几乎能定位所有元素,是最灵活的定位方式。

常用 XPath 语法与代码示例

XPath 类型语法示例说明
绝对路径/html/body/div[1]/button从根节点开始,易受页面结构变化影响
相对路径(推荐)//button[@id="loginBtn"]从任意节点开始,通过属性匹配
文本匹配//a[text()="忘记密码?"]通过元素文本匹配
包含文本//a[contains(text(), "忘记")]通过部分文本匹配
父节点定位//input[@name="username"]/..定位输入框的父节点
# 1. 相对路径+ID定位登录按钮
login_btn_xpath1 = driver.find_element(By.XPATH, "//button[@id='loginBtn']")
# 2. 相对路径+文本定位链接
forgot_pwd_xpath = driver.find_element(By.XPATH, "//a[text()='忘记密码?']")
# 3. 相对路径+包含属性定位输入框(匹配name包含“user”的输入框)
user_input_xpath = driver.find_element(By.XPATH, "//input[contains(@name, 'user')]")
# 4. 定位父节点下的子元素(定位class为“form-group”的div下的第一个input)
form_input_xpath = driver.find_element(By.XPATH, "//div[@class='form-group']/input[1]")

适用场景

  • 元素无 ID、name 等简单属性,或属性动态变化(如随机生成的 ID);
  • 需要复杂条件定位(如 “父元素下的第三个子元素”“文本包含某关键词的元素”);
  • 跨层级、跨标签定位时(如从表格行定位表格外的按钮)。

8. CSS 选择器定位(By.CSS_SELECTOR)

原理

CSS 选择器是用于选择 HTML 元素的模式,定位效率比 XPath 更高,语法简洁,也是常用的灵活定位方式。

常用 CSS 语法与代码示例

CSS 选择器类型语法示例说明
ID 选择器#loginBtn匹配 id="loginBtn" 的元素
类选择器.primary-btn匹配 class="primary-btn" 的元素
标签选择器button匹配所有标签
属性选择器input[name='username']匹配 name="username" 的元素
包含属性input[name*='user']匹配 name 包含 “user” 的元素
子元素选择器div.form-group > input匹配 div(class="form-group")的直接子
# 1. ID选择器定位登录按钮
login_btn_css1 = driver.find_element(By.CSS_SELECTOR, "#loginBtn")
# 2. 类选择器定位主要按钮
primary_btn_css = driver.find_element(By.CSS_SELECTOR, ".primary-btn")
# 3. 属性选择器定位用户名输入框
username_input_css = driver.find_element(By.CSS_SELECTOR, "input[name='username']")
# 4. 子元素选择器定位表单输入框
form_input_css = driver.find_element(By.CSS_SELECTOR, "div.form-group > input")
# 5. 包含属性定位密码输入框(name包含“pass”)
password_input_css = driver.find_element(By.CSS_SELECTOR, "input[name*='pass']")

适用场景

  • 追求定位效率(CSS 选择器比 XPath 更快);
  • 熟悉 CSS 语法,需要简洁的灵活定位;
  • 部分场景下 CSS 语法比 XPath 更简洁(如 ID、类选择器)。

三、八大定位方法对比图表

为了帮你快速选择合适的定位方法,以下是八大方法的核心维度对比:

定位方法定位依据唯一性灵活性效率适用场景
By.IDid 属性最高元素有唯一 ID
By.NAMEname 属性表单元素(输入框、单选框)
By.CLASS_NAMEclass 属性批量定位同一类样式元素
By.TAG_NAMEHTML 标签名最低批量定位同一标签元素(如按钮、链接)
By.LINK_TEXT标签完整文本超链接文本完整且唯一
By.PARTIAL_LINK_TEXT标签部分文本超链接文本较长或部分固定
By.XPATH路径 / 条件可高可低最高复杂定位(无简单属性、动态元素)
By.CSS_SELECTORCSS 选择器可高可低较高追求效率的灵活定位

四、定位技巧与避坑指南

优先选择稳定的定位方式:ID > NAME > CLASS_NAME > XPath/CSS(当简单属性存在时,优先用前三者,减少维护成本);

避免绝对路径:XPath 的绝对路径(如/html/body/div[1])易受页面结构变化影响,推荐用相对路径;

处理动态属性:若元素属性(如 ID)随机生成(如loginBtn_12345),用 XPath/CSS 的 “包含” 语法(contains(@id, 'loginBtn'));

区分单数与复数:find_element()返回单个元素(找不到会报错),find_elements()返回元素列表(找不到返回空列表);

工具辅助定位:用浏览器开发者工具(F12)的 “元素” 面板,右键元素可直接复制 XPath/CSS 选择器(需注意验证有效性)。

总结

Selenium 八大元素定位方法各有优劣,实际测试中需根据元素属性、页面结构和稳定性需求选择:

  • 简单场景:优先用 ID、NAME(高效稳定);
  • 批量操作:用 CLASS_NAME、TAG_NAME;
  • 链接定位:用 LINK_TEXT、PARTIAL_LINK_TEXT;
  • 复杂场景:用 XPath(灵活)或 CSS_SELECTOR(高效)。

掌握这些定位方法,再结合实际项目中的调试经验,就能轻松应对大多数 Selenium 自动化测试的元素定位需求!

到此这篇关于Python中Selenium最常用的八大元素定位的实战指南的文章就介绍到这了,更多相关Selenium元素定位内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现录制全屏和选择区域录屏功能

    python实现录制全屏和选择区域录屏功能

    这篇文章主要介绍了python实现录制全屏和选择区域录屏功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 将Django项目部署到CentOs服务器中

    将Django项目部署到CentOs服务器中

    今天小编就为大家分享一篇关于将Django项目部署到CentOs服务器中的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • pyEcharts安装及详细使用指南(最新)

    pyEcharts安装及详细使用指南(最新)

    这篇文章主要介绍了pyEcharts安装及详细使用指南(最新),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 浅谈ROC曲线的最佳阈值如何选取

    浅谈ROC曲线的最佳阈值如何选取

    今天小编就为大家分享一篇浅谈ROC曲线的最佳阈值如何选取,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python实现接口自动化封装导出excel和读写excel数据

    Python实现接口自动化封装导出excel和读写excel数据

    这篇文章主要为大家详细介绍了Python如何实现接口自动化封装导出excel和读写excel数据,文中的示例代码简洁易懂,希望对大家有所帮助
    2023-07-07
  • pytest+allure环境搭建+自动化实践过程

    pytest+allure环境搭建+自动化实践过程

    这篇文章主要介绍了pytest+allure环境搭建+自动化实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Eclipse + Python 的安装与配置流程

    Eclipse + Python 的安装与配置流程

    Eclipse的安装是很容易的。Eclipse是基于java的一个应用程序,因此需要一个java的运行环境(JRE)才行。(我这里主要介绍windows下的安装)
    2013-03-03
  • 基于Python实现船舶的MMSI的获取(推荐)

    基于Python实现船舶的MMSI的获取(推荐)

    工作中遇到一个需求,需要通过网站查询船舶名称得到MMSI码,网站来自船讯网。这篇文章主要介绍了基于Python实现船舶的MMSI的获取,需要的朋友可以参考下
    2019-10-10
  • Mac安装python3的方法步骤

    Mac安装python3的方法步骤

    这篇文章主要介绍了Mac安装python3的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • tensorflow实现二维平面模拟三维数据教程

    tensorflow实现二维平面模拟三维数据教程

    今天小编就为大家分享一篇tensorflow实现二维平面模拟三维数据教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02

最新评论