XPath扩展识别

XPath在元素识别过程中十分强大,通过FirePath,能够快速、准确获得一个元素的XPath路径,但有的时候,如果对XPath已经比较熟练了,就可以手写XPath了。以下,介绍两种更加常用的XPath定位扩展能力,一个是层级结合,一个是属性运算。

层级结合

层级结合是指按照元素在Dom中的位置(索引)信息定位元素,XPath层级结合路径模板:

 # 基础XPath定位模板
.//{标签}[@{属性}='值']
# 层级结合XPath定位模板
.//{标签}[@{属性}='值']/{新的路径}
 

以上第二个就是XPath层级结合路径的模板,相比于基础模块就是多了 /{新的路径} ,其中,新的路径又是由基础XPath定位模板组成,后者是前者的 Children 节点!

如上,百度搜索按钮的元素位置,可以看出,这是一个input标签,同时也是class=”bg s_btn_wr“的span标签的children。用XPath来定位这个span元素,写法:

.//span[@class="bg s_btn_wr"]

那么,定位搜索按钮就可以简单的写成:

.//span[@class="bg s_btn_wr"]/input

如果span下面有多个input呢,可以写作:

# 定位span下的第2个元素,
.//span[@class="bg s_btn_wr"]/input[1]

更多写法大家可以自己摸索

属性运算

属性运算就是通过and,or等逻辑运算来定位元素,这种定位元素的方法可以返回一个或者多个元素。属性运算的XPath模板也是在基础模板进行的扩展,and表示与,去交集,or表示并,去并集。XPath模块:

# 属性运算XPath定位模板
.//{标签}[@{属性}='值' {属性运算 and|or} @{属性}='值']

例如,百度搜索框的元素:

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

百度搜索框是一个input元素,有id属性,同时也有name、class属性。可以通过id进行定位,同时也可以通过其他属性定位。

那么,id定位和其他属性定位有什么区别呢?

id定位就类似于一个人的身份证,每个人都有唯一的身份证id,通过这个id就能够找到这个人(元素);但是,name就类似于一个人的姓名,存在很多同名的情况,如果单纯通过姓名找人(元素),就可能找到同名的多个人,那么,为了进一步缩小这个范围,可以添加其他属性,例如class。

以上百度输入框为例,通过name和class来定位元素,可以写成:

# 定位百度输入框
.//input[@name='wd' and @class='s_ipt']

最后

大家会看到XPath是非常强大,也是十分灵活的。可以通过绝对路径绝对路径定位,还可以通过简化(相对)路径,以及层级结合、属性运算等方式。所以,对于XPath定位元素,大家一定要很好地掌握、灵活运用。

IT赶路人

专注IT知识分享