51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1615|回复: 0
打印 上一主题 下一主题

[原创] 教你玩转XPATH

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-10-8 17:48:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 joy3mao 于 2016-10-9 16:50 编辑

[size=13.3333px]
XPATH是什么?
xpath是一种在xml中查找信息的语言,普遍应用于xml中,在类xml的html中也可以使用,在selenium自动化中起核心作用,是写selenium自动化脚本的基础。
本文主要说明xpath的元素定位方法(我自己的叫法,非官方),其他方面不做说明。
[size=13.3333px]
xpath的定位
xpath的定位只要由路径定位、标签定位、轴定位组合构成,外加筛选功能进行辅助,几乎可以定位到任意元素。
标签定位:通过标签名即可找到文档中所有满足的标签元素,如:
[td]
xpath
说明
div找到所有的div标签元素
input找到所有的input标签元素
*替代任意元素或属性
@属性名找到指定名称的属性

路径定位:通过路径描述来找到需要的元素,“/”开头表示从根路径开始,其他位置表示子元素或分隔符;“//”表示后代元素;“..”表示父元素(上一级);“.”表示当前元素;“|”表示多条路径
[td]
xpath
说明
/html找到元素html
//div找到所有的div元素
//div[@id='id1']/span找到id=“id1”的div元素的子元素span
//div[@id='id1']//span找到id=“id1”的div元素下的所有后代元素span
//div[@id='id1']/@class找到id=“id1”的div元素的class属性
//div[@id='id1']/span|//div[@id='id2']/span找到id=“id1”和id=“id2”的div元素的子元素span

轴定位:通过轴运算符加上“::”和“标签”,找到需要的元素,类似路径定位,如:
[td]
xpath
说明
//div[@id='id1']/child::span找到id=“id1”的div元素的子元素span,同//div[@id='id1']/span
//div[@id='id1']/attribute::class找到id=“id1”的div元素的class属性,同//div[@id='id1']/@class
//div[@id='id1']/preceding-sibling::*找到与id=“id1”的div元素同级别的,且在它之前的所有元素

下表是轴运算符的列表
[td]
轴名称
结果
ancestor选取当前节点的所有先辈(父、祖父等)
ancestor-or-self选取当前节点的所有先辈(父、祖父等)以及当前节点本身
attribute选取当前节点的所有属性
child选取当前节点的所有子元素。
descendant选取当前节点的所有后代元素(子、孙等)。
descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following选取文档中当前节点的结束标签之后的所有节点。
namespace选取当前节点的所有命名空间节点
parent选取当前节点的父节点。
preceding选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling选取当前节点之前的所有同级节点。
following-sibling选取当前节点之后的所有同级节点。
self选取当前节点

筛选:通过以上方法找出来的元素会找到很多你本意不需要的元素,因此还需要通过一些筛选运算来找到对应的元素,筛选方式多种多样,下面的各种例子助你定位又快又准。
通用的筛选条件是以[xxxx]形式出现的(上面的例子中已有体现),常见筛选如下:
A、属性筛选:属性名前+@来表示属性,如下
[td]
xpath
说明
//div[@class='class1']
筛选class属性值等于class1的div
//div[@hight>10]筛选hight属性值大于10的div(仅限数字)
//div[text()='divtext']筛选文本是divtext的div
//div[contains(@class,'class1')]筛选class属性中包含class1的div
//div[contains(text(),'text1')]筛选文本包含text1的div
//div[text()='text1' and @class=‘class1’]同时满足两个条件的筛选,类似的,“或者” 的话用“or”,运算优先级高的用"()"括起来
//div[text()='text1' and not(@class)]筛选文本包含 text1,且无class属性的 div

B、序号筛选:通过序号(从1开始),或排序运算查找元素
[td]
xpath
说明
//div[@id='id1']/span[1]找到id=“id1”的div元素后代的第一个span元素,如[4]则是第4个
//div[@id='id1']/span[last()]找到id=“id1”的div元素子元素的最后一个span元素,如[last()-2]则是倒数第3个
//div[@id='id1']/span[position()>2 and position() < 7]找到id=“id1”的div元素后代的第3、4、5、6个span元素
//div[@id='id1']/text()[2]
找到id=“id1”的div元素的第二段文本(注:此处用于文本被子元素分割,需要选择后面文本的情况:
如<div id="id1">this is text one<strong>haha</strong>this is text two</div>)

特别注意:序号筛选时,指定是当前元素的同级的第n个,如果当前元素的祖先中有元素不是唯一的,那么序号筛选是无效的。
通过括号将祖先括起来,再指定序号,可以使当前元素前的祖先是指定的、且唯一的,如:
(//div[@class='class1']//span[@class='class2'])[1]/div[3]
这样就可以十分准确的定位到需要span下的第3个div,没有此括号,当//div[@class='class1']//span[@class='class2']找到多个元素时,就算用[3]也则只能定位到第1个

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-22 06:28 , Processed in 0.065344 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表