XPath语法:在XML文档中定位和选择节点的利器

news2024/11/24 7:29:55

XPath(XML Path Language)是一种用于在XML文档中定位和选择节点的语言。它提供了强大的定位和选择能力,使开发人员能够准确、灵活地定位所需的元素。本篇博客将介绍XPath的语法和常用定位方法,帮助你在Web自动化测试等场景中更好地应用XPath。

一、xpath定位

  1. xpath定位特点
    • 万能定位方式
    • 支持文本内容进行定位
    • 支持根据元素的多个属性进行定位
    • 支持通过元素层级关系定位
  2. xpath定位分类
    • 绝对路径定位
    • 体现父子关系、兄弟关系
    • 过于依赖当前页面元素结构,不稳定
    • 相对路径定位
      • 不考虑位置,不考虑层级
      • 在整个html页面找,只要表达式能匹配到就可以

二、XPath语法基础

XPath使用路径表达式来定位节点,路径表达式由一系列的节点和运算符构成。以下是XPath语法中常用的基础元素:

  • //:选择文档中的所有节点。
  • /:从根节点开始的绝对路径。
  • .:表示当前节点。
  • ..:表示当前节点的父节点。
  • @:选择节点的属性。

XPath还支持使用通配符来进行节点选择:

  • *:匹配任意节点。
  • @*:匹配任意属性。

三、节点定位

XPath可以根据节点的层次结构和节点关系进行定位。下面是几种常见的节点定位方式:

1. 标签名

  • 绝对路径
从 根标签/html 开始,逐层书写的路径
⼀般不⽤
# ⽤户名
/html/body/div/fieldset/form/p/input
/html/body/div/fieldset/form/p[1]/inpu
  • 相对路径
    ``yacas
    从任意标签开始书写的路径
    //标签名
    //form/p/input
    //form/p[1]/input

比如:

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')

# 使用相对路径进入百度,搜索ui自动化
driver.find_element_by_xpath('//div/form/span/input').send_keys('ui 自动化')
# 点击[搜索]
driver.find_element_by_xpath('//div/form/span[2]/input').click()
time.sleep(3)
driver.quit()

2. 属性定位

语法:

使用标签的任意属性,来定位标签元素
//标签名[@属性名="属性值"]

//*[@属性名="属性值"]
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')

# 输入 自动化测试,点击搜索按钮
driver.find_element_by_xpath("//span/input[@name='wd']").send_keys('自动化测试')
driver.find_element_by_xpath("//*[@value='百度一下']").click()
time.sleep(3)
driver.quit()

3. 文本定位

  1. 精确匹配

    1. 完整的文本内容
    //*[text()='文本内容']
    
  2. 模糊匹配(包含文本内容)

    2. 使用部分文本内容
    //*[contains(text(),'部分文本内容')]
    3. 使用部分属性值
    //*[contains(@属性名,'部分属性值')]
    

4. 逻辑运算

在 定位元素的时候, 使⽤单⼀属性不能确定唯⼀的元素,此时可
以使⽤ 逻辑运算符 and 连接另⼀个属性
//*[@属性名="属性值" and @属性名="属性值"]
多个属性通过or做逻辑运算(满足任意一个)
//*[@属性名='属性值'] or @属性名='属性值']
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')

# 输入 自动化测试,点击搜索按钮
# 属性与逻辑结合
driver.find_element_by_xpath("//input[@name='wd' and @class='s_ipt']").send_keys('python')
# 属性与层次结合
print(driver.find_elements_by_xpath("//*[@class='bg s_btn_wr']/input"))
# time.sleep(1)
driver.find_element_by_xpath("//*[@class='bg s_btn_wr']/input").click()
time.sleep(3)
driver.quit()

注意:

如果一个元素class有多个,比如:

image-20230508084842169

如果选择“搜索”按钮,则对应的XPATH应该是://*[@class='bg s_btn_wr']/input];

而不能只写一个属性,比如://*[@class='bg']/input这个的则不行

四、轴定位

