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…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
