xpath定位

xpath的作用就是两个字“定位”,

运用各种方法进行快速准确的定位,推荐两个非常有用的的firefox工具:firebug和xpath checker

在 XPath 中,

有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点

XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点

节点关系

<bookstore> <book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore>

父节点:每个元素及属性都有父节点。

子节点:元素节点可以有0个或1个或n个子节点。

同胞节点:拥有相同父节点的节点。

先辈节点:某个节点的父节点,祖父节点等等。

后代节点:某个节点的子节点,孙子节点等等。

book 元素是 title、author、year 以及 price 元素的父节点

title、author、year 以及 price 元素都是 book 元素的子节点

title、author、year 以及 price 元素都是同胞节点

title 元素的先辈是 book 元素和 bookstore 元素

bookstore 的后代是 book、title、author、year 以及 price 元素

bookstore 选取 bookstore 元素的所有子节点

/bookstore 选取根元素 bookstore

bookstore/book 选取属于 bookstore 的子元素中的所有 book 元素

bookstore//book 选择属于 bookstore 的后代中的所有 book 元素,

而不管它们位于 bookstore 之下的什么位置

//book 选取所有 book 子元素,而不管它们在文档中的位置

//@lang 选取名为 lang 的所有属性

Predicates谓语用来查找某个特定的节点或者包含某个指定的值的节点

谓语被嵌在方括号中

/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素

/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素

/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素

/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素

//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素

/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,

且其中的 price 元素的值须大于 35.00

/bookstore/* 选取 bookstore 元素的所有子元素

//* 选取文档中的所有元素

//title[@*] 选取所有带有属性的 title 元素

通过在路径表达式中使用“|”运算符,您可以选取若干个路径

//book/title | //book/price 选取 book 元素的所有 title 和 price 子元素节点

//title | //price 选取文档中的所有 title 和 price 元素节点

/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,

以及文档中所有的 price 元素

xpath语法

. 代表当前节点路径

..代表当前节点路径的父节点

  • 匹配任何标签元素节点

@*匹配人和属性节点

node()匹配任何类型的节点

/ 从根节点选取

// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置

@ 选取属性

定位

1.依靠自己属性,文本定位

//td[text()='xxx']

//div[contains(@class,'xxx')]

//div[@class='xxx' and @type='xxx']

2.依靠父节点定位

//div[@class='xxx']/div

//div[@id='xxx']/div

3.依靠子节点定位

//div[div[@id='xxx']]

//div[div[@name='xxx']]

4.混合型

//div[div[@name='xxx']]/img

//td[a/font[contains(text(),'xxx')]]//input[@type='xxx']


xpath的学习-拓展

1.following-sibling

following-sibling即为“选择当前节点之后的所有同级节点”,那么没有加上“sibling”关键字的,搜索的就是之上/之下的所有节点,忽略同级概念,例如:

<div>

<input id="123">

<input>

</div>

要定位第二个input://input[@id='123']/following-sibling::input

2.preceding-sibling

preceding-sibling的解释是“选取当前节点之前的所有同级节点”,那么没有加上“sibling”关键字的,搜索的就是之上/之下的所有节点,忽略同级概念, preceding-sibling和following-sibling是刚好相反的

<div>

<span>text</span>

<input id="123">

</div>

要定位第二个input://input[@id='123']/preceding-sibling::span

3.contains

和字面意思一样就是包含,例如://div[contains(@class,'xxx')]

4.starts-with

和字面意思一样就是以某某开头,例如://input[starts-with(@class,'xxx')]

5.not

就是否定的意思

比如找一个id不为123的input:input[not[id='123']]

又如找一个文本中不包含xxx字段的span://span[not(contains(text(),'xxx'))]

xpath的学习-补充

绝对路径 html/body/div/span[2]/input[2] 中间结构变化,就失效

相对路径 //开始,在整个html source里找,不管在什么位置

索引[x] //div/input[2] div下面第二个input

position()=2

position()>3

position()<3

last()

last()-1

属性定位 //div[@class] 有class属性的div

属性值定位, //div[@class='xxx']

功能关键字

1.常用

and或者[][],

比如://span[@name='xxx' and text()='xxx']

也是可以写成//span[@name='xxx'][text()='xxx']

or,比如以上面html为例子,定位文本为test position()5和test position()4的span://div[@id='positions']/span[text()='test position()5' or text()='test position()4']

not,

contains,

starts-with

ends-with 在xpath中是没有这个的

通配符 *

比如//span[@*="xxx"]指定位span中任意属性包含xxx的

比如//[@="xxx"]指定位页面中任意属性保护xxx的标签

测试实例

By.xpath(".//a/span[contains(text(),'前端开发')]")

By.xpath("//span[@name='username' and text()='用户名']")

By.xpath("//div[class='item']/li[3]")

By.xpath("//*[@id="main"]/div[2]/div/div[9]/div[4]")

[图片上传失败...(image-6bb2e9-1534856975794)]

xpath=/html/body/form[1] -绝对路径(如果HTML只是稍微改变,会中断)

//form[1] -HTML中的第一个表单元素

xpath=//form[@id='loginForm'] -属性名为“id”和值为“loginForm”的表单元素

xpath=//form[input/@name='username'] -具有输入子元素的第一个表单元素,其属性名为“name”,值为“username”

//input[@name='username'] -第一个输入元素的属性名为“名称”和值“用户名”

//form[@id='loginForm']/input[1] -首先输入具有名为“id”的属性和值“loginForm”的表单元素的子元素

//input[@name='continue'][@type='button'] -输入属性名为'name',值为'continue',属性名为'type',值'button'

//form[@id='loginForm']/input[4] -表单元素的第四个输入子元素,其属性名为“id”,值为“loginForm”

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容