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("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”

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容