定义:同过元素的相对位置来定位,相对的位置就叫轴
语法:已知元素/轴名称::标签名称[@属性名称=“属性值” and @属性名称=“属性值”"]
//轴:在当前节点下所有子孙节点去找元素
/轴:在当前之后的所有节点去找元素(递归所有兄弟节点)

1. 子节点轴

子节点是选择某个节点的所有直接子节点。使用child::关键字

//div/child::span
# 表示选择所有div节点的直接子节点中的span节点
  1. 父节点轴:parent
    父节点轴:选择某个节点的所有直接子节点。使用parent::关键字表示。
//span/parent:div
#表示选择所有的span节点的父节点中的div节点
//div[text()=" 课程教学 "]/parent::div
//div[text()=" 课程教学 "]/parent::div/parent::div
  1. 祖先节点ancestor(包含父节点)
    祖先节点轴:选择某个节点的父节点。它使用ancestor::关键字表示。
//span//ancestor::div 
# 表示`span`节点的祖先节点中的`div`节点
  1. 后续节点轴:following
    表示选择某个节点之后的所有节点。使用following::关键字表示。
//div/following::span
#表示所有div节点之后的span节点
  1. 前置节点轴:preceding
    表示选择某个节点之前的所有节点;使用preceding::关键字表示
//div/preceding::span
  1. 后续兄弟节点轴following-silbing
    表示某个节点之后的所有同级节点。使用following-silbing::关键字表示。
//div/following-sibiling::span
# 表示选择所有div节点之后的同级的所有span节点
  1. 前置兄弟节点轴preceding-sibling
    表示选择某个节点之前的所有同级节点,使用preceding-sibling::关键字表示
//div/preceding-sibiling::span
# 表示选择所有div节点之前的同级的所有`span`节点

轴定位可以根据节点之间的关系进行更精确的定位,使得XPath表达式更加灵活和具有表达力。通过灵活运用轴定位,可以定位到更具体的节点,满足特定的需求。

结语

XPath是一个强大且灵活的语言,它在XML文档中的节点定位和选择方面提供了丰富的功能。通过熟悉XPath的语法和常用定位方法,你可以更加高效地在自动化测试、Web数据抓取等场景中应用XPath,提升开发效率。希望本篇博客能够帮助你更好地理解和应用XPath。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Glob 文件匹配

前言 glob本质是Unix shell 风格的路径匹配规则。 该规则后续被其它语言支持。 ?:匹配一个任意字符 *:匹配任意个任意字符 [sequence]:匹配出现在sequence里面的一个字符 [!sequence]:匹配没有出现在sequence里面的一个字符 [a…

【解决】CSS下拉菜单不会显示的问题

导航栏的下拉菜单显示,但按 F5 刷新的一瞬间又能看见 下拉菜单的内容,但就是不会显示出来,一开始以为是 js 代码写错或者 css 的动画函数的影响,后面找到一篇博客,说这是老生常谈的问题,对于小白确实很难找…

移动应用数据安全性:如何防止应用程序被黑客攻击和数据泄露?

第一章:引言 在移动应用成为人们生活中不可或缺的一部分的今天,数据安全性已经成为一个非常重要的问题。随着黑客攻击和数据泄露事件的频繁发生,用户对于移动应用程序的信任度也在逐渐下降。本文将探讨移动应用数据安全性的重要性&#xff0…

chatgpt赋能Python-pythongpu加速

Python GPU加速:让你的Python应用飞速运行 介绍 Python是一种高级编程语言,具有易于学习、易于使用和强大的功能。作为一门解释型语言,Python会在运行时逐行解释程序代码,而这种解释方式会导致Python在运行速度上较慢。在需要大…

2023上半年软考系统分析师科目一整理-01

2023上半年软考系统分析师科目一整理-01 1. 面向对象2. UML 1. 面向对象 面向对象分析中,对象是类的实例。对象的构成成分包含了(A),属性和方法(或操作)。 A.标识 B.消息 C.规则 D.结构 对象的三要素为&am…

linux服务器安装python环境配置

linux服务器安装python环境配置 服务器跳板机服务器配置配置anaconda环境安装其他python版本卸载anaconda root用户为用户添加权限其他工具Jupyter Noetbooktmux 服务器跳板机 跳板机是一个可以从公共网络访问的服务器,它允许用户通过 SSH 连接进入私有网络中的其他…

AI绘画-Midjourney基础2-创意之旅启航:超强二次元风格模型 niji 5

niji 模型是 mj 的一种模型,可以生成二次元风格的图片。 在控制台输入 /settings 指令,进入设置页面。 选择第二行的 Niji version 5 模型,就可以创作二次元风格的图片了! niji 5 模型还有 expressive、cute、scenic 3种风格可以…

【C++初阶】类与对象(中)之取地址及const取地址操作符重载(了解即可)

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

chatgpt赋能Python-pythongroup

PythonGroup:提高Python技能和构建社交网络的绝佳平台 PythonGroup是一家致力于为Python编程者提供高质量资源和社交网络的平台。无论您是新手还是有十年以上的经验,PythonGroup都可以帮助您提高您的技能,增加您的知识和职业发展机会。 Pyt…

t检验与Z检验的区别

在统计学中,假设检验是评估某种特定情况下观察到的数据是否符合假设的一种方法。t检验和Z检验是两种常用的假设检验方法,分别用于比较均值差异以及比例差异。在医学统计中,t检验和Z检验经常被用于研究和比较不同治疗方法的效果,例…

chatgpt赋能Python-pythonfor遍历列表

Python for循环:遍历列表 - 提高您的编程技能 列表是Python编程语言中广泛使用的数据结构。在许多情况下,我们需要遍历列表中的元素。Python中的for循环是一种最常用的遍历列表的方式。在本文中,我们将介绍如何使用Python的for循环语句遍历列…

SSRS rdlc报表之创建报表 一

环境 vs2019 fromwork4.5 第一步 安装rdlc报表插件 vs2019使用rdlc,需要安装扩展插件,扩展→扩展管理→联机,搜索rdlc,安装Microsoft RDLC Report Designer,我在安装过程中,安装了很久都没安装成功&…

一、数据字典介绍

文章目录 一、数据字典介绍1、页面效果2、表设计3、数据分析4、根据页面效果分析数据接口 一、数据字典介绍 何为数据字典?数据字典就是管理系统常用的分类数据或者一些固定数据,例如:省市区三级联动数据、民族数据、行业数据、学历数据等&a…

Spring Boot系列(一):Spring Boot 入门篇

目录 对于学习Java的童鞋来说,可都是有用的博文,也是我悉心选择推荐给大家的。这次为大家带来的系列文章是关于Spring Boot的,Spring Boot对Javaer来说应该是很常用的一个框架。希望这个系列能对大家有用!​编辑 快速入门 总结 …

C语言的位运算

1. 位操作符综述 位操作有逻辑运算和移位运算,如位与、位或、位取反、按位异或、移位等操作。位运算通常会和底层代码寄存器的操作结合在一起使用,比如想要让寄存器中的任意1位或者任意几位位设置为1,或者设置为0,从而实现对寄存…

chatgpt赋能Python-pythongame怎么样

Python Game:打造属于自己的游戏 Python是一种全球流行的编程语言,因其简洁易懂、高效稳定,被广泛应用于各类软件、网站与游戏的开发领域。其中,Python Game成为许多开发者的关注焦点,不同于传统游戏开发的复杂与繁琐…

【音视频开发】摄像头和ISP的基本介绍

文章目录 一、摄像头的基本知识1.1 摄像头结构1.2 摄像头模组的种类1.3 摄像头的工作原理 二、Sensor的基本知识2.1 Sensor的工作原理2.2 Sensor的分类2.3 Sensor的封装形式2.4 常见的Sensor厂商2.5 Sensor的基本框图 三、ISP的基本知识3.1 ISP的定义3.2 ISP的工作原理 四、ISP…

拥抱生成式大模型 --- 提示工程篇

本文为系列的第二篇,主要是学习和总结chatgpt类模型的提示工程。感谢吴恩达老师的开源课程。 引言 随着大型语言模型(LLM)的发展,LLM 大致可以分为两种类型,即基础LLM和指令微调LLM。基础LLM是基于文本训练数据&…

栈和队列 - C语言实现

目录 栈 栈的概念 栈的实现 队列 队列的概念 队列的实现 栈 栈的概念 栈是一种后进先出 (LIFO - last in first out) 的数据结构,通常利用数组或链表实现。栈只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另…

JavaWeb14 - 异步请求 - 02 - Ajax

1. 概述 1.1 官方文档 Ajax 在线文档:https://www.w3school.com.cn/js/js_ajax_intro.asp 1.2 Ajax 基本介绍 1.2.1 Ajax 是什么 AJAX 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML)Ajax 是一种浏览器异步发起请求(指定发哪些数据)&…