<html>
<body>
<div id="div1">
<input name="div1input"></input>
<a href="https://www.sogou.com">搜狗搜尋</a>
<img alt="div1-img1" src="logo.png"></img>
<input type="button" value="查詢"></input>
</div>
<div name="div2">
<input name="div2input" />
<a href="https://www.baidu.com">百度搜尋</a>
<img alt="div2-img2" src="bdlogo.png"></img>
</div>
</body>
</html>
/html/body/div/input[@value='查詢']
從根節點開始,層層遞歸。**極度脆弱**,任何中間層級增減即失效。
//input[@value='查詢']
從文檔任意節點開始搜尋,**不依賴完整層級結構**,健壯性大幅提升。
//input[2] // 第 2 個 input 元素 (索引從 1 開始)
同層級同標籤第 N 個元素。結構變動時易失效,慎用。
//img[@alt='div1-img1']
最常用、最穩健的方式。善用 id、name、data-* 等語義化屬性。
//img[starts-with(@alt, 'div1')]
屬性值以指定字串開頭。動態生成的 ID (如 `id="user_12345"`) 適用:`//div[starts-with(@id, 'user_')]`。
//img[contains(@alt, 'g1')]
屬性值**包含**指定字串。比 starts-with 更靈活,但效能稍差。
//*[text()='百度搜尋'] // 精確文字 //a[contains(text(), '搜尋')] // 部分鏈結文字
定位可見文字內容。**注意**:`text()` 僅匹配直接文字節點,不包含子元素文字。
| 軸線 | 語法範例 | 說明 |
|---|---|---|
| parent | //input[@value='查詢']/parent::div | 父節點 |
| ancestor | //input[@value='查詢']/ancestor::div | 所有祖先節點 |
| following-sibling | //div[@id='div1']/following-sibling::div | 同層後續兄弟節點 |
| preceding-sibling | //div[@name='div2']/preceding-sibling::div | 同層前序兄弟節點 |