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. 【leetcode❤python】 8. String to Integer (atoi)

    #-*- coding: UTF-8 -*-#需要考虑多种情况#以下几种是可以返回的数值#1.以0开头的字符串,如01201215#2.以正负号开头的字符串,如'+121215':'-1215489' ...

  2. Update与FixedUpdate区别

    以下的代码能使游戏暂停,记得要使速度*Time.deltaTime,目的是保证游戏运行在帧数不同的情况下,角色移动速度都一样,因为此时角色是按时间移动与帧数无关. using UnityEngine; ...

  3. Debug不崩溃Release版本崩溃的一种原因

    今天有一个工程Debug是正常,Release崩溃,郁闷至极. 研究了一下下午,原因是一个类成员变量没有构造函数中初始化.而Debug版本正好没有问题. 所以定义类成员,一定不能忘记初始化!!

  4. How To Tune or Test PLSQL Code Performance in Oracle D2k Forms

    You can test or tune your program unit performance in Oracle forms with Ora_Prof package.Suppose you ...

  5. MyBatis 多表联合查询及优化 以及自定义返回结果集

    下面就来说一下 mybatis 是通过什么来实现多表联合查询的.首先看一下表关系,如图: 这 里,我已经搭好了开发的环境,用到的是 SpringMVC + Spring + MyBatis,当然,为了 ...

  6. [C程序设计语言]第四部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. hdu 5693 朋友 博弈

    朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Descr ...

  8. hdu 4163 Stock Prices 水

    #include<bits/stdc++.h> using namespace std; #define ll long long #define pi (4*atan(1.0)) #de ...

  9. 面向对象的JavaScript系列一,创建对象

    1.最简单的创建对象方法 var person = new Object(); person.name = "sam wu"; person.age = 25; person.jo ...

  10. 关于Java控制台输入输出乱码问题

    产生原因:因为这个开源项目的默认字符编码为UTF-8,所以我的控制台的字符编码也自动变成了UTF-8,而键盘的输入流的默认格式是GBK格式,这样就造成了在GBK转UTF-8的过程中产生的奇数乱码错误( ...