XPath 定位----光荣之路
被测试网页的HMTL代码
<html>
<body>
<div id="div1">
<input name="div1input"></input>
<a href="http://www.sogou.com">搜狗搜索</a>
<img alt="div1-img1" src="http://www.sogou.com/images/logo/new/sogou.png" href="http://www.sogou.com">搜狗图片</img>
<input type="button" value="查询"></>
</div>
<br>
<div name="div2">
<input name="div2input"></input>
<a href="http://www.baidu.com">百度搜索</a>
<img alt="div2-img2" src="http://www.baidu.com/img/bdlogo.png" href="http://www.baidu.com">百度图片</img>
</div>
</body>
</html>
绝对路径定位方式:
在被测试网页中,查找第一个 div 标签中的按钮。
XPath的表达式: /html/body/div/input[@value="查询"]
Java的定位语句: WebElement button= driver.findElement(By.xpath("/html/body/div/input[@value='查询']"));
相对路径定位方式:
在被测试网页中,查找第一个 div 标签中的按钮。
XPath的表达式:
// input[@value="查询"]
Java的定位语句:
WebElement button= driver.findElement(By.xpath("//input[@value='查询']"));
XPath 使用索引号定位:
被测试网页的HMTL代码
使用索引号定位方式: 在被测试网页中,查找第二个 div 标签中的“查询”按钮。
XPath的表达式: //input[2]
Java的定位语句: WebElement button= driver.findElement(By.xpath("//input[2]"));
XPath 使用页面元素的属性值定位:
使用页面属性值方式:
我们尝试定位被测试网页中的第一个图片元素。
XPath 的表达式
//img[@alt='div1-img1']
Java的定位语句:
WebElement img= driver.findElement(By.xpath("//img[@alt='div1-img1']"));
XPath 使用页面元素的属性值定位:
| 预期定位的页面元素 | 定位表达式示例 | 使用的属性值 | 
| 定位页面的第一个图片 | //img[@href='http://www.sogou.com'] | 使用img标签的href属性值 | 
| 定位第二个div中第一个Input输入框 | //div[@name='div2']/input[@name='div2input'] | 使用div标签的name属性值 使用 input标签的name 属性值 | 
| 定位第一个div中的第一个链接 | //div[@id='div1']/a[@href='http://www.sogou.com'] | 使用的div标签的id 属性值 使用了a标签的href属性值 | 
| 定位页面的查询按钮 | //input[@type='button'] | 使用了type属性值 | 
XPath 使用模糊页面属性值定位:
| XPath函数 | 定位表达式示例 | 表达式解释 | 
| Starts-with() | //img[starts-with(@alt,'div1')] | 查找图片alt属性开始位置包含’div1’关键字的页面元素 | 
| Contains() | //img[contains(@alt,'g1')] | 查找图片alt属性包含’g1’关键字的页面元素 | 
使用 XPath 的轴(axis)进行元素定位:
轴:
XPath轴(XPath Axes)可定义某个相对于当前节点的节点集:
1、child 选取当前节点的所有子元素
2、parent 选取当前节点的父节点
3、descendant 选取当前节点的所有后代元素(子、孙等)
4、ancestor 选取当前节点的所有先辈(父、祖父等)
5、descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身
6、ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
7、preceding-sibling 选取当前节点的开始标签之前的所有同级节点
8、following-sibling 选取当前节点的结束标签之后的所有同级节点
9、preceding 选取文档中当前节点的开始标签之前的所有节点
10、following 选取文档中当前节点的结束标签之后的所有节点
11、self 选取当前节点
12、attribute 选取当前节点的所有属性
13、namespace 选取当前节点的所有命名空间节点

