用XPath精确定位节点元素&selenium使用Xpath定位之完整篇

在利用XSL进行转换的过程中,匹配的概念非常重要。在模板声明语句 xsl:template match = ""和模板应用语句xsl:apply-templates select = "" 中,用引号括起来的部分必须能够精确地定位节点。具体的定位方法则在XPath中给出。

之所以要在XSL中引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素。可以把XPath比作文件管理路 径:通过文件管理路径,可以按照一定的规则查找到所需要的文件;同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节 点,显然这对XSLT来说是一个最最基本的功能。

XPath数据类型

XPath可分为四种数据类型:

  • 节点集(node-set) 
    节点集是通过路径匹配返回的符合条件的一组节点的集合。其它类型的数据不能转换为节点集。
  • 布尔值(boolean) 
    由函数或布尔表达式返回的条件匹配值,与一般语言中的布尔值相同,有true和 false两个值。布尔值可以和数值类型、字符串类型相互转换。
  • 字符串(string) 
    字符串即包含一系列字符的集合,XPath中提供了一系列的字符串函数。字符串可与数值类型、布尔值类型的数据相互转换。
  • 数值(number) 
    在XPath 中数值为浮点数,可以是双精度64位浮点数。另外包括一些数值的特殊描述,如非数值NaN(Not-a-Number)、正无穷大infinity、负无 穷大-infinity、正负0等等。number的整数值可以通过函数取得,另外,数值也可以和布尔类型、字符串类型相互转换。

其中后三种数据类型与其它编程语言中相应的数据类型差不多,只是第一种数据类型是XML文档树的特有产物。

XPath节点类型

另外,由于XPath包含的是对文档结构树的一系列操作,因此搞清楚XPath节点类型也是很必要的。回忆一下第二章中讲到的XML文档的逻辑结 构,一个XML文件可以包含元素、CDATA、注释、处理指令等逻辑要素,其中元素还可以包含属性,并可以利用属性来定义命名空间。相应地,在XPath 中,将节点划分为七种节点类型:

  1. 根节点(Root Node) 
    根节点是一棵树的最上层,根节点是唯一的。树上其它所有元素节点都是它的子节点或后代节点。对根节点的处理机制与其它节点相同。在XSLT中对树的匹配总是先从根节点开始。
  2. 元素节点(Element Nodes) 
    元素节点对应于文档中的每一个元素,一个元素节点的子节点可以是元素节点、注释节点、处理指令节点和文本节点。可以为元素节点定义一个唯一的标识id。元素节点都可以有扩展名,它是由两部分组成的:一部分是命名空间URI,另一部分是本地的命名。
  3. 文本节点(Text Nodes) 
    文本节点包含了一组字符数据,即CDATA中包含的字符。任何一个文本节点都不会有紧邻的兄弟文本节点,而且文本节点没有扩展名。
  4. 属性节点(Attribute Nodes) 
    每 一个元素节点有一个相关联的属性节点集合,元素是每个属性节点的父节点,但属性节点却不是其父元素的子节点。这就是说,通过查找元素的子节点可以匹配出元 素的属性节点,但反过来不成立,只是单向的。再有,元素的属性节点没有共享性,也就是说不同的元素节点不共有同一个属性节点。 
    对缺省属性的处理等同于定义了的属性。如果一个属性是在DTD声明的,但声明为 #IMPLIED,而该属性没有在元素中定义,则该元素的属性节点集中不包含该属性。 
    此外,与属性相对应的属性节点都没有命名空间的声明。命名空间属性对应着另一种类型的节点。
  5. 命名空间节点(Namespace Nodes) 
    每一个元素节点都有一个相关的命名空间节点集。在XML文档中,命名空间是通过保留属性声明的,因此,在XPath中,该类节点与属性节点极为相似,它们与父元素之间的关系是单向的,并且不具有共享性。
  6. 处理指令节点(Processing Instruction Nodes) 
    处理指令节点对应于XML文档中的每一条处理指令。它也有扩展名,扩展名的本地命名指向处理对象,而命名空间部分为空。
  7. 注释节点(Comment Nodes) 
    注释节点对应于文档中的注释。

一个XML文档树

我们来构造一棵XML文档树,作为后面举例的依托:

     <A id="a1">    <B id="b1">    <C id="c1">    <B name="b"/>    <D id="d1"/>    <E id="e1"/>    <F id="e2"/>    </C>    </B>    <B id="b2"/>    <C id="c2">    <B/>    <D id="d2"/>    <F/>    </C>    <E/>    </A>            

