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

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元素。它的灵活性使得在复杂的文档结构中仍然能够找到目标元素。

使用 /
  1. 获取标题

    /html/head/title
    这条 XPath 表达式从根节点 /html 开始,选择 headtitle 元素。它只会返回 <title>Sample Page</title>
  2. 获取主内容中的第一个段落

    /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

        这个表达式从具有类名 contentdiv 开始,查找该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自动化测试时&#xff0c;元素定位是一个至关重要的环节。XPath&#xff08;XML Path Language&#xff09;是一种用于在XML文档中定位节点的语言。在Web自动化中&#xff0c;XPath广泛应用于定位HTML元素。本文将详细介绍几种常用的XPath定位方式&#xff0c;包括绝对…...

Unity3D播放GIF图片使用Animation来制作动画

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、下载GIF动图,用PS制作导出帧动画图片👉二、使用Animation制作动画👉三、脚本控制动画播放👉壁纸分享👉总结👉前言 unity播放gif图片,本身是不支持的,但是可以使用其他方法来实现, 1.有一种使用System…...

redo log 和 bin log 的两阶段提交

两阶段提交的过程 当事务提交后&#xff0c;有一个两阶段提交策略。 在开启两阶段提交时&#xff0c;会开启一个 XA 事务&#xff08;宏观上的事务&#xff09;&#xff0c; Prepare 阶段&#xff1a;将 redo log 的状态设置为 prepare&#xff0c;然后将 事务XID 写入 redo…...

Go基础学习07-map注意事项;多协程对map的资源竞争;sync.Mutex避免竟态条件

文章目录 Go中map使用以及注意事项map使用时的并发安全问题 Go中map使用以及注意事项 Go语言中map使用简单示例&#xff1a; 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&#xff0c;在服务器的zrcs文件夹下直接下载anaconda&#xff08;很慢&#xff09;&#xff1a; wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh 或者选择本地下载&#xff0c;清华大学开源软件镜像站&#xff1a;https:/…...

什么是IIC通信协议?

IIC&#xff08;Inter-Integrated Circuit&#xff09;通信协议&#xff0c;又称为I2C&#xff08;Inter-Integrated Circuit 2&#xff09;协议&#xff0c;是一种广泛使用的串行通信协议。它由飞利浦半导体公司&#xff08;现NXP Semiconductors&#xff09;开发&#xff0c;…...

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稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

Matplotlib 使用 LaTeX 渲染图表中的文本、标题和数学公式

Matplotlib 使用 LaTeX 渲染图表中的文本、标题和数学公式 Matplotlib 是一个功能强大的 Python 库&#xff0c;用于绘制各种高质量的图表和图形。在许多科研和技术文档中&#xff0c;数学公式是不可或缺的一部分&#xff0c;LaTeX 提供了精美的数学公式渲染能力。Matplotlib …...

Android 安卓内存安全漏洞数量大幅下降的原因

谷歌决定使用内存安全的编程语言 Rust 向 Android 代码库中写入新代码&#xff0c;尽管旧代码&#xff08;用 C/C 编写&#xff09;没有被重写&#xff0c;但内存安全漏洞却大幅减少。 Android 代码库中每年发现的内存安全漏洞数量&#xff08;来源&#xff1a;谷歌&#xff09…...

c++primier第十二章类和动态内存

本章内容包括&#xff1a; 对类成员使用动态内存分配隐式和显式地复制构造函数隐式和显式地重载赋值操作符在构造函数中使用new所必须完成的工作使用静态类成员 将布局new操作符用于对象使用指向对象的指针实现队列抽象数据类型(ADT) 动态内存和类 复习范例和静态类成员 首…...

Ansible学习之ansible-pull命令

想要知道ansible-pull是用来做什么的&#xff0c;就需要了解Ansible的工作模&#xff0c;Ansible的工作模式有两种&#xff1a; push模式 push推送&#xff0c;这是Ansible的默认模式&#xff0c;在主控机上编排好playbook文件&#xff0c;push到远程主机上来执行。pull模式 p…...

Linux:磁盘管理

一、静态分区管理 静态的分区方法不可以动态的增加或减少分区的容量。 1、磁盘分区-fdisk 该命令是用于查看磁盘分区情况&#xff0c;和分区管理的命令 命令格式&#xff1a;fdisk [选项] 设备文件名常用命令&#xff1a; -h&#xff1a;查看分区信息 fdisk系统常用命令&…...

FP7209: 用于紫外线消毒灯的 升压LED恒流驱动芯片

现在社会对于居家消毒也越发重视起来。而居家消毒除了75%浓度酒精及各类消毒液外&#xff0c;利用紫外线灯给衣物表面、房间消毒也是一种很好的选择。FP7209 定位于低压线性恒流驱动&#xff0c;精度高、外围电路简单、使用方便且可靠性高&#xff0c;更可广泛应用于商业照明系…...

【华为HCIP实战课程二】OSPF基础介绍和OSPF RID NBMA配置详解

一、OSPF多区域 自治系统(Autonomous System) 一个自治系统是指使用同一种路由协议交换路由信息的一组路由器 1、Area0为骨干区域 2、ABR--关乎3类LSA后续详解 ABR用来连接骨干区域Area0和非骨干区域,它与骨干区域之间既可以是物理连接,也可以是逻辑上的连接。 3、AS…...

网络编程(13)——单例模式

十三、day13 今天学习如何单例模式实现逻辑层的设计。内容包括服务器如何能捕获信号使其安全退出、单例模标类 1. 什么是单例模式&#xff1f; 单例模式&#xff08;Singleton&#xff09;&#xff0c;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点&…...

基于定制开发与2+1链动模式的商城小程序搭建策略

摘要&#xff1a;本文探讨商城小程序的搭建策略&#xff0c;对比自主组建团队和第三方开发两种方式&#xff0c;强调以第三方开发模式为主的优势。阐述在第三方开发模式下&#xff0c;结合定制开发和21链动模式&#xff0c;如何搭建一款有助于企业商业模式创新与智能商业升级的…...

银河麒麟,apt 安装软件报错640Unknown Status

今天把银行麒麟的机器恢复出厂了&#xff0c;然后apt install 安装极其不稳定&#xff0c;故障现象如下图所示&#xff1a; 错误提示里面有&#xff1a; 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。循环的优化 经典优化分析&#xff1a; 未优化的代码&#xff1a; 细节分析&#xff1a; 优化后的代码&#xff1a; 优化的细节&#xff1a; 性能对比 优化的关键在于&#xff1a; 经典习题讲解&#xff1a;(紫色的解析请重点关注一下) 1。例三 个人代码解析…...

828华为云征文|部署在线文档应用程序 CodeX Docs

828华为云征文&#xff5c;部署在线文档应用程序 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…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...