|  | |||
| XPath轴关键字 | 轴的含义说明 | 定位表达式示例 | 表达式解释 | 
| ancestor | 选择当前节点上层的所有节点 | //img[@alt='div2-img2']/ancestor::div | 查找到alt属性值为div2-img的图片,并基于图片位置找到他上级的div页面元素 | 
| descendant | 选择当前节点下层的所有节点 注:不能超出当前节点的结束标签 | //div[@name='div2']/descendant::img | 查找到name属性值的div页面元素,并基于div的位置找到他下级所有节点中的img页面元素 | 
| following | 选取当前节点的结束标签之后的所有节点 注:仔细体会与descendant的区别 | //div[@id='div1']/following::img | 超找到id 属性值为div1的div页面元素,并基于div的位置找到它后面(结束标签之后)节点中的img页面元素 | 
| following-sibling | 选取当前节点的结束标签之后的所有平级节点 ,自上而下,离当前结点最近的为索引1,越往下数字越大。 | //a[@href='http://www.sogou.com']/follo wing-sibling::input | 查找到链接地址为http://www.sogou.com的链接页面元素,并基于链接的位置找到它后续节点中input页面元素 | 
| preceding | 选择当前节点开始标签之前的所有节点 | //img[@alt='div2-img2']/preceding::div | 查找到alt属性值为div2-img2的图片页面元素,并基于图片的位置找到它前面节点中的div页面元素 | 
| preceding-sibling | 选择当前节点开始标签之前的所有同级节点,自下而上,离当前结点最近的为索引1,越往上数字越大。 | //img[@alt='div2-img2']/preceding-sibling ::a[1] | 查找到alt属性值为div2-img2的图片页面元素,并基于图片的位置找到它前面同级节点中的第二个链接页面元素 | 
XPath 使用页面元素的文本定位:
例1:
使用text()函数可以定位到包含某些关键字的页面元素
XPath的表达式:
1) //a[text()='百度搜索']
2) //a[contains(text(),'百度')]
3) //a[contains(text(),'百度')]/preceding::div
Java 的定位语句:
WebElement a=driver.findElement(By.xpath("//a[text()='百度搜索']"));
WebElement a=driver.findElement(By.xpath("//a[contains(text(),'百度')]"));
WebElementdiv=driver.findElement(By.xpath("//a[contains(text(),'百 度')]/preceding::div"));
例2:实际项目

目的:通过角色名称,来点击'编辑'这个图片超链接。
name 表示角色名称 lineXpath = u"//div[@id='body2']/descendant::a[text()='%s']" % name
editXpath = u"%s/ancestor::tr/descendant::img[@title='编 辑']" % lineXpath
webApi.clickBy(driver, by.xpath_(editXpath), 2, 0)
例3:实际项目

目的:通过输入框定位框前面的标题和框后面的提示信息。使用ancestor而不用parent,因为当前元素的父元素可能不是td(嵌套div之类的),后面的preceding-sibling一定要加,不加会定位多个td,包括顶层的td。
1 def getTipInfo2(driver, idList):
2 u'返回以输入框标题为key,以提示信息为value的字典'
3 msgList = []
4 for editId in idList:
5 titleXpath = u"//*[@id='%s']/ancestor::td/preceding-sibling::td[1]" % editId
6 title = webApi.getTextBy(driver, by.xpath_(titleXpath), 2)
7 tipInfo = webApi.getTextBy(driver, by.id_(editId + u'Tip'), 2)
8 tempTuple = title, tipInfo
9 msgList.append(tempTuple)
10 for k, v in dict(msgList).iteritems():
11 if (u'OK' not in v) and (len(v.strip())>0):
12 print u"操作项'%s'失败,提示信息:'%s'" % (k, v)
13 return dict(msgList)
结果:
操作项'选择角色*:'失败,提示信息:'管理员角色必填!'
操作项'管理员账号*:'失败,提示信息:'管理员账号必填,长度为1-64个字符!'
操作项'静态密码*:'失败,提示信息:'密码必填,长度4-32个字符!'
操作项'确认静态密码*:'失败,提示信息:'确认密码必填,长度4-32个字符!'
td[1]表示id=adminid这个元素上面倒数第一个td,即使用preceding-sibling时,是下往上看的,离adminid最近的为td[1];而使用following-sibling时,是上往下看的,注意顺序,可以看下面这个例子。
例4:打印常用控件标题及内容
HTML和页面如下:

代码:
def printInputInfo(driver, key_id, value, inputType=u'edit'):
u'打印常用控件标题及内容'
u'''
args:
key_id: 页面输入元素的ID
value: 输入的值
inputType:输入元素的类型
'''
#标题xpath
xp = u"//*[@id='%s']/ancestor::td/preceding-sibling::td[1]" % key_id
#取标题
title = webApi.getTextBy(driver, by.xpath_(xp), 2) if inputType == u'edit':
t = u'编辑框'
elif inputType == u'select':
t = u'下拉选择框'
elif inputType == u'tree':
t = u'树状选择器'
elif inputType == u'radio':
t = u'单选按钮'
elif inputType == u'checkbox':
t = u'复选框'
print u"%s---%s %s" % (t, title.strip(), value)
当程序执行到输入令牌号,会打印控件类型、标题、输入值,如 "编辑框---令牌号: 2600321700067"。
此处使用preceding-sibling::td[1],若用td[3],则输出 "编辑框---组织机构: 2600321700067"。
XPath 定位----光荣之路的更多相关文章
- java selenium (六) XPath 定位
		xpath 的定位方法, 非常强大. 使用这种方法几乎可以定位到页面上的任意元素. 阅读目录 什么是xpath xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面, ... 
