1.什么是XPath

XPath定位方式是自动化测试定位技术中的必杀技,几乎可以解决所有的定位难题。它是XML Path语言的缩写,主要用于在XML 文档中选择文档中的节点。基于XML树状文档结构,XPath语言可以用于在整颗树中寻找指定的节点。由于网页的HTML代码是一种特殊的XML文档,因此XPath也支持在HTML代码中定位HTML树状文档结构中的节点。它是一种选择器,在firefox中用firepath可查看。

2.XPath语法

被测试网页的HTML代码(xPathDemo.html下载

<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-img" src="http://www.baidu.com/img/bdlogo.png" href="http://www.baidu.com">百度图片</img>
</div>
</body>
</html>

(1)使用绝对路径来定位元素

例:在被测试网页中,查找第一个div标签中的按钮。

Java定位语句:WebElement button=driver.findElement(By.xpath("/html/body/div/input[@value='查询']"));

代码解释:/表示根目录,绝对路径。该表达式从HTML代码的最外曾节点逐层查找,最后定位到按钮节点。

说明:使用绝对路径定位方式的好处在于可以验证页面是否发生变化。如果页面发生变化,一般会造成原有定位成功的XPaht表达式定位失败,由此可发现网页结构发生了改变。使用绝对路径定位是十分脆弱的,因为即便页面代码发生了微小的变化,也会造成原有的XPath表达式定位失败。在自动化测试的定位中,优先推荐使用相对路径定位方式。

(2)使用相对路径来定位元素

例:在被测试网页中,查找第一个div标签中的按钮。

Java定位语句:WebElement button=driver.findElement(By.xpath("//input[@value='查询']"));

代码解释:XPath表达式中的“//”表示在HTML文档的全部层级位置进行查找,input[@value="查询"]表示定位显示“查询”两个字的按钮。

说明:相对路径的XPath表达式更简洁,不管页面发生了何种变化,只要input的value值是“查询”两个字就可以被定位到。推荐使用相对路径的XPath表达式,可大大降低测试脚本中定位表达式的维护成本。

(3)使用索引号进行定位

例:在被测试网页中,查找第二个div标签中的“查询”按钮。

XPath表达式://input[2]

代码解释:根据元素类型在页面中出现的先后顺序,可以使用序号来查找指定的页面元素。本实例的XPath表达式表示查找页面中第二个出现的input元素,即被测试页面上的按钮元素。

说明:如果使用“//input[1]”,会定位到两个输入框元素,因为每个div里面均包含input元素,XPath在查找的时候把每个div节点当作相同的起始层级开始查找,所以使用“//input[1]”表达式会同时查找到两个div节点中的第一个input元素。因此在使用序号进行页面定位元素的时候,需要注意网页HTML代码中是否包含多个层级完全相同的代码结构,若包含多个则会定位到多个页面元素。

若页面元素经常被发现新增或者减少的情况,不建议使用索引号定位的方式,因为页面变化很可能会让使用索引号的XPath表达式定位失败。

(4)使用页面元素的属性值定位元素实例

在定位页面元素的时候,会遇到各种复杂结构的网页,并且经常出现无法使用ID、name方式定位的情况。若不想使用绝对路径的定位方式,又搞不清楚到底使用什么序号来定位页面元素,那么推荐使用属性值定位元素的方式。

例:尝试定位被测试网页中的第一个图片元素。

Java定位语句:WebElement img=driver.findElement(By.xpath("//img[@alt='div1-img1']"));

代码解释:表达式使用了相对路径定位方式,并且使用了图片的alt属性值来进行定位,通过查看页面的HTML代码可获取图片的alt值。

说明:被测试网页的元素通常会包含各种各样的属性值,并且很多属性值具有唯一性。若能确认属性值发生变更的可能性很低且具有唯一值,强烈建议使用相对路径方式结合属性值定位的方式来编写XPath定位表达式,基于此定位方法可解决99%的页面元素定位难题。

练习:试着去说出下面的定位元素:

  • //img[@href='http://www.sogou.com']
  • //div[@name='div2']/input[@name='div2input']
  • //div[@id='div']/a[@href='http://www.sogou.com']
  • //input[@type='button']

(5)使用模糊的属性值定位元素

在自动化测试的实施过程中,会遇到另外一种情况:页面元素的属性值会被动态地生成,即每次看到的页面元素属性值是不一样的,此类页面元素会加大定位难度,使用模糊的属性值定位方式可解决一部分此类难题。XPath函数可实现模糊属性值的定位需求。

XPath常用函数如下表所示。

XPath函数 定位表达式实例 表达式解释
Starts-with() //img[starts-with(@alt,'div1')] 查找图片alt属性开始位置包含"div1"关键字的页面元素
Contains() //img[contains(@alt,'g1')]

查找图片alt属性包含“g1”关键字的页面元素

  Contains()函数属于XPath函数的高级用法,使用场景较多,页面元素的属性值只要具有固定不变的几个关键字,即使页面元素的属性值经常发生一定程度的变化,依旧可以使用Contians()函数进行定位。

(6)使用XPath的轴(Axis)进行元素定位

轴可定义相对于当前节点的节点集。使用XPath轴(Axis)方式可依据在文档树中的元素相对位置关系进行定位。先找到一个相对好定位的元素,依据它和要定位元素的相对位置进行定位,可解决一些元素难以定位的问题。

语法为:轴名称::节点。

XPath轴关键字 轴的含义说明 定位表达式实例 表达式解释
parent 选择当前节点的上层父节点 //img[@alt='div2-img2']/parent::div 查找到alt属性值为div2-img的图片,并基于图片位置找到它上一级的div页面元素
child 选择当前节点的下层子节点   //div[@id='div1']/child::img 查找到ID属性值为div1的div页面元素,并基于div的位置找到它下层节点中的img页面元素 
ancestor  选择当前节点所有上层的节点  //img[@alt='div2-img2']/ancestor::div  查找到alt属性值为div2-img的图片,并基于图片位置找到它上级的div页面元素 
descedant 选择当前节点所有下层的节点  //div[@name='div2']/descendant::img  查找到name属性值的div页面元素,并基于div的位置找到它下级所有节点中的img页面元素 
following 选择在当前节点之后显示的所有节点 //div[@id='div1']/following::img 查找到ID属性值为div1的div页面元素,并基于div的位置找到他后面节点中的img页面元素
following-sibling 选择当前节点之后的所有平级节点 //a[@href='http://www.sogou.com']/following-sibling::input 查找到链接地址为http://www.sogou.com的链接页面元素,并基于链接的位置找到它同级节点中的input页面元素
preceding  选择当前节点前面的所有节点  //img[@alt='div2-img2']/preceding::div  查找到alt属性值为div2-img2的图片页面元素,并基于图片的位置找到它前面节点中的div页面元素 
preceding-sibling  选择当前节点前面的所有同级节点  //img[@alt='div2-img2']/preceding-sibling::a[1]  查找到alt属性值为div2-img2的图片页面元素,并基于图片的位置找到它前面同级节点中的第二个链接页面元素 

 (7)使用页面元素的文本来定位元素

使用text()函数可以定位到包含某些关键字的页面元素。

  • //a[text()='百度搜索']
  • //a[contains(text(),'百度')]
  • //a[contians(text(),'百度')]/preceding::div

说明:使用文字匹配模式进行定位,为定位复杂的页面元素提供了一种强大的定位模式,在遇到定位困难的时候,可优先使用此方法进行定位。建议使用此定位方式进行大量练习,做到可随意定位到页面中的任意元素。

3.总结

(1)常用符号说明

  • /表示根目录,绝对路径
  • //表示相对路径
  • .表示当前层
  • ..表示上一层
  • *表示通配符
  • @表示属性
  • []属性的判断条件表达式

(2)路径表达式查看

在网页元素上,点击鼠标右键,选择“Inspect in File Path”,可查看某个网页元素的xpath路径。例如,定位百度首页的“新闻”元素。

(3)函数

  • contians

//div[contains(@id,'in')],表示选择id中包含有'in'的div节点

  • text()

<a class="baidu" href="http://www.baidu.com">baidu</a>

查找节点的文本值为baidu的超链接,//a[text()='baidu']

  • last()

//input[@name='identity' or @class='Volvo'][last()],取最后一个

  • starts-with()

//div[starts-with(@id,'in')],表示选择以id属性为'in'开头的div节点

  • not()

//input[@name='identity' and not(contains(@class,'A'))],表示匹配出name为identity并且class的值中不包含A的input节点

//input[not(@id)],匹配出input节点不含有id属性的节点。

(4)xpath轴练习

以axisDemo2网页(下载)为例,进行讲解

//div[@id='radio']//label[text()='Saab']/preceding-sibling::input是什么意思?

//input[following-sibling::label[text()='Saab']]是什么意思?

5.5.8 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. selenium+python自动化之xpath定位

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

  5. Xpath定位大全

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

  6. appium的xpath定位

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

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

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

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

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

  9. UI自动化测试(二)浏览器操作及对元素的定位方法(xpath定位和css定位详解)

    Selenium下的Webdriver工具支持FireFox(geckodriver). IE(InternetExplorerDriver).Chrome(ChromeDriver). Opera( ...

随机推荐

  1. 【转】The decoupling capacitor…is it really necessary?

    Before working as an applications engineer, I worked as an IC test development engineer here at TI. ...

  2. CUBRID学习笔记 33 net事务 cubrid教程示例

    conn.BeginTransaction(); string sql = "create table t(idx integer)"; using (CUBRIDCommand ...

  3. 常见的PC端和移动端表单组件

    http://files.cnblogs.com/samwu/PC%E7%AB%AF%E5%89%8D%E7%AB%AF%E4%BA%A4%E4%BA%92%E7%BB%84%E4%BB%B6.rar

  4. Ubuntu 安装hadoop 伪分布式

    一.安装JDK  : http://www.cnblogs.com/E-star/p/4437788.html 二.配置SSH免密码登录1.安装所需软件        sudo apt-get ins ...

  5. iOS - UIControl

    前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIControl : UIView @available(iOS 2.0, *) public class UIC ...

  6. MonkeyRunner学习(2)常用命令

    目录: 1.截图 2.暂停 (时延秒) 3.屏幕操作 4.打印 5.字符串发送到键盘输入(登录输入) 6.唤醒设备屏幕 7.重起手机 8.按键(系统键) 9.回车键 10.for 循环 11.循环截图 ...

  7. Android中view动画

    [1]透明 //点击按钮 实现iv 透明的效果 动画 public void click1(View v) { //1.0意味着着完全不透明 0.0意味着完全透明 AlphaAnimation aa ...

  8. golang执行linux命令

    golang exec 执行系统命令 golang    2014-09-25 13:17:44    2779    0    0 exec.Command() 最简单的方法: cmd := exe ...

  9. XML HTML

    XML和HTML常用转义字符 XML和HTML中都有一些特殊的字符,这些字符在XML和HTML中是不能直接使用的,如果必须使用这些字符,应该使用其对应的转义字符. XML常用转义字符: 字符 转义字符 ...

  10. Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记

    原文:http://blog.csdn.net/lifuxiangcaohui/article/details/37659905 一直用tomcat一段时间都正常无事,最近一次启动tomcat就发生以 ...