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 EC

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "dynamic_element_id"))
)

解释:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950316.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

非一般的小数:小数的概念新解、小数分类、浮点数的存储

非一般的小数&#xff1a;小数的概念新解、小数分类、浮点数的存储 一、小数的概念二、小数的分类1&#xff0e;有限小数、无限循环小数、无限不循环小数2&#xff0e;纯小数、带小数3&#xff0e;定点数、浮点数 三、浮点数的存储 一、小数的概念 这还用解释吗&#xff1f;小…

ETCD渗透利用指南

目录 未指定使用put操作报错 未指定操作版本使用get报错 首先etcd分为两个版本v2和v3&#xff0c;不同的API结果无论是访问URL还是使用etcdctl进行通信&#xff0c;都会导致问题&#xff0c;例如使用etcdctl和v3进行通信&#xff0c;如果没有实名ETCDCTL_API3指定API版本会直接…

小程序组件 —— 28 组件案例 - 推荐商品区域 - 实现结构样式

这一节目标是实现底部推荐商品的结构和样式&#xff0c;由于这里要求横向滚动&#xff0c;所以需要使用上节介绍的 scroll-view 功能&#xff0c;并使用 scroll-x 属性支持横向滚动&#xff0c;推荐商品区域中的每一个商品是一个单独的 view&#xff0c;每个view 中需要写三个组…

JDK、JRE、JVM三者的关系、JDK8的新特性、JVM内存结构,堆栈的区别

1&#xff0e;JDK、JRE、JVM三者的关系 JDK (Java Development Kit)----Java开发工具包&#xff0c;用于Java程序的开发。 JRE (Java Runtime Environment)----Java运行时环境&#xff0c;只能运行.class文件&#xff0c;不能编译。 JVM (Java Virtual Machine)----Java虚拟…

十四、Vue 混入(Mixins)详解

文章目录 简介一、基本语法定义混入对象使用混入对象二、混入的数据合并数据合并规则深度合并(对象类型数据)三、混入的生命周期钩子生命周期钩子的合并规则利用生命周期钩子合并的优势四、混入的方法合并方法合并规则调用被覆盖的方法(高级用法)五、混入的应用场景多个组件…

简洁安装配置在Windows环境下使用vscode开发pytorch

简洁安装配置在Windows环境下使用vscode开发pytorch 使用anaconda安装pytorch&#xff0c;通过vscode集成环境开发pytorch 下载 anaconda 下载网址&#xff0c;选择对应系统的版本 https://repo.anaconda.com/archive/ windows可以选择Anaconda3-2024.10-1-Windows-x86_64.e…

【Linux】IP地址、主机名、网络传输、进程管理、主机状态

一、IP地址 1.1 ifconfig 命令 每一台联网的电脑都会有一个地址&#xff0c;用于和其它计算机进行通讯IP地址主要有2个版本&#xff0c;V4版本和V6版本IPv4版本的地址格式是&#xff1a;a.b.c.d&#xff0c;其中abcd表示0~255的数字&#xff0c;如192.168.88.101就是一个标准…

2.STM32F407ZGT6-外部中断

参考&#xff1a; 1.正点原子。 前言&#xff1a; MCU最重要的一个领域–中断。总结下嵌套向量和外部中断的概念。达到&#xff1a; 1.NVIC是什么&#xff0c;了解中断的整体管理理念。 2.中断里面最简单的外部中断&#xff0c;怎么配置处理。 3.使用STM32CubeMX配置外部中断的…

基于Elasticsearch8的向量检索实现相似图形搜索

Elasticsearch8版本增加了KNN向量检索&#xff0c;可以基于此功能实现以图搜图功能。 1、首先创建索引&#xff0c;es提供了类型为dense_vector的字段&#xff0c;用于存储向量&#xff0c;其中dims是向量维度&#xff0c;可以不配置&#xff0c;es会根据第一条插入的向量维度…

Element-plus表单总结

表单包含输入框&#xff0c;单选框&#xff0c;下拉选择&#xff0c;多选框等用户输入的组件。输入表单&#xff0c;您可以收集、验证和提交数据。 经典表单 最基础的表单包括各种输入表单项&#xff0c;比如input、select、radio、checkbox等。 在每一个form组件中&#xff0…