以下将要介绍一些XPath中节点匹配的基本方法。

路径匹配

路径匹配与文件路径的表示相仿,比较好理解。有以下几个符号:

(1)用“/”指示节点路径 
如“/A/C/D” 表示节点"A"的子节点"C"的子节点"D",即id值为d2的D节点, “/”表示根节点。

(2)用“//” 表示所有路径以"//"后指定的子路径结尾的元素 
如“//E” 表示所有E元素,结果是所有三个E元素,如“//C/E”表示所有父节点为C的E元素,结果是id值为e1和e2的两个E元素 。

(3)用“*” 表示路径的通配符 
如“/A/B/C/*”表示 A元素→B元素→C元素下的所有子元素,即name值为b的B元素、 id值为d1的D元素和id值为e1和e2的两个E元素 
“/*/*/D”表示上面有两级节点的D元素,匹配结果是id值为d2的D元素 ,如“//*”表示所有的元素。

位置匹配

对于每一个元素,它的各个子元素是有序的。

如:/A/B/C[1]表示A元素→B元素→C元素的第一个子元素,得到name值为b的B元素

/A/B/C[last()]表示A元素→B元素→C元素的最后一个子元素,得到id值为e2的E元素

/A/B/C[position()>1]表示A元素→B元素→C元素之下的位置号大于1的元素,得到id值为d1的D元素和两个具有id值的E元素

属性及属性值

在XPath中可以利用属性及属性值来匹配元素,要注意的是,元素的属性名前要有"@"前缀。例如:

//B[@id]表示所有具有属性id的B元素,结果为id值为b1和b2的两个B元素

//B[@*]表示所有具有属性的B元素,结果为两个具有id属性的B元素和一个具有name属性B元素

//B[not(@*)]表示所有不具有属性的B元素,结果为A元素→C元素下的B元素

//B[@id="b1"] id值为b1的B元素,结果为A元素下的B元素

亲属关系匹配

XML文档可归结为树型结构,因此任何一个节点都不是孤立的。通常我们把节点之间的归属关系归结为一种亲属关系,如父亲、孩子、祖先、后代、兄弟等等。在对元素进行匹配时,同样可以用到这些概念。例如:

//E/parent::* 表示所有E节点的父节点元素,结果为id值为a1的A元素和id值为c1的C元素

//F/ancestor::* 表示所有F元素的祖先节点元素,结果为id值为a1的A元素和id值为c2的C元素

/A/child::* 表示A的子元素,结果为id值为b1、b2的B元素,id值为c2的C元素,以及没有任何属性的E元素

/A/descendant::* 表示A的所有后代元素,结果为除A元素以外的所有其它元素

//F/self::* 表示所有F的自身元素,结果为F元素本身

//F/ancestor-or-self::* 表示所有F元素及它的祖先节点元素,结果为F元素、F元素的父节点C元素和A元素

/A/C/descendant-or-self::* 表示所有A元素→C元素及它们的后代元素,结果为id值为c2的C元素、该元素的子元素B、D、F元素

/A/C/following-sibling::* 表示A元素→C元素的紧邻的后序所有兄弟节点元素,结果为没有任何属性的E元素

/A/C/preceding-sibling::* 表示A元素→C元素的紧邻的前面所有兄弟节点元素,结果为id值为b1和b2的两个B元素

/A/B/C/following::* 表示A元素→B元素→C元素的后序的所有元素,结果为id 为b2的B元素、无属性的C元素、无属性的B元素、id为d2的D元素、无属性的F元素、/无属性的E元素。

/A/C/preceding::* 表示A元素→C元素的前面的所有元素,结果为id为b2的B元素、id为e2的E元素、id为e1的E元素、id为d1的D元素、name为 b的B元素、id为c1的C元素、id为b1的B元素

条件匹配

条件匹配就是利用一些函数的运算结果的布尔值来匹配符合条件的节点。常用于条件匹配的函数有四大类:节点函数、字符串函数、数值函数、布尔函数。例如last()、position()等等,这里我们就不再赘述。

以上这些匹配方法中,用得最多的还要数路径匹配。在上一章样式表的例子中,无论是在语 句<xsl:template match="学生花名册">中,还是在语句 <xsl:value-of select="名字"/>中,都是依靠给出相对于当前路径的子路径来定位节点的。
_______________________________________________________

4.XPath的语法

我们在前面已经提到过,XPath是用来帮助XSLT在XML源文档中查找定位信息的语言。在实际使用过程 中,XPath和XSLT总是混在一起使用,在上面一章的语法例子中我们已经有使用到XPath的语法,只是没有明确点出。但W3C将它们分成两个标准, 所以我们也将它们拆成两章来讲解。

