当前位置: 首页 > news >正文

Selenium 八大元素定位方法及场景扩展

Selenium 提供了八种常见的元素定位方法,用于在网页中准确找到需要操作的元素。以下是详细介绍以及一些特殊场景的解决方案。


1. ID 定位

用法:
通过元素的唯一 id 属性进行定位。

element = driver.find_element(By.ID, "element_id")

使用场景:
适用于 HTML 中 id 唯一的场景,通常是表单控件、按钮等。


2. Name 定位

用法:
通过元素的 name 属性进行定位。

element = driver.find_element(By.NAME, "element_name")

使用场景:
适合用在表单或具有明确 name 属性的标签。


3. Class Name 定位

用法:
通过元素的 class 属性进行定位。

element = driver.find_element(By.CLASS_NAME, "element_class")

使用场景:
适用于具有明确样式类的 HTML 标签。需要注意,如果多个元素有相同的 class,需要结合其他属性筛选。


4. Tag Name 定位

用法:
通过标签名进行定位。

elements = driver.find_elements(By.TAG_NAME, "button")

使用场景:
适合查找一组同类元素,比如获取页面上所有的按钮或输入框。


5. Link Text 定位

用法:
通过超链接的完整文本内容进行定位。

element = driver.find_element(By.LINK_TEXT, "Click Here")

使用场景:
适用于超链接文本明确且唯一的情况。


6. Partial Link Text 定位

用法:
通过超链接的部分文本内容进行定位。

element = driver.find_element(By.PARTIAL_LINK_TEXT, "Click")

使用场景:
适用于超链接文本较长且部分内容具有唯一性的场景。


7. CSS Selector 定位

用法:
通过 CSS 选择器语法进行定位。

element = driver.find_element(By.CSS_SELECTOR, "div.container > ul > li:nth-child(2)")

使用场景:
适用于复杂的嵌套结构,支持丰富的选择器语法,如 nth-child、伪类等。


8. XPath 定位

用法:
通过 XPath 表达式进行定位,支持绝对路径和相对路径。

element = driver.find_element(By.XPATH, "//div[@id='main']//a[text()='Click Here']")

使用场景:
适用于复杂的层级结构和条件筛选,支持灵活的定位逻辑。


特殊场景扩展

1. 通过子节点找到父节点

场景描述: Selenium 不直接支持从子节点返回父节点,但可以通过 XPath 的 .. 语法实现。

示例:

<div class="parent"><span class="child-class">Child</span>
</div>

XPath:

parent_element = driver.find_element(By.XPATH, "//span[@class='child-class']/..")

解释:

  • //span[@class='child-class'] 定位子节点 <span>
  • /.. 回到父节点 <div>

2. 通过兄弟节点定位

场景描述: 找到当前元素的兄弟节点,通常用于导航到同级的其他元素。

示例:

<div id="current">Current Node</div>
<div id="sibling">Sibling Node</div>

XPath:

sibling_element = driver.find_element(By.XPATH, "//div[@id='current']/following-sibling::div[1]")

解释:

  • //div[@id='current'] 定位当前节点。
  • /following-sibling::div[1] 查找当前节点后面的第一个兄弟节点。

3. 动态属性定位

场景描述: 有些属性的值是动态生成的,比如随机 ID,可以使用部分匹配的方法来定位。

示例:

<input id="random_1234" type="text">

XPath:

element = driver.find_element(By.XPATH, "//input[contains(@id, 'random_')]")

解释:

  • contains(@id, 'random_') 匹配包含 random_id 属性。

4. 查找所有子节点

场景描述: 如果需要找到一个父节点下的所有直接子节点,可以使用 * 通配符。

示例:

<div id="container"><p>Paragraph 1</p><p>Paragraph 2</p><span>Span 1</span>
</div>

XPath:

child_elements = driver.find_elements(By.XPATH, "//div[@id='container']/*")

