XPath是另一种元素定位方式,就是通过元素在Dom中的位置进行定位。关于XPath的定义:
XPath 即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。
XPath定位的过程中,分为两种类型,完整路径定位和相对路径定位。在Selenium自动化测试中,同学们可以使用这种强大语言的HTML元素定位方式。在Firefox中,借助于FirePath插件,能够快速获取一个元素的XPath。
认识XPath
首先,一起通过Dom树形结构来看看一个元素的位置信息。
见上图中,一步一步展开元素标签,最外层是html,其次是body,然后是id为wrapper的div,随后是id为head的div,进一步是id为s-top-left的div。在id为s-top-left的div中的第一个元素就是“新闻”所在的标签。
可以看到,定位“新闻”所在标签,用到了Dom树,以及排序等信息。这个过程其实就是XPath定位元素的过程。
在WebDriver中,XPath定位元素方法:
# 通过xpath定位元素
find_element_by_xpath()
XPath完整路径定位
XPath路径语言其实是一种规则,按照这个规则,一步一步进行下去就能够定位到需要的元素。这个过程如果人工定位会相对困难,且容易出错。通过FirePath插件,点击指定的元素就能够快速显示其XPath:
那么,依然以搜索Bela为例,将原来使用ID、Name定位的代码进行一个改写:
XPath相对路径
绝对路径定位是否能简化呢,这就是相对路径,能够缩短XPath的路径,同时达到相同的效果。那么,怎么获取相对路径呢,除了人工处理外,FirePath同样能帮我们快速获得相对路径。获取相对路径还是绝对路径,需要配置XPath,如下,取消
Generate absolute XPath
, FirePath获取的路径就是相对路径了:
将绝对定位直接换成相对定位,看代码:
从上面看到,输入xpath:
.//*[@id='kw']
,而搜索按钮:
.//*[@id='su']
。现在可以看到,XPath定位这两个元素使用的路径就缩短了很多。细心的同学会发现,相对路径里面有一个很重要的关键字就是id,是的,其实,这里xpath就是使用的id寻找的这个元素。
属性定位
XPath的相对路径定位其实是一种属性定位,就是利用一个元素的属性来定位元素。参考XPath相对定位,通用模板:
.//{标签}[@{属性}='值']
这个模板包含3个占位符:标签、属性、值。例如,如果我们希望定位一个id为kw的input标签,就可以写成:
# 百度输入框属性定位
.//input[@id='kw']
比如如下标签:
<a href="http://www.baidu.com/more/" name="tj_briicon" class="s-bri c-font-normal c-color-t" target="_blank">更多</a>
对于的属性定位格式:
.//a[@name='tj_briicon']
最后
相比于id,name等的元素定位方式,XPath在元素定位过程中更加灵活、强大,但使用起来也相对困难,个人建议,考虑后期测试用例的维护成本,能用id、name等简单方式定位元素的地方,就用简单的方式!