4.XPath的语法

4.1 当前位置 
4.2 寻址操作 
4.3 运算符 
4.4 功能函数

4.1 当前位置

当 我们使用XSLT处理XML源文档是,我们用Context来表示当前正在被模板处理的节点位置。比如xsl:template match="/"语句中表示Context在文档的根(root)节点。我不知道如何准确的翻译Context这个词,它类似于C语言里的指针,表示程 序当前运行的位置。理解Context对于正确处理XSL模板非常重要,当您的XSL模板输出的文档和您想要的不一样,最先应该分析的就是Context 在哪里。
Location Paths是用于设定你想要寻找的Context节点位置。就类似DOS的目录命令。我们看个例子

<xsl:for-each select="child::PEOPLE/descendant::PERSON">

其中child::PEOPLE/descendant::PERSON就是XPath语法,这个表达式就是一个Location Paths,代码说明要显示所有PEOPLE元素的子元素和所有PERSON元素的子元素。通常我们会采用更简单的写法:

<xsl:for-each select="PEOPLE//PERSON">

我们来解释path的两种表示方法:"/"和"//"。
"/"是表示当前文档的节点,类似DOS目录分割符。例如:/PEOPLE表示选择根节点下的PEOPLE元素;PEOPLE/PERSON表示选择PEOPLE元素下所有的PESON子元素。
"//"则表示当前文档所有的节点。类似查看整个目录。例如://PEOPLE表示选择文档中所有的PEOPLE元素,无论它在什么层次;PEOPLE//PERSON表示在PEOPLE元素下所有的PERSON元素,无论它的层次多深。

4.2 寻址操作

Axis和Predicate是XPath语法中对Location Paths进行定位操作的语法,具体的用法列表如下

Axis语法表
--------------------------------------------------------
表达式 简写 说明
--------------------------------------------------------
self . 选择当前的节点.。
例子 :
<TD><xsl:value-of select="."/></TD>
代码表示在当前位置插入当前的节点包含的文本(text)值,
--------------------------------------------------------
parent .. 选择当前节点的父节点。 
--------------------------------------------------------
attribute @ 选择一个元素的所有属性。 
例子:
<TD><xsl:value-of select="@PERSONID"/></TD>
选择PERSON元素的所有属性.
--------------------------------------------------------
child 选择当前节点的所有子元素。
--------------------------------------------------------
ancestor 选择当前节点的所有父元素(包括父元素的父元素,类推)
--------------------------------------------------------

Axis帮助我们选择当前节点周围所有的节点,而Predicate则用来定位当前节点内部的元素。表示方法为方括号[]中加表达式:[ Expression ]。具体举例如下:

PERSON[position()=2] 
这句代码表示寻找第二个"PERSON" 元素

PERSON[starts-with(name, "B")] 
这句代码表示寻找所有名称以"B"开头的PERSON元素。

4.3 运算符

这一节介绍XPath的运算符(Expressions),列表如下:
--------------------------------------------------------
运算符 说明
--------------------------------------------------------
and, or 就是普通意义的and, or 
--------------------------------------------------------
= 等于
--------------------------------------------------------
!= 不等于
--------------------------------------------------------
>, >= 大于,大于等于
--------------------------------------------------------
<, <= 小于,小于等于。注意:在XSL文件中,<符号要用< 表示
--------------------------------------------------------
+, -, *, div 加减乘除 
--------------------------------------------------------
mod 取模
--------------------------------------------------------
| 两个节点一起计算
--------------------------------------------------------

________________________________________________________________

selenium使用Xpath定位之完整篇

其中有一片文章提到了xpath元素定位,但是该文章中有些并不能适应一些特殊与个性化的场景。在文本中提供xpath元素的定位终极篇,你一定能在这里找到你需要的解决办法。

第一种方法:通过绝对路径做定位(相信大家不会使用这种方式)

By.xpath("html/body/div/form/input")
By.xpath("//input")

第三种方法:通过元素索引定位

By.xpath("//input[4]")

第四种方法:使用xpath属性定位(结合第2、第3中方法可以使用)

By.xpath("//input[@id=‘kw1‘]")
By.xpath("//input[@type=‘name‘ and @name=‘kw1‘]")

第五种方法:使用部分属性值匹配(最强大的方法)

