『心善淵』Selenium3.0基礎 — 7、XPath軸定位詳解

繁華似錦Fighting發表於2021-06-28

使用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>
"""

相關文章