当前位置: 首页 > 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…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...