- 常用的CSS定位,XPath定位和JPath定位
		CSS定位 举例 描述 div#menu id为menu的div元素 div.action-btn.ok-btn class为action-btn和ok-btn的div元素 table#emailLi ... 
- selenium之xpath定位和input文本
		selenium之xpath定位和input文本 xpath简单定位: 打开浏览器的F12 在自己需要定位的元素的那里右键 选择copy->xpath selenium获取input下的文本: ... 
- 5.5.8 XPath定位
		1.什么是XPath XPath定位方式是自动化测试定位技术中的必杀技,几乎可以解决所有的定位难题.它是XML Path语言的缩写,主要用于在XML 文档中选择文档中的节点.基于XML树状文档结构,X ... 
- selenium+python自动化之xpath定位
		在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到.这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语法. 什么是 ... 
- Xpath定位大全
		selenium使用Xpath定位之完整篇 其中有一片文章提到了xpath元素定位,但是该文章中有些并不能适应一些特殊与个性化的场景.在文本中提供xpath元素的定位终极篇,你一定能在这里找到你需 ... 
- appium的xpath定位
		做自动化,元素定位是我们遇到的第一个困难.总是会有各种各样的问题,导致我们定位不到元素.前面一篇博客也写了元素定位的几种方法,今天主要分享一下xpath的定位方法. 这里我们仍然拿计算器举例. 比如我 ... 
- Selenium-Python学习——通过XPath定位元素
		用Xpath定位元素的方法总是记不住,经常要翻出各种文档链接参考,干脆把需要用到的内容整到这个笔记中方便查找. Xpath是在XML文档中定位节点的语言.使用 XPath 的主要原因之一是当想要查找的 ... 
- Robot Framework与Web界面自动化测试学习笔记:利用xpath定位元素
		在rf中,利用selinum2的关键字进行用例编写时,很多关键字的参数是html元素的定位标识. 最简单的方式,是通过id 或name来描述元素定位信息,如 click button id=l ... 
随机推荐
- iOS开发小技巧--设置cell左右有空隙,设置分割线的新思路,重写setFrame:让别人在外界无法修改控件的大小
			如图:需要自定义cell 
- hdu2594 KMP
			2个字符长合并在一起即可.要注意next[n]的值要小于初始的两个字符串的长度; //next[]存的是之前相同的长度. //也是位置,只是s[i]不一定和s[next[i]]相同 //但是i之前的和 ... 
- hdu3397 线段树 成段更新
			这题真的呵呵了.敲了很长时间,调了很多bug,把0 1 输出,解决了.最后想取反,怎么搞都有bug, 最后还是看了大牛们的博客.不过这题真的敲得爽,调bug时基本把线段树过程全部弄了一遍. #incl ... 
- js-定时任务setInterval,setTimeout,clearInterval,clearTimeout
			setInterval()循环执行相应的方法 <script type="text/javascript"> setInterval("myInterval( ... 
- Android Studio能干什么
			建立系统工具包可以用来生成,测试,运行您的应用程序和软件包.构建系统是独立于Android的工作室,所以你可以调用它的Android的工作室或从命令行.在你写你的应用程序,你可以使用编译系统的特点: ... 
- 项目总结—jQuery EasyUI-DataGrid动态加载表头
			http://blog.csdn.net/zwk626542417/article/details/19248747 概要 在前面两篇文章中,我们已经介绍了在jQuery EasyUI-DataGri ... 
- 第一部分 mongodb 基础篇
			什么是NoSQL认识MongoDBMongDB的下载与安装MongoDB的体系结构常用命令(基本的增删改查)客户端GUI工具集合 一: 什么是NoSql1 NoSQL简介NoSQL是Not Only ... 
- mysql 导入大sql文件时 max_allowed_packet 选项的设置
			mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置 show VARIABLES ... 
- serialVersionUID要注意以下几点:
			今天在使用eclipse开发的时候,遇到一个warning,看到warning我总觉得不爽,使用自动修复后,发现eclipse在代码中加入了“private static final long ser ... 
- input file美化
			<style> a{display:inline-block; width:100px; height:40px; position:relative; overflow:hidden;} ... 
