Web自动化中常用XPath定位方式
在进行Web自动化测试时,元素定位是一个至关重要的环节。XPath(XML Path Language)是一种用于在XML文档中定位节点的语言。在Web自动化中,XPath广泛应用于定位HTML元素。本文将详细介绍几种常用的XPath定位方式,包括绝对路径、相对路径、轴定位以及如何定位相同元素的最后一个,并解释一些常见的语法差异和其他轴定位方式。
1. 绝对路径定位
绝对路径是从文档的根节点开始,逐层向下定位目标元素的路径。这种方式需要精确指定每一层的标签名,路径结构类似于文件夹的目录结构。
1.1 例子
假设有以下HTML结构:
<html><body><div id="main"><h1>标题</h1><p class="description">描述信息</p><ul><li class="item">项1</li><li class="item">项2</li><li class="item">项3</li></ul></div></body>
</html>
如果你想通过绝对路径定位到<p>元素(描述信息),可以使用以下XPath表达式:
/html/body/div/p
解释:这里的/表示从根节点开始,逐层进入。首先进入html,然后进入body,接着进入div,最后定位到p。这种方式的缺点是如果HTML结构有所变化,比如增加了新的标签,路径就可能失效。
1.2 Python示例代码
from selenium import webdriver# 创建浏览器实例
driver = webdriver.Chrome()
driver.get('http://example.com')# 通过绝对路径定位到描述信息
description = driver.find_element_by_xpath('/html/body/div/p')
print(description.text) # 输出描述信息
2. 相对路径定位
相对路径是从当前节点开始,使用相对路径定位目标元素。这种方式更灵活,常用于定位元素而不需要关注其完整路径。
2.1 例子
继续使用上面的HTML结构,要定位到描述信息,你可以使用以下XPath表达式:
//p[@class='description']
解释:这里的//表示从文档的任何位置开始查找,@class='description'用于指定类名。这种方式的好处是即使HTML结构有所变化,只要<p>标签的class属性不变,XPath仍然有效。
2.2 Python示例代码
from selenium import webdriver# 创建浏览器实例
driver = webdriver.Chrome()
driver.get('http://example.com')# 通过相对路径定位到描述信息
description = driver.find_element_by_xpath('//p[@class="description"]')
print(description.text) # 输出描述信息
3. XPath语法解析
示例 HTML 结构
<html><head><title>Sample Page</title></head><body><div id="main"><h1>Main Title</h1><div class="content"><p class="text">This is a paragraph in the content.</p><ul><li>List Item 1</li><li>List Item 2</li><li>List Item 3</li></ul></div><div class="footer"><p>Footer Text</p></div></div><div class="sidebar"><h2>Sidebar Title</h2><p>Sidebar content goes here.</p></div></body>
</html>
3.1 //和/的区别
-
/:表示从根节点开始的绝对路径。例如,/html/body意味着你从最上面的html开始查找,然后进入body。这个路径是具体且不容许有任何偏差的。 -
//:表示从任意位置开始的相对路径,能在文档的任何位置查找。它可以选择当前节点及其所有后代节点中的匹配元素,无论它们的层级关系如何。例如,//div会查找文档中所有的div元素。它的灵活性使得在复杂的文档结构中仍然能够找到目标元素。
使用 /
-
获取标题:
这条 XPath 表达式从根节点/html/head/title/html开始,选择head的title元素。它只会返回<title>Sample Page</title>。 -
获取主内容中的第一个段落:
/html/body/div[@id='main']/div[@class='content']/p[1]这个表达式从根节点开始,依次选择具有特定 ID 和类名的元素,最后选择
content下的第一个p元素,返回This is a paragraph in the content.。
使用 //
1.获取所有段落:
//p
这条 XPath 表达式会查找文档中的所有 p 元素,包括主内容中的段落和侧边栏中的段落。返回所有匹配的段落元素 ,返回 【This is a paragraph in the content.】和S【idebar content goes here.】
2.获取所有列表项:
//ul/li
这个表达式将查找所有 ul 下的 li 元素,不论其层级位置。返回所有列表项。
3.获取具有特定类名的所有元素:
//div[@class='content']//p
这个表达式从具有类名 content 的 div 开始,查找该div下所有的 p 元素。返回匹配的所有段落。返回 This is a paragraph in the content.。
3.2 /..与parent::
-
/..:表示父节点。例如,如果你定位到一个元素,使用/..可以直接获取其父节点。它的用法非常直观,像是在文件系统中返回上一级目录。 -
parent:::也是用来定位父节点的轴定位方式,它在XPath中更具表达性,通常用于复杂的XPath表达式。它可以更清晰地表述你是在寻找某个节点的父节点,而不仅仅是通过路径返回。
示例代码
# 通过/..获取父节点
parent_div = driver.find_element_by_xpath('//p[@class="description"]/..')# 通过parent::获取父节点
parent_div_alt = driver.find_element_by_xpath('//p[@class="description"]/parent::div')
4. 轴定位
XPath的轴定位允许我们从当前节点或特定节点向任意方向查找元素。这使得定位更加灵活。
4.1 常用的轴定位示例
- ancestor:选取当前节点的所有祖先节点,类似于向上追溯父母辈。
- following-sibling:选取当前节点后面的所有同级节点,比如在兄弟姐妹中找。
- preceding-sibling:选取当前节点前面的所有同级节点,仍然是在兄弟姐妹中找,但是方向相反。
4.2 其他轴定位方式
- child:选取当前节点的所有子节点,像是寻找儿女。
- descendant:选取当前节点的所有后代节点,类似于寻找孙子、孙女。
- following:选取当前节点之后的所有节点,像是在时间轴上往后看。
- preceding:选取当前节点之前的所有节点,像是在时间轴上往前看。
- self:选取当前节点,这对于某些复杂的表达式很有用。
4.3 示例代码
假设我们要选取描述信息的所有子节点,可以使用:
//div[@id='main']/child::*
要获取描述信息的所有后代节点,可以使用:
//div[@id='main']/descendant::*
4.4 Python示例代码
# 获取所有子节点
children = driver.find_elements_by_xpath('//div[@id="main"]/child::*')
for child in children:print(child.tag_name) # 输出所有子节点的标签名# 获取所有后代节点
descendants = driver.find_elements_by_xpath('//div[@id="main"]/descendant::*')
for descendant in descendants:print(descendant.tag_name) # 输出所有后代节点的标签名
5. 定位相同元素的最后一个
在一些情况下,我们需要定位多个相同类型的元素,例如列表项,并提取最后一个元素。可以使用last()函数。
5.1 示例
要定位最后一个列表项,可以使用以下XPath表达式:
//li[@class='item'][last()]
解释:last()函数能够帮助你找到同类元素中的最后一个,避免了需要计算列表长度的问题。
5.2 Python示例代码
from selenium import webdriver# 创建浏览器实例
driver = webdriver.Chrome()
driver.get('http://example.com')# 通过XPath定位最后一个具有相同类名的li元素
last_item = driver.find_element_by_xpath('//li[@class="item"][last()]')
print(last_item.text) # 输出最后一个项的文本
6. 总结
XPath是一种强大的定位工具,绝对路径、相对路径、轴定位及定位最后一个元素的方法都是常用的定位方式。通过理解//和/的区别、/..与parent::的用法,以及其他轴定位方式,可以更有效地进行元素定位。希望本文能帮助你更好地理解和使用XPath进行元素定位,提升Web自动化测试的效率。
相关文章:
Web自动化中常用XPath定位方式
在进行Web自动化测试时,元素定位是一个至关重要的环节。XPath(XML Path Language)是一种用于在XML文档中定位节点的语言。在Web自动化中,XPath广泛应用于定位HTML元素。本文将详细介绍几种常用的XPath定位方式,包括绝对…...
Unity3D播放GIF图片使用Animation来制作动画
系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、下载GIF动图,用PS制作导出帧动画图片👉二、使用Animation制作动画👉三、脚本控制动画播放👉壁纸分享👉总结👉前言 unity播放gif图片,本身是不支持的,但是可以使用其他方法来实现, 1.有一种使用System…...
redo log 和 bin log 的两阶段提交
两阶段提交的过程 当事务提交后,有一个两阶段提交策略。 在开启两阶段提交时,会开启一个 XA 事务(宏观上的事务), Prepare 阶段:将 redo log 的状态设置为 prepare,然后将 事务XID 写入 redo…...
Go基础学习07-map注意事项;多协程对map的资源竞争;sync.Mutex避免竟态条件
文章目录 Go中map使用以及注意事项map使用时的并发安全问题 Go中map使用以及注意事项 Go语言中map使用简单示例: func main() {var mp map[string]int// mp : map[string]int{}val, ok : mp["one"]if ok {fmt.Println(val)} else {fmt.Println(val)}mp[…...
远程服务器安装anaconda并创建虚拟环境
1、承接上文新用户zrcs,在服务器的zrcs文件夹下直接下载anaconda(很慢): wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh 或者选择本地下载,清华大学开源软件镜像站:https:/…...
什么是IIC通信协议?
IIC(Inter-Integrated Circuit)通信协议,又称为I2C(Inter-Integrated Circuit 2)协议,是一种广泛使用的串行通信协议。它由飞利浦半导体公司(现NXP Semiconductors)开发,…...
P3131 [USACO16JAN] Subsequences Summing to Sevens S Python题解
[USACO16JAN] Subsequences Summing to Sevens S 题目描述 Farmer John’s N N N cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to ta…...
鸿蒙NEXT开发-ArkUI(基于最新api12稳定版)
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...
Matplotlib 使用 LaTeX 渲染图表中的文本、标题和数学公式
Matplotlib 使用 LaTeX 渲染图表中的文本、标题和数学公式 Matplotlib 是一个功能强大的 Python 库,用于绘制各种高质量的图表和图形。在许多科研和技术文档中,数学公式是不可或缺的一部分,LaTeX 提供了精美的数学公式渲染能力。Matplotlib …...
Android 安卓内存安全漏洞数量大幅下降的原因
谷歌决定使用内存安全的编程语言 Rust 向 Android 代码库中写入新代码,尽管旧代码(用 C/C 编写)没有被重写,但内存安全漏洞却大幅减少。 Android 代码库中每年发现的内存安全漏洞数量(来源:谷歌)…...
c++primier第十二章类和动态内存
本章内容包括: 对类成员使用动态内存分配隐式和显式地复制构造函数隐式和显式地重载赋值操作符在构造函数中使用new所必须完成的工作使用静态类成员 将布局new操作符用于对象使用指向对象的指针实现队列抽象数据类型(ADT) 动态内存和类 复习范例和静态类成员 首…...
Ansible学习之ansible-pull命令
想要知道ansible-pull是用来做什么的,就需要了解Ansible的工作模,Ansible的工作模式有两种: push模式 push推送,这是Ansible的默认模式,在主控机上编排好playbook文件,push到远程主机上来执行。pull模式 p…...
Linux:磁盘管理
一、静态分区管理 静态的分区方法不可以动态的增加或减少分区的容量。 1、磁盘分区-fdisk 该命令是用于查看磁盘分区情况,和分区管理的命令 命令格式:fdisk [选项] 设备文件名常用命令: -h:查看分区信息 fdisk系统常用命令&…...
FP7209: 用于紫外线消毒灯的 升压LED恒流驱动芯片
现在社会对于居家消毒也越发重视起来。而居家消毒除了75%浓度酒精及各类消毒液外,利用紫外线灯给衣物表面、房间消毒也是一种很好的选择。FP7209 定位于低压线性恒流驱动,精度高、外围电路简单、使用方便且可靠性高,更可广泛应用于商业照明系…...
【华为HCIP实战课程二】OSPF基础介绍和OSPF RID NBMA配置详解
一、OSPF多区域 自治系统(Autonomous System) 一个自治系统是指使用同一种路由协议交换路由信息的一组路由器 1、Area0为骨干区域 2、ABR--关乎3类LSA后续详解 ABR用来连接骨干区域Area0和非骨干区域,它与骨干区域之间既可以是物理连接,也可以是逻辑上的连接。 3、AS…...
网络编程(13)——单例模式
十三、day13 今天学习如何单例模式实现逻辑层的设计。内容包括服务器如何能捕获信号使其安全退出、单例模标类 1. 什么是单例模式? 单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点&…...
基于定制开发与2+1链动模式的商城小程序搭建策略
摘要:本文探讨商城小程序的搭建策略,对比自主组建团队和第三方开发两种方式,强调以第三方开发模式为主的优势。阐述在第三方开发模式下,结合定制开发和21链动模式,如何搭建一款有助于企业商业模式创新与智能商业升级的…...
银河麒麟,apt 安装软件报错640Unknown Status
今天把银行麒麟的机器恢复出厂了,然后apt install 安装极其不稳定,故障现象如下图所示: 错误提示里面有: 640 Unknown Status [IP: 106.116.184.122 80] E: 无法下载 http://archive.kylinos.cn/kylin/KYLIN-ALL/pool/universe/f…...
python UNIT 3 选择与循环(2)
目录 1。循环的优化 经典优化分析: 未优化的代码: 细节分析: 优化后的代码: 优化的细节: 性能对比 优化的关键在于: 经典习题讲解:(紫色的解析请重点关注一下) 1。例三 个人代码解析…...
828华为云征文|部署在线文档应用程序 CodeX Docs
828华为云征文|部署在线文档应用程序 CodeX Docs 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 CodeX Docs3.1 CodeX Docs 介绍3.2 CodeX Docs 部署3.3 CodeX…...
046、PCIE桥设备与交换:当拓扑开始复杂起来
046、PCIE桥设备与交换:当拓扑开始复杂起来 最近在调一块自定义的PCIE扩展板,系统里突然出现了几个“神秘”的端点设备。在lspci列表里,它们出现在一个我从未配置过的总线号上,而且设备ID全对不上。折腾了两天才发现,原…...
扩展卡尔曼滤波锂电池SOC估算【附代码】
✨ 长期致力于锂离子电池、SOC估算、锂离子电池建模、EKF算法研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)二阶RC等效电路建模与温度自适应参数修正…...
ElevenLabs泰米尔语音部署踩坑实录:DNS解析超时、UTF-8 BOM导致静音、方言ID混淆——97%开发者忽略的3个关键参数
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs泰米尔语音部署踩坑实录:DNS解析超时、UTF-8 BOM导致静音、方言ID混淆——97%开发者忽略的3个关键参数 DNS解析超时:被忽略的区域路由策略 ElevenLabs 的 API 在印度…...
开关电源传导EMI超标?手把手教你用π型滤波器搞定(附SCT2450实测数据)
开关电源传导EMI超标?手把手教你用π型滤波器搞定(附SCT2450实测数据) 在电源设计领域,传导EMI超标是工程师们经常遇到的棘手问题。当你的产品在EMC实验室测试失败时,那种挫败感相信每个硬件工程师都深有体会。传导噪声…...
ARM GICv3虚拟中断控制器架构与ICV_CTLR_EL1寄存器解析
1. ARM GICv3虚拟中断控制器架构概述在ARMv8-A架构的虚拟化环境中,GICv3中断控制器通过引入虚拟CPU接口寄存器组,为虚拟机提供了与原生物理中断处理机制高度一致的虚拟中断体验。这套虚拟寄存器组与物理寄存器组采用相同的编程模型,但在访问控…...
光通信风口已至:芯片巨头加码,产业链满产满销,光进铜退成必然趋势?
英伟达聚焦光通信,产业链投入持续加码今年3月份的英伟达GPU技术大会上,英伟达创始人黄仁勋用了相当长的篇幅谈及光通信。这是因为,英伟达最新一代GPU架构中,芯片之间通过NVLink协议互联,双向带宽达到1.8TB/s。数据中心…...
如何高效配置Cool Request插件:Spring Boot接口调试的终极实践指南
如何高效配置Cool Request插件:Spring Boot接口调试的终极实践指南 【免费下载链接】cool-request IDEA API、Java Method debug tools 项目地址: https://gitcode.com/gh_mirrors/co/cool-request Cool Request是一款专为IntelliJ IDEA设计的强大HTTP接口调…...
Linux僵死IO与不可中断睡眠分析
Linux僵死IO与不可中断睡眠分析在 Linux 系统里,有一类问题特别让人困惑:进程存在、CPU 不高,但命令卡住、服务停不下来、甚至 kill 也无效。很多这类现象最终都与不可中断睡眠状态有关,尤其常见于 IO 阻塞场景。中级阶段需要理解…...
通达信缠论插件ChanlunX:3分钟实现专业缠论分析的完整解决方案
通达信缠论插件ChanlunX:3分钟实现专业缠论分析的完整解决方案 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 你是否曾经面对复杂的K线图感到无从下手?是否因为缠论的手工绘制耗时…...
骨传导耳机品牌Mojawa完成数千万元A+轮融资,发力AI运动智能平台
硬氪获悉,苏州索迩电子技术有限公司近日完成数千万元人民币的A轮融资,由正海资本领投。资金将用于拓展海外线下渠道和推进产品AI智能化研发。骨传导耳机市场增长显著在音频产品市场,骨传导耳机因无线和开耳式聆听技术需求增加而显著增长。202…...
