如何手寫xpath

如何手寫xpath

  • 場景

一般狀況下, 咱們能夠瀏覽器自帶的定位方式, Firefox的F12, Chrome的開發者工具, 找到元素右鍵copy-copy xpath便可。html

  • 基本語法

XPath 使用路徑表達式在 XML 文檔中選取節點。節點是經過沿着路徑或者 step 來選取的。 下面列出了最有用的路徑表達式:瀏覽器

在下面的表格中,咱們已列出了一些路徑表達式以及表達式的結果:jsp

  • 定位方式

絕對路徑定位(直接copy瀏覽器xpath)

使用絕對路徑的方式定位除非是其父級元素都沒有一個惟一識別的元素才使用該方式;假如要定位到輸入框,那麼使用絕對路徑的方式爲:函數

xpath= /html/body/div/div/div/div/div/form/span/input

就是從根部開始找,一級一級往下走,若是有同級別的須要用[]標明序號,從1開工具

經過屬性查找
  • xapth = //*[@id="wrap"]
  • xpath = //input[@id="wrap]
  • xpath = //input[@type="text"]
  • xpth = //input[@name="zs"]

//input表示要匹配全部的元素,//*表示匹配全部元素的標籤spa

注意:要保證這些元素能夠是惟一的標識code

組合定位

若是input標籤中 id不是惟一的,type也不是惟一的,但在該頁面中包含該id和type的只有這個元素時,那麼咱們能夠用組合的方式定位orm

  • xpath = //input[@id="wrap and @name="zs"]
找父級屬性

若是本身沒有惟一的標誌,那麼就找本身的上級(父級),或者上級的上級,以此類推。htm

  • 找父級:xpath=//span[@class="s_ipt_wr"]/input
  • 找父級的父級:xpath=//form[@id="form"]/span[1]/input
跳級

若是須要定位的元素在該頁面不是惟一,但在某個容器內是惟一的,固然那個容器必需要有惟一的標誌; 跳級的話要用兩個//blog

謂語(Predicates)

謂語用來查找某個特定的節點或者包含某個指定的值的節點。

其餘
  • contains: xpath =//input[contains(@id,"w")], 表示選擇id中包含"w"的input節點
  • text(): xpath= //a[text()="地圖"]. 因爲一個節點的文本值不屬於屬性, ,因此,用text()函數來匹配節點
  • 特殊狀況列舉

1.列表有id屬性

接着複製列表的xpath會有問題,須要個別分析,以下:

分析:能夠看到列表li上面有id屬性,全部就不能直接寫xpath=//*[@id="line_u8_0"],須要找他的父級,能夠有兩種寫法

  • xpath=/html/body/div[4]/div[2]/div[2]/ul "找到父級ul的xpath"
  • xpath=//*[@class="linsdd"]//li "手寫xpath,經過找他父級的惟一標識,這裏注意跳級了因此用的是//"
2.列表有其餘無關元素參入

其餘無關的元素也在其中很差取,附上地址能夠練習一下。這裏須要用到 position用來查找某個特定的節點或者包含某個指定的值的節點。以下:

分析:這裏須要截取中間一部分,按這個頁面舉例,能夠看到是重第三條table開始,到倒數3條table結束,纔是真正的列表。要確保xpath精準,只有列表。

  • xpath=/html/body/table[position()>3 and position()<last()-3]
last() 選擇最後一個,也就是倒數第一個
last()-1 選擇倒數第二個
last()-2 選擇倒數第三個
...依次類推
3.沒法定位到正確列表,須要經過屬性尋找

毫無規律,也找不到對應的class,id等等,分析發現這裏看到他們的父級有valign屬性,變而且有無關元入參入,這裏須要用[@valign="top"]定位到元素,在配合截取,就完美解決了。

  • xpath=//td[@valign="top"]/table[position()>1 and position()<last()-2]//tr
相關文章
相關標籤/搜索