By.xpath("//input[start-with(@id,‘nice‘)
By.xpath("//input[ends-with(@id,‘很漂亮‘)
By.xpath("//input[contains(@id,‘那么美‘)]")

本文转自:

http://www.cnblogs.com/sqlnew/archive/2006/08/17/479869.aspx

http://www.tuicool.com/articles/nI7R7bf

时间: 2024-10-17 00:34:14

用XPath精确定位节点元素&selenium使用Xpath定位之完整篇的相关文章

XPath常用定位节点元素语句总结

将一个XML或HTML文档转换成了DOM树结构后,如何才能定位到特定的节点?XPath实现了这样的功能,它通过DOM树中节点的路径和属性来导航,通过XPath路径表达式可以选择DOM树中的nodes(节点)或是node-set(节点集). XPath包含了数量超过100的内置函数.这些函数针对字符串值,数字值,日期和时间比较,节操作,顺序操作,布尔值,等 解析用的java包 Java 5 推出了 javax.xml.xpath 包,这是一个用于 XPath 文档查询的独立于 XML 对象模型的库

selenium IDE(五)selenium 命令之定位页面元素

定位页面元素 对于很多selenium命令,target域是必须的.Target在web页面范围内识别UI元素,它使用locatorType=location的格式.在很多情况下,locatorType可以省略,下面举例方式来描述各种类型的locatorType. 假如,有如下一段HTML代码: html> <body> <form id= "loginForm" > <input name= "username" type= &

By.Xpath快速定位页面元素常用方法

先看一看xpath的语法 我们将在下面的例子中使用这个 XML 文档. <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book&g

Selenium 定位网页元素

第一 定位元素辅助工具 IE中在元素上右击 ->  “检查元素”,或按F12键打开开发者工具: Chrome中在元素上右击 -> “审查元素”,或按F12键打开开发者工具: Firefox中在元素上右击 -> “检查元素”,或安装插件Firebug打开开发者工具: http://getfirebug.com/ Firefox中可以安装xPathChecker通过xpath定位页面上元素. https://addons.mozilla.org/zh-CN/firefox/addon/xpa

【selenium学习笔记一】python + selenium定位页面元素的办法。

1.什么是Selenium,为什么web测试,大家都用它? Selenium设计初衷就是为web项目的验收测试再开发.内核使用的是javaScript语言编写,几乎支持所以能运行javaScript的浏览器,支持windows\linux\macos等各种平台. Selenium 脚本是用多种受支持的编程语言中的一种编写的 —— 目前可用的有 Java.Ruby 和 Python 驱动程序.这些脚本在浏览器之外的一个单独的进程中运行.驱动程序的任务是执行测试脚本,并通过与运行在浏览器中的 bro

java selenium (六) XPath 定位

什么是xpath xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们可以使用Xpath 的用法来定位页面元素. xpath定位的缺点 xpath 这种定位方式, webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素, 这是个非常费时的操作,  如果脚本中大量使用xpath做元素定位的话, 脚本的执行速度可能会稍慢 testXpath.html 代码如下 <html> <head><title>Test Xpa

Selenium定位HTML元素(Python)

本篇不是介绍通过各种方法(id, name, tag_name, css, xpath等)定位HTML各元素的普及性文章,网络上各种文档和博客介绍得均比较全面.这里只是将自己实践中,遇到的个别问题及解决方案进行记录. 在此推荐Selenium官方文档(Python版):http://selenium.googlecode.com/svn/trunk/docs/api/py/index.html 可以搜索关键字,得到函数用法和源码. 下面记录定位HTML元素方面遇到的问题和解决方法(持续更新).

定位页面元素之xpath详解以及定位不到测试元素的常见问题

一.定位元素的方法 id:首选的识别属性,W3C标准推荐为页面每一个元素设置一个独一无二的ID属性, 如果没有且很难找到唯一属性,解决方法:(1)找开发把id或者name加上.如果不行,解决思路可以是: 1. 找到该按钮的特征,例如按钮的文字是 submit: 2. 用XPath定位,可以这样写://button[@value='submit'].(注意是单引号!!) name:和id一致 ClassName:对某些具有相同类的元素一网打尽的好方法 link text 和 partial lin

Java+selenium之WebDriver定位页面元素(二)

Selenium-Webdriver 提供了强大的元素定位方法,支持以下三种方法: 单个对象的定位方法,多个对象的定位方法和层级定位 1. 定位单个元素 1 // 对于元素的属性包含 id 的情况适用,推荐使用 2 WebElement we = drive.findElement(By.id("id")); 3 // 对于元素的属性包含 name 的情况适用,推荐使用 4 WebElement we = drive.findElement(By.name("name&quo