自动化测试(1):Xpath详解

XPath使用路径表达式来选取XML文档中的节点或者节点集。(一种找元素的定位方式)
定位元素的总结有以下6种方式:(一般自动化都是为了定位唯一的一个)

文章目录

举例网站:https://www.w3school.com.cn/example/xmle/books.xml
打开上面的网址,F12出现源码Elements,然后点击ctrl+f,出现一个输入框,框支持写Xpath的表达式
在这里插入图片描述

(1)相对路径定位
(1)相对路径(两个//表示任意一层都能找到)(推荐使用)
//book表示找到所有的book节点(一共有4个book节点)
//book[1]表示找到第一个book节点
//book[4]或者//book[last()]表示找到最后book节点

(2)绝对路径(一个/表示依赖上一级的路径)

//bookstore/book
//bookstore/book[2]/author
加text()表示定位到author节点下的文本(chrome没有获取到,可以使用火狐的插件)
//bookstore/book[2]/author/text() 
 
相对路径下可以使用绝对路径或者相对路径 
//bookstore//year      表示相对路径下使用相对路径
//bookstore/book/year   表示相对路径下使用绝对路径

注意:下面是在同一个父节点和不在同一个父节点下的区别
<bookstore>
<book><author lang="en">a</author></book>
<book><author lang="en">b</author></book>
<book><author lang="en">c</author></book>
<book><author lang="en">d</author></book>
</bookstore>

第一种情况:4个book全都在同一个父节点下,使用序号可以正确遍历
//book[1]
//book[2]
第二种情况:author不在同一个父节点下,所以找的时候,是不能使用序号遍历的
//book/author      找到4//book/author[1]   找到4//book/author[2]   找到0
(2)使用单个唯一的属性,来定位唯一元素,推荐使用id,或者其他唯一的属性
@表示属性,*是任意(一般不使用*,不精确),..表示当前元素的上一级(即父节点),.或者text()表示节点的文本内容

找包含category="cooking"属性的所有节点
//*[@category='cooking']
找包含category="cooking"属性的所有节点的上一级
//*[@category='cooking']/price/..
找文本内容为29.99的节点
//book/price[text()=29.99]
//book/price[.=29.99]
(3)基于多个属性的组合,使用not and or来定位,通过组合来确定唯一元素
(not):找到某个节点下没有属性的所有节点
//bookstore/book[1]/*[not (@*)](and):找到某个节点下同时包含两个属性的节点
//book[@category and @cover](or):找到某个节点下包含任意一个属性的节点(注意找的节点可能会重复,重复的话只取一次)
//book[@category or @cover]
(4)基于文本和属性的模糊定位
文本模糊定位:模糊查找文本值包含29的节点
//book/price[contains(.,"29")]        
属性模糊定位:模糊查找属性值包含e的节点
//book/title[contains(@lang,"e")]     
(5)通过axis(轴)来定位
Xpath的轴,即基于相对位置找(先找到某个节点,再根据这个节点进行查找)
(5-1)找当前节点的同一级的前后节点(注意写*会默认到Elements的第一个节点)
找文本节点值=29.99的节点的前一个year节点
//*[.=29.99]/preceding-sibling::year  
找文本节点值='J K. Rowling'的节点的前一个title节点          
//*[.='J K. Rowling']/preceding-sibling::title 
找文本节点值='J K. Rowling'的节点的后一个price节点 
//*[.='J K. Rowling']/following-sibling::price  

(5-2)找当前节点的上一级的节点 
找文本节点值='J K. Rowling'的节点的上一级的节点book
//*[.='J K. Rowling']/parent::book 
   
(5-3)找当前节点的下一级的节点
找当前节点book[1]的下一级的title节点
//book[1]/child::title 
找当前节点book[1]的下一级的所有节点(一般自动化只是为了定位一个,不是一大堆)   
//book[1]/child::* 


(注意如果两个节点不在同一个节点里面,这两个节点没有任何关系,例如下方的title节点和h1节点)
<html>
	<head>
    		<title></title>
	</head>
	<body>
                <h1>新闻标题</h1>
                <p>正文</p>
	</body>
</html>       
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值