Xpath表達式寫法
先看錯誤示例 復制而來的
頁面上選擇元素 右鍵檢查(元素) 在元素代碼上復制xpath而來的示例
上圖中二三行示例:
絕對路徑-不准
:以/開頭 從根節點開始顯示所找元素在DOM樹中路徑, div[2] div塊,2是序號,從1開始不是從0開始的,前端開發如果改變了dom樹順序或新增了div內容,此路徑就找不到原元素了 不推薦使用
相對路徑-推薦使用
Xpath格式如下:
1.基本用法: //標簽名[@屬性名=值]
2.疊加用法 支持邏輯運算and/or:
//標簽名[@屬性名=值 and @屬性名=值]
//標簽名[@屬性名=值 or @屬性名=值]
//*[@id="virus-2020"] *為通配符
實操:
F12 /element
選中元素,高亮元素所在標簽行后,ctrl+F5打開搜索框,按高亮行中內容去搜索,時刻注意搜索框中結果個數,當結果唯一了就不用累加組合條件了, 結果多個時支持點擊小箭頭上下翻動再次找出我要找的再往上累加條件。
所選組合條件優先用id name
3.xpath復雜寫法1-拼爹 拼祖宗
如下圖定位百度首頁的登陸按鈕:// a[@name="tj_login" ] 會得到兩條結果如下圖框出來的,其他屬性都一樣。
解決方法:拼爹甚至拼爺
//div[@id="u1"]/a[@name="tj_login" ]第二個寫為/,代表下一層是上一層的兒子
//div[@id="u1"]//a[@name="tj_login" ] 第一個//代表以整個DOM樹為相對路徑,第二個//代表其上層寫的div為相對路徑 或理解為下層為上層的子、孫都可以,建議都用//。
//代表相對路徑
/代表絕對路徑
4.xpath復雜寫法2-包含://標簽名[contains(@屬性名/text(),”要包含的內容”)]
場景如:定位鏈接, 鏈接中帶有動態ID, 可用模糊匹配
如下圖想定位“作業”,但不是每個學員登陸都顯示的是22期的作業,即對應的鏈接中的id不一致,但前半段是一至的,即用://a[contains(@href, “/Course/homework/courseid/”)] (勿掉引號)
5.xpath復雜寫法3-元素文本匹配: //標簽名[text()=” “]
如上圖 則 寫為: //a[text()=”作業”]
文本和屬性都支持精准匹配+部分匹配,所以文本的部分匹配為://標簽名[contains(text(),”要包含的內容”)]
6.以上五種方法可以隨意組合疊加
原則:xpath定位可能不止一種表達方式 但盡量不要用會變的東西來定位
//標簽名[@屬性=值 and text()=值 and contains(@屬性/text(), 值)]
我踩過的坑:用class來找時 如果class有多個值 一次只能找一個值,所以要用contains只取其中一個來匹配。
7.軸定位
之前是從上往下找,現在可以從下往上或平行的找,如叔叔 表哥 表叔等。
語法:已知元素/軸名稱::標簽名稱[@屬性=值] 后面還可以加’’/軸名稱::標簽名稱[@屬性=值]’’
一定是單斜杠
軸名稱即上圖中的軸運算
正確寫法://dd[@data_val=”張芝波”]/following-sibling::dd[contains(@class,”batscore”)]/span (span標簽只有一個所以不用繼續寫屬性 )
注意有坑:錯誤示例如//dd[@data_val=”張芝波”]/following-sibling::dd[1]/span前面沒用下標/序號,后面也不能用,要用必須從第一個能用的地方開始用!
又如://p[contains(@title,'噼')]/parent::li (軸定位到父,只會有一個父 所以父屬性可以省)
8.css selector定位
支持xpath定位方法中的1-3,不支持其4-5,所以功能不如xpath強大 此處不講