我们在使用Selenium写测试用例的时候,如果元素存在id或者name属性,那么使用id,name定位最方便,如果没有id或者是name或者是很不好定位等等,免不了要用到XPath定位。XPath 是一种XML的查询语言,我们使用的html也是xml形式的语言。开始学习时,可以借助一些工具,如Chrome中的“审查元素“和FireFox中的”XPath checker“等等。使用XPath表达式的开头加上"xpath="是好习惯也可以不加.如下面的两个效果是一样的:
//div/input
xpath=//div/input
下面介绍它的使用方法。
另外需要知道的是:当xpath表达式匹配到的内容有多个时,seleium默认的是取第一个
XPath中的一个斜线(/)代表这是一个绝对路径,表示从根节点选取(表示经过一层,直接定位元素)。两个斜线(//)这是一个相对路径,从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(代表可以经过很多层,此节点下面所有符合此模式的元素都会被选出来,即使是处于不同的层也会被选出来)。例如:
<html>
<head>
<title>测试一下 </title>
</head>
<body>
<divid="wrapper" name="wra">
<divid="content">
<divid="u">
<ahref="http://www.baidu.com/gaoji/preferences.html"name="tj_setting">搜索设置</a>
</div>
</div>
</div>
<divid="m">
<pid="lg"><img src="http://www.baidu.com/img/bdlogo.gif"width="270" height="129"></p>
</div>
<div>
<p>ppppp</p>
<script> var_trace_page_logid = 0485856956; </script>
</div>
</body>
</html>
如果要查找head下面的title,XPath是:
/html/head/title
下面的XPath会把所有的div都给找出来。
//div
下面介绍几种常用的方法:
- 选择不确定元素: *
例如,要选择所有的元素: //*
例如,选择第三层下的div:/*/*/div
- 选择分支:使用中括号可以选择分支
XPath中元素的定义是从1开始的。选择第一个元素:
//div[1] 或者是 //div
XPathj并没有定义 first() 这种函式喔,用上面的[1]就可以取出第一个元素。但是有一个选择最后一个元素的函数last:
/html/body/div[last()]
选择子元素也可以采用名字来进行定位,以下语法选出含有script子元素的所有div元素。
/html/body/div[script]
以下语法选出含有p=ppp子元素的所有div元素。
/html/body/div[p=ppp]
使用Or操作数(|)就可以选择一个以上的路径。例如:
/html/body/div | div/p
选择所有title以及div元素
//title | //div
- 选择属性
在XPath中,除了选择元素以外,也可以选择属性。属性都是以@开头。例如选择文件中所有叫做country的属性。
//@id
选择所有含有id这个属性的div元素:
//div[@id]
以下语法选择出含有属性的所有div元素
//div[@*]
以下语法选择出id属性值为wrapper的div元素
//div[@id=' wrapper ']
选择多个属性
//cd[@id=' wrapper '][@ name="wra"]
例如
<input type="button"value="divide" οnclick="divide()">
//input[@value=’divide’]
- 还有很多的函数来帮助进行定位
例如:Contains函数,starts-with函数等,定位包含“腾讯qq“文本的链接
//a[contains(text(),'腾讯qq')]
定位属性class包含heading的span元素
//span[contains(@class, 'heading')]
//input[starts-with(@id, 'text-')]
//*[contains(name(),'a')]