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("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”和值為“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”