解释:

  • //div[@id='container'] 定位父节点。
  • /* 表示父节点下的所有直接子节点。

5. 多条件复合定位

场景描述: 当单个属性无法唯一标识元素时,可以结合多个属性进行定位。

示例:

<input type="text" name="username" class="login-input">

XPath:

element = driver.find_element(By.XPATH, "//input[@type='text' and @name='username']")

解释:

  • @type='text'@name='username' 是两个条件。
  • and 用于组合条件。

6. 使用索引定位

场景描述: 如果有多个相似的元素,需要通过索引定位特定的一个。

示例:

<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>

XPath:

element = driver.find_element(By.XPATH, "(//div[@class='item'])[2]")

解释:

  • (//div[@class='item']) 返回所有匹配的节点集合。
  • [2] 表示选择第二个元素。

7. 部分匹配属性值

场景描述: 如果属性值有特定的前缀或后缀,可以使用 starts-withcontains

示例:

<button class="btn-primary-save">Save</button>

XPath:

element = driver.find_element(By.XPATH, "//button[starts-with(@class, 'btn-primary')]")

解释:

  • starts-with(@class, 'btn-primary') 匹配以 btn-primary 开头的 class 属性值。

8. 动态加载的元素定位

场景描述: 某些页面的元素是异步加载的,需要显式等待。

示例:

<div id="dynamic_element_id">Loaded Content</div>

代码:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECelement = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "dynamic_element_id"))
)

解释:

  • WebDriverWait 等待元素出现。
  • presence_of_element_located 检查元素是否已加载到页面上。

通过合理使用以上方法,结合实际场景的需求,可以高效定位并操作网页中的各种元素,提升测试的稳定性和准确性。

相关文章:

Selenium 八大元素定位方法及场景扩展

Selenium 提供了八种常见的元素定位方法&#xff0c;用于在网页中准确找到需要操作的元素。以下是详细介绍以及一些特殊场景的解决方案。 1. ID 定位 用法&#xff1a; 通过元素的唯一 id 属性进行定位。 element driver.find_element(By.ID, "element_id")使用场…...

WebRTC 的优缺点详细解析

在当今数字化浪潮中&#xff0c;WebRTC技术凭借其独特优势&#xff0c;在众多联网平台中得以广泛应用&#xff0c;为实时通信带来了革命性变化。然而&#xff0c;如同任何技术一样&#xff0c;它也并非十全十美&#xff0c;存在着一些有待攻克的短板。 一、WebRTC的优点 卓越…...

B树及其Java实现详解

文章目录 B树及其Java实现详解一、引言二、B树基础1、B树定义2、B树约束 三、B树Java实现1、B树节点实现2、B树操作2.1、搜索2.2、插入2.3、删除 3、B树的Java代码实现 四、总结 B树及其Java实现详解 一、引言 B树是一种多路平衡查找树&#xff0c;广泛应用于数据库和文件系统…...

下载ffmpeg执行文件

打开网址&#xff1a;Download FFmpeg 按下面步骤操作 解压文件就可以看到ffmpeg的执行文件了&#xff0c;需要通过命令行进行使用&#xff1a; ffmpeg命令行使用参考&#xff1a; ffmpeg 常用命令-CSDN博客...

Redis高频知识点

Redis 目录 1 Redis是AP的还是CP的&#xff1f;2 介绍一下Redis的集群方案&#xff1f;3 什么是Redis的数据分片&#xff1f;4 Redis为什么这么快&#xff1f;5 Redis 的事务机制是怎样的&#xff1f;7 Redis的持久化机制是怎样的&#xff1f;8 Redis 的过期策略是怎么样的&a…...

Boost.Asio 同步读写及客户端 - 服务器实现详解

Boost.Asio 同步读写及客户端 - 服务器实现详解 参考文献 Boost.Asio 官方文档学习资料来源: 参考网址 一、引言 Boost.Asio作为一个强大的跨平台网络编程库&#xff0c;为开发者提供了丰富的网络操作接口。在之前的学习中&#xff0c;我们已接触到其同步读写的API函数&…...

LeetCode 3019.按键变更的次数:遍历(转小写)

【LetMeFly】3019.按键变更的次数&#xff1a;遍历&#xff08;转小写&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-changing-keys/ 给你一个下标从 0 开始的字符串 s &#xff0c;该字符串由用户输入。按键变更的定义是&#xff1a;使用与…...

ETCD未授权测试

一、测试环境搭建 首先拉取etcd镜像 docker pull quay.io/coreos/etcd:v3.3.1 # 查看镜像 docker images创建自定义网络 docker network create --driver bridge --subnet172.16.1.0/16 --gateway172.16.1.1 mynet # 查看网络 docker network ls创建etcd节点 节点1: docke…...

【Hystrix-1】Hystrix:构建弹性分布式系统的基石

在分布式系统的广袤星图中&#xff0c;服务间的调用如同星辰间的引力&#xff0c;维系着系统的运转。然而&#xff0c;这种依赖关系也如同达摩克利斯之剑&#xff0c;一旦某个服务出现故障&#xff0c;便可能引发连锁反应&#xff0c;导致整个系统的崩塌。Hystrix&#xff0c;如…...

【超详细】MIT 液态神经网络(LNNs)——深度学习新动向

✅作者简介:双一流博士,人工智能领域学习者,深耕机器学习,交叉学科实践者。已发表SCI1/区top论文10+,授权专利4件,公开10+。可提供专利思路和指导,提供科研小工具,分享科研经验,欢迎交流! 📌个人主页: https://blog.csdn.net/allein_STR?spm=1011.2559.3001.5343…...

Git最便捷的迁移方式

#当公司要求git需要迁移时&#xff0c;你是不是感觉到束手无策。今天带来给大家最快&#xff0c;最便捷的迁移方式 这个命令是用于重命名git仓库中的远程仓库名。在这个命令中&#xff0c;我们将远程仓库的名字从"origin"改为"old-origin"。 git remote …...

2024AAAI SCTNet论文阅读笔记

文章目录 SCTNet: Single-Branch CNN with Transformer Semantic Information for Real-Time Segmentation摘要背景创新点方法Conv-Former Block卷积注意力机制前馈网络FFN 语义信息对齐模块主干特征对齐共享解码头对齐 总体架构backbone解码器头 对齐损失 实验SOTA效果对比Cit…...

Laravel操作ElasticSearch

在Laravel项目中操作ElasticSearch可以通过以下步骤来实现&#xff0c;通常会借助相应的ElasticSearch客户端扩展包。 ### 安装ElasticSearch客户端包 在Laravel项目中&#xff0c;常用的是 elasticsearch/elasticsearch 这个PHP客户端库来与ElasticSearch进行交互&#xff0c…...

江科大STM32入门——SPI通信笔记总结

wx&#xff1a;嵌入式工程师成长日记 &#xff08;一&#xff09;简介 四根通信线&#xff1a;SCK、MOSI、MISO、SS(片选信号) 同步&#xff08;同步通信是一种通信模式&#xff0c;在这种模式下&#xff0c;发送方和接收方在同一时刻进行数据传输。&#xff09;&#xff0c;全…...

微信小程序map组件所有markers展示在视野范围内

注意&#xff1a;使用include-points属性不生效&#xff0c;要通过createMapContext实现 <template><view class"map-box"><map id"map" class"map" :markers"markers" :enable-traffic"true" :enable-poi&…...

深度解析 tanh ⁡ tanh 激活函数

1. 引言 在现代深度学习中&#xff0c;激活函数&#xff08;Activation Function&#xff09;是神经网络的核心组件之一。它的主要作用是引入非线性&#xff0c;从而使神经网络能够学习和表示复杂的非线性关系。如果没有激活函数&#xff0c;神经网络的输出将只是输入的线性组…...

嵌入式入门Day38

C Day1 第一个C程序C中的输入输出输出操作coutcin练习 命名空间使用方法自定义命名空间冲突问题 C对字符串的扩充C风格字符串的使用定义以及初始化C风格字符串与C风格字符串的转换C风格的字符串的关系运算常用的成员变量输入方法 布尔类型C对堆区空间使用的扩充作业 第一个C程序…...

探索Rancher服务发现机制:容器世界的“导航仪”

《探索Rancher服务发现机制&#xff1a;容器世界的“导航仪”》 在当今容器化技术蓬勃发展的时代&#xff0c;容器的大规模部署和微服务架构的广泛应用使得服务之间的相互发现与通信变得至关重要。Rancher作为一款功能强大的容器管理平台&#xff0c;其服务发现机制宛如一座无…...

【ROS2】Qt事件循环和ROS2订阅机制一起使用有什么注意事项?

1、简述 Qt的事件循环和ROS订阅回调函数都可能在阻塞函数中运行, 例如:Qt的QApplication::exec() 和 ROS的rclcpp::spin() 两个阻塞函数不能在同一个线程中使用,如果使用不当,会造成Qt不处理事件或者ROS2不处理订阅的回调函数。 2、多线程 一般 QApplication::exec() 运…...

donet (MVC)webAPI 的接受json 的操作

直接用对象来进行接收&#xff0c;这个方法还不错的。 public class BangdingWeiguiJiluController : ApiController{/// <summary>/// Json数据录入错误信息/// </summary>/// <param name"WeiguiInfos"></param>/// <returns></r…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...