被测试网页的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 定位----光荣之路的更多相关文章

  1. java selenium (六) XPath 定位

    xpath 的定位方法, 非常强大.  使用这种方法几乎可以定位到页面上的任意元素. 阅读目录 什么是xpath xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面, ...

  2. 常用的CSS定位,XPath定位和JPath定位

    CSS定位 举例 描述 div#menu id为menu的div元素 div.action-btn.ok-btn class为action-btn和ok-btn的div元素 table#emailLi ...

  3. selenium之xpath定位和input文本

    selenium之xpath定位和input文本 xpath简单定位: 打开浏览器的F12 在自己需要定位的元素的那里右键 选择copy->xpath selenium获取input下的文本: ...

  4. 5.5.8 XPath定位

    1.什么是XPath XPath定位方式是自动化测试定位技术中的必杀技,几乎可以解决所有的定位难题.它是XML Path语言的缩写,主要用于在XML 文档中选择文档中的节点.基于XML树状文档结构,X ...

  5. selenium+python自动化之xpath定位

    在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到.这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语法. 什么是 ...

  6. Xpath定位大全

    selenium使用Xpath定位之完整篇   其中有一片文章提到了xpath元素定位,但是该文章中有些并不能适应一些特殊与个性化的场景.在文本中提供xpath元素的定位终极篇,你一定能在这里找到你需 ...

  7. appium的xpath定位

    做自动化,元素定位是我们遇到的第一个困难.总是会有各种各样的问题,导致我们定位不到元素.前面一篇博客也写了元素定位的几种方法,今天主要分享一下xpath的定位方法. 这里我们仍然拿计算器举例. 比如我 ...

  8. Selenium-Python学习——通过XPath定位元素

    用Xpath定位元素的方法总是记不住,经常要翻出各种文档链接参考,干脆把需要用到的内容整到这个笔记中方便查找. Xpath是在XML文档中定位节点的语言.使用 XPath 的主要原因之一是当想要查找的 ...

  9. Robot Framework与Web界面自动化测试学习笔记:利用xpath定位元素

    在rf中,利用selinum2的关键字进行用例编写时,很多关键字的参数是html元素的定位标识. 最简单的方式,是通过id 或name来描述元素定位信息,如 click  button    id=l ...

随机推荐

  1. [转]DIV+CSS和TABLE的区别

    现在全国大大小小的网站都在搞一场技术“革命”,就是所谓“网站重构”说简单点就是DIV+CSS进行网站制作.用DIV+CSS代替传统的Table制作框架和美化页面.百度搜索优化 在重构之前,肯定要了解为 ...

  2. Java获取各种常用时间方法大全

    Java获取各种常用时间方法大全 package cc.javaweb.test; Java中文网,Java获取各种时间大全 import java.text.DateFormat; import j ...

  3. 从svn服务器自动同步到另一台服务器

    需求场景 A commit B post-commit C (workstation) --------------> (svn server) ---------------------> ...

  4. 【bzoj3246】 Ioi2013—Dreaming

    www.lydsy.com/JudgeOnline/problem.php?id=3246 (题目链接) 题意 给出一棵不完全的树,要求在树上连最少的边使得所有点联通,并且使得两点间最大距离最小. S ...

  5. HDU2888 Check Corners

    Description Paul draw a big m*n matrix A last month, whose entries Ai,j are all integer numbers ( 1 ...

  6. hihocoder 1154 Spring Outing

    传送门 #1154 : Spring Outing 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 You class are planning for a spring ...

  7. latin1

    Latin1是ISO-8859-1的别名,有些环境下写作Latin-1.ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII ...

  8. What to call your Academic Event

  9. 一分钟认识GitHub

    一分钟认识GitHub 机缘巧合之下,我开始使用 GitHub ,但事实上,刚刚入门的我不知道如何才能使 GitHub 发挥他的全部功能.不久之前,我偶然听了李福斯先生对 GitHub 的介绍,受益匪 ...

  10. [LeetCode] Copy List with Random Pointe

    题目的关键是要让新链表和原有链表发送关联,可以通过这种关联来设置新链表的random pointer 思路:将新链表的元素插入到原有链表元素的后面,如下图所示,就可以根据原有链表的radom-> ...