使用XPath軸方式,可根據文件中元素的相對位置,來進行元素的定位。例如:先找到一個相對好定位的元素,在根據與它的相對位置來定位其他元素,可以解決一些元素難以定位的問題。
1、XPath軸定位介紹
軸可理解為相對於當前節點的節點集。
軸名稱 | 結果 |
---|---|
ancestor |
選取當前節點的所有先輩(父、祖父等)。 |
ancestor-or-self |
選取當前節點的所有先輩(父、祖父等)以及當前節點本身。 |
attribute |
選取當前節點的所有屬性。 |
child |
選取當前節點的所有子元素。 |
descendant |
選取當前節點的所有後代元素(子、孫等)。 |
descendant-or-self |
選取當前節點的所有後代元素(子、孫等)以及當前節點本身。 |
following |
選取文件中當前節點的結束標籤之後的所有節點。 |
namespace |
選取當前節點的所有名稱空間節點。 |
parent |
選取當前節點的父節點。 |
preceding |
選取文件中當前節點的開始標籤之前的所有節點。 |
preceding-sibling |
選取當前節點之前的所有同級節點。 |
self |
選取當前節點。 |
2、位置路徑表示式概念
位置路徑可以是絕對的,也可以是相對的。
絕對路徑起始於正斜槓(/
),而相對路徑不會這樣。
在兩種情況中,位置路徑均包括一個或多個步,每個步均被斜槓分割:
(1)絕對位置路徑:
/step/step/...
(2)相對位置路徑:
//step/step/...
每個步均根據當前節點集之中的節點來進行計算。
(3)步(step)包括:
- 軸(
axis
):定義所選節點與當前節點之間的樹關係(如上表)。 - 節點測試(
node-test
):識別某個軸內部的節點(相當於標籤節點或者標籤節點集)。 - 零個或者更多謂語(
predicate
):索引。
(4)步的語法:
軸名稱::節點測試[索引]
3、步的路徑表示式範例
例子 | 結果 |
---|---|
child::book |
選取所有屬於當前節點的子元素的 book 節點。 |
attribute::lang |
選取當前節點的 lang 屬性。 |
child::* |
選取當前節點的所有子元素。 |
attribute::* |
選取當前節點的所有屬性。 |
child::text() |
選取當前節點的所有文字子節點。 |
child::node() |
選取當前節點的所有子節點。 |
descendant::book |
選取當前節點的所有 book 後代。 |
ancestor::book |
選擇當前節點的所有 book 先輩。 |
ancestor-or-self::book |
選取當前節點的所有 book 先輩以及當前節點(如果此節點是 book 節點) |
child::*/child::price |
選取當前節點的所有 price 孫節點。 |
4、練習
頁面程式碼片段:
<!DOCTYPE html>
<html lang="zh-cn">
<body>
<div id="zc">
<legend>註冊使用者A</legend>
<p id="p1">
<label for="userA">賬號A</label>
<input type="textA" name="userA" id="userA" class="c_uA" placeholder="賬號A" required="" value="">
</p>
<p>
<label for="password">密碼A</label>
<input type="password" name="passwordA" id="passwordA" placeholder="密碼A" value="">
</p>
<p><a href="http://www.sina.com.cn" id="fwA">訪問 新浪 網站</a></p>
<input type="emailA" name="emailA" id="emailA" placeholder="電子郵箱A" value="">
</div>
</body>
</html>
程式碼指令碼:
"""
1.學習目標:
必須掌握selenium中軸定位方法
2.語法
2.1 選擇當前元素之後的同級元素
語法://A/following-sibling::B
說明:選擇所有 A 元素之後同級的 B 元素。
2.2 選擇當前元素之前的同級元素
語法://A/preceding-sibling::B
說明:選擇所有 A 元素之前同級的 B 元素。
2.3 其他的軸定位關鍵字,可自己擴充練習。
3.需求
在頁面中,定位指定元素。
"""
# 1.匯入selenium
from selenium import webdriver
from time import sleep
import os
# 2.開啟瀏覽器
driver = webdriver.Chrome()
# 3.開啟註冊A頁面
url = "file:///" + os.path.abspath("./1.html")
driver.get(url)
# 4.定位頁面指定元素
# 4.1 選擇當前元素之後的同級元素
# 選擇所有<legend>標籤之後的同級的<p>元素
elements_1 = driver.find_elements_by_xpath("//legend/following-sibling::p")
for element in elements_1:
print(element.get_attribute("outerHTML"))
# 4.2 選擇當前元素之前的同級元素
# 選擇所有<input>之前的同級的<p>元素
elements_2 = driver.find_elements_by_xpath("//input/preceding-sibling::p")
for element in elements_2:
print(element.get_attribute("outerHTML"))
# 5.關閉瀏覽器
sleep(2)
driver.quit()
"""
輸出結果:
列印兩次如下內容
<p id="p1">
<label for="userA">賬號A</label>
<input type="textA" name="userA" id="userA" class="c_uA" placeholder="賬號A" required="" value="">
</p>
<p>
<label for="password">密碼A</label>
<input type="password" name="passwordA" id="passwordA" placeholder="密碼A" value="">
</p>
<p><a href="http://www.sina.com.cn" id="fwA">訪問 新浪 網站</a></p>
"""