xpath的作用就是兩個字“定位”,
運用各種方法進行快速準確的定位毁渗,推薦兩個非常有用的的firefox工具:firebug和xpath checker
在 XPath 中杨幼,
有七種類型的節(jié)點:元素粱腻、屬性蓖捶、文本马昨、命名空間把曼、處理指令胡岔、注釋以及文檔(根)節(jié)點
XML 文檔是被作為節(jié)點樹來對待的椿息。樹的根被稱為文檔節(jié)點或者根節(jié)點
節(jié)點關(guān)系
<bookstore> <book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore>
父節(jié)點:每個元素及屬性都有父節(jié)點歹袁。
子節(jié)點:元素節(jié)點可以有0個或1個或n個子節(jié)點。
同胞節(jié)點:擁有相同父節(jié)點的節(jié)點寝优。
先輩節(jié)點:某個節(jié)點的父節(jié)點条舔,祖父節(jié)點等等。
后代節(jié)點:某個節(jié)點的子節(jié)點乏矾,孫子節(jié)點等等孟抗。
book 元素是 title迁杨、author、year 以及 price 元素的父節(jié)點
title夸浅、author仑最、year 以及 price 元素都是 book 元素的子節(jié)點
title扔役、author帆喇、year 以及 price 元素都是同胞節(jié)點
title 元素的先輩是 book 元素和 bookstore 元素
bookstore 的后代是 book、title亿胸、author坯钦、year 以及 price 元素
bookstore 選取 bookstore 元素的所有子節(jié)點
/bookstore 選取根元素 bookstore
bookstore/book 選取屬于 bookstore 的子元素中的所有 book 元素
bookstore//book 選擇屬于 bookstore 的后代中的所有 book 元素,
而不管它們位于 bookstore 之下的什么位置
//book 選取所有 book 子元素侈玄,而不管它們在文檔中的位置
//@lang 選取名為 lang 的所有屬性
Predicates謂語用來查找某個特定的節(jié)點或者包含某個指定的值的節(jié)點
謂語被嵌在方括號中
/bookstore/book[1] 選取屬于 bookstore 子元素的第一個 book 元素
/bookstore/book[last()] 選取屬于 bookstore 子元素的最后一個 book 元素
/bookstore/book[last()-1] 選取屬于 bookstore 子元素的倒數(shù)第二個 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 子元素節(jié)點
//title | //price 選取文檔中的所有 title 和 price 元素節(jié)點
/bookstore/book/title | //price 選取屬于 bookstore 元素的 book 元素的所有 title 元素序仙,
以及文檔中所有的 price 元素
xpath語法
. 代表當前節(jié)點路徑
..代表當前節(jié)點路徑的父節(jié)點
- 匹配任何標簽元素節(jié)點
@*匹配人和屬性節(jié)點
node()匹配任何類型的節(jié)點
/ 從根節(jié)點選取
// 從匹配選擇的當前節(jié)點選擇文檔中的節(jié)點突颊,而不考慮它們的位置
@ 選取屬性
定位
1.依靠自己屬性,文本定位
//td[text()='xxx']
//div[contains(@class,'xxx')]
//div[@class='xxx' and @type='xxx']
2.依靠父節(jié)點定位
//div[@class='xxx']/div
//div[@id='xxx']/div
3.依靠子節(jié)點定位
//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即為“選擇當前節(jié)點之后的所有同級節(jié)點”潘悼,那么沒有加上“sibling”關(guān)鍵字的律秃,搜索的就是之上/之下的所有節(jié)點,忽略同級概念治唤,例如:
<div>
<input id="123">
<input>
</div>
要定位第二個input://input[@id='123']/following-sibling::input
2.preceding-sibling
preceding-sibling的解釋是“選取當前節(jié)點之前的所有同級節(jié)點”棒动,那么沒有加上“sibling”關(guān)鍵字的,搜索的就是之上/之下的所有節(jié)點宾添,忽略同級概念船惨, 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] 中間結(jié)構(gòu)變化粱锐,就失效
相對路徑 //開始,在整個html source里找扛邑,不管在什么位置
索引[x] //div/input[2] div下面第二個input
position()=2
position()>3
position()<3
last()
last()-1
屬性定位 //div[@class] 有class屬性的div
屬性值定位卜范, //div[@class='xxx']
功能關(guān)鍵字
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(),'前端開發(fā)')]")
By.xpath("http://span[@name='username' and text()='用戶名']")
By.xpath("http://div[class='item']/li[3]")
By.xpath("http://*[@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”和值為“l(fā)oginForm”的表單元素
xpath=//form[input/@name='username'] -具有輸入子元素的第一個表單元素舱殿,其屬性名為“name”奥裸,值為“username”
//input[@name='username'] -第一個輸入元素的屬性名為“名稱”和值“用戶名”
//form[@id='loginForm']/input[1] -首先輸入具有名為“id”的屬性和值“l(fā)oginForm”的表單元素的子元素
//input[@name='continue'][@type='button'] -輸入屬性名為'name',值為'continue'沪袭,屬性名為'type'湾宙,值'button'
//form[@id='loginForm']/input[4] -表單元素的第四個輸入子元素樟氢,其屬性名為“id”,值為“l(fā)oginForm”