cursor vip

https://cursor.jeter.eu.org?pf7f4f3fab0af4119bece19ff4a4360c3 可以直接复制命令使用git bash执行即可 命令&#xff1a; bash <(curl -Lk https://gitee.com/kingparks/cursor-vip/releases/download/latest/ic.sh) f7f4f3fab0af4119bece19ff4a4360c3 等待执行完成后…

创建springboot项目

目录 1、使用 https://start.spring.io/ 创建项目Project 选 mavenLanguage 选 javaSpring Boot 选 3.4.1Project MetadataDependencies 2、阿里云网址 更好用 https://start.aliyun.com/ 1、使用 https://start.spring.io/ 创建项目 跳转 Project 选 maven Language 选 jav…

UDP_TCP

目录 1. 回顾端口号2. UDP协议2.1 理解报头2.2 UDP的特点2.3 UDP的缓冲区及注意事项 3. TCP协议3.1 报头3.2 流量控制2.3 数据发送模式3.4 捎带应答3.5 URG && 紧急指针3.6 PSH3.7 RES 1. 回顾端口号 在 TCP/IP 协议中&#xff0c;用 “源IP”&#xff0c; “源端口号”…

Netron可视化深度学习的模型框架,大大降低了大模型的学习门槛

深度学习是机器学习的一个子领域&#xff0c;灵感来源于人脑的神经网络。深度学习通过多层神经网络自动提取数据中的高级特征&#xff0c;能够处理复杂和大量的数据&#xff0c;尤其在图像、语音、自然语言处理等任务中表现出色。常见的深度学习模型&#xff1a; 卷积神经网络…

Python生成高级圣诞树-代码案例剖析

文章目录 &#x1f47d;发现宝藏 ❄️方块圣诞树&#x1f42c;效果截图&#x1f338;代码-可直接运行&#x1f334;代码解析 ❄️线条圣诞树&#x1f42c;效果截图&#x1f338;代码-可直接运行&#x1f334;代码解析 ❄️豪华圣诞树&#x1f42c;效果截图&#x1f338;代码-可…

Flux“炼丹炉”——fluxgym安装教程

一、介绍 这个炼丹炉目前可以训练除了flux-dev之外的其它模型&#xff0c;只需更改一个配置文件内容即可。重要的是训练时不需要提前进行图片裁剪、打标等前置工作&#xff0c;只需下图的三个步骤即可开始训练。它就是——fluxgym。 fluxgym&#xff1a;用于训练具有低 VRAM &…

【PLL】非线性瞬态性能

频率捕获、跟踪响应&#xff0c;是大信号非线性行为锁相范围内的相位、频率跟踪&#xff0c;不是非线性行为 所以&#xff1a;跟踪&#xff0c;是线性区域&#xff1b;捕获&#xff0c;是大信号、非线性区域 锁定范围&#xff1a;没有周跳&#xff08;cycle-slipping&#xff0…

OpenAI CEO 奥特曼发长文《反思》

OpenAI CEO 奥特曼发长文《反思》 --- 引言&#xff1a;从 ChatGPT 到 AGI 的探索 ChatGPT 诞生仅一个多月&#xff0c;如今我们已经过渡到可以进行复杂推理的下一代模型。新年让人们陷入反思&#xff0c;我想分享一些个人想法&#xff0c;谈谈它迄今为止的发展&#xff0c;…

“AI智慧语言训练系统:让语言学习变得更简单有趣

大家好&#xff0c;我是你们的老朋友&#xff0c;一个热衷于探讨科技与教育结合的产品经理。今天&#xff0c;我想和大家聊聊一个让语言学习变得不再头疼的话题——AI智慧语言训练系统。这个系统可是我们语言学习者的福音&#xff0c;让我们一起来揭开它的神秘面纱吧&#xff0…

一、二极管(应用篇)

1.5普通二极管应用 1.5.1钳位电路 利用二极管的固定的导通电压&#xff0c;在二极管处并联用电器&#xff0c;达到用电器的工作电压相对稳定。如果电源处有尖峰电压&#xff0c;则可以通过二极管导入到5v的电源内&#xff0c;防止此尖峰电压干扰用电器 &#xff0c;起到对电路的…