教你玩转XPATH
上一篇 /
下一篇 2015-12-04 13:45:02
/ 个人分类:selenium自动化测试
xpath是一种在xml中查找信息的语言,普遍应用于xml中,在类xml的html中也可以使用,在selenium自动化中起核心作用,是写selenium自动化脚本的基础。 本文主要说明xpath的元素定位方法(我自己的叫法,非官方),其他方面不做说明。 |
xpath的定位只要由路径定位、标签定位、轴定位组合构成,外加筛选功能进行辅助,几乎可以定位到任意元素。 |
标签定位:通过标签名即可找到文档中所有满足的标签元素,如: div | 找到所有的div标签元素 | input | 找到所有的input标签元素 | * | 替代任意元素或属性 | @属性名 | 找到指定名称的属性 |
|
路径定位:通过路径描述来找到需要的元素,“/”开头表示从根路径开始,其他位置表示子元素或分隔符;“//”表示后代元素;“..”表示父元素(上一级);“.”表示当前元素;“|”表示多条路径 /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 |
|
轴定位:通过轴运算符加上“::”和“标签”,找到需要的元素,类似路径定位,如: //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元素同级别的,且在它之前的所有元素 |
下表是轴运算符的列表 ancestor | 选取当前节点的所有先辈(父、祖父等) | ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 | attribute | 选取当前节点的所有属性 | child | 选取当前节点的所有子元素。 | descendant | 选取当前节点的所有后代元素(子、孙等)。 | descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 | following | 选取文档中当前节点的结束标签之后的所有节点。 | namespace | 选取当前节点的所有命名空间节点 | parent | 选取当前节点的父节点。 | preceding | 选取文档中当前节点的开始标签之前的所有节点。 | preceding-sibling | 选取当前节点之前的所有同级节点。 | following-sibling | 选取当前节点之后的所有同级节点。 | self | 选取当前节点 |
|
筛选:通过以上方法找出来的元素会找到很多你本意不需要的元素,因此还需要通过一些筛选运算来找到对应的元素,筛选方式多种多样,下面的各种例子助你定位又快又准。 通用的筛选条件是以[xxxx]形式出现的(上面的例子中已有体现),常见筛选如下: A、属性筛选:属性名前+@来表示属性,如下 //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开始),或排序运算查找元素 //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个 |
收藏
举报
TAG: