XPath攻略:從入門到精通,元素查找不再難

簡介

XPath 是一種用於在 XML 文檔中檢索信息的語言。它通過路徑表達式導航 XML 文檔,廣泛應用於各種場景。XPath 的靈活性和強大功能使其成爲在 XML 結構中準確定位和提取數據的重要工具。

XPath 使用場景

Web 自動化測試:

  • XPath 在 Web 自動化測試中廣泛應用,XPath 提供了一種強大的定位方式。它能夠通過元素的層次結構、屬性、文本內容等進行更加靈活和精準的定位,適用於各種複雜的 Web 應用頁面。

App 自動化測試:

  • 在移動應用的自動化測試中,XPath 可以在原生應用和混合應用(Hybrid App)中定位和操作元素。在 App 的 UI 中,XPath 可以針對不同平臺(如iOS和Android)提供一致的選擇能力,使測試腳本更具通用性。

XPath 相對定位的優點

  • 可維護性更強:XPath 相對定位可以相對於其他元素的方式來定位元素。如果頁面結構發生變化,只需要更新相對路徑中的某些部分,而不必重新創建整個定位表達式。
  • 語法更加簡潔:XPath 相對路徑是相對於其他元素的路徑,更容易理解和編寫。與複雜的絕對路徑相比,相對路徑語法更加簡潔。
  • 相比於 css 可以支持更多的方式:XPath 相對定位可以訪問 XML 和 HTML 文檔的任何部分,而不僅僅是元素和屬性。

示例代碼如下:

# 複製的絕對定位
$x('//*[@id="ember75"]/td[1]/span/a')
# 編寫的相對行爲
$x(" //*[text()='技術分享 | SeleniumIDE用例錄製']")"SeleniumIDE用例錄製']"

XPath 定位的調試方式

瀏覽器-console:$x("XPath 表達式")。

瀏覽器-elements:ctrl+f 輸入 XPath 或者 css。

XPath 基礎語法(包含關係)

表達式 結果
/ 從該節點的子元素選取
// 從該節點的子孫元素選取
* 通配符
nodename 選取此節點的所有子節點
.. 選取當前節點的父節點
@ 選取屬性

XPath 基礎語法實戰

打開測試人社區(https://ceshiren.com/),F12 進入開發者模式,選擇 console

整個頁面

$x("/")

整個頁面中的所有元素

$x("/*")

整個頁面中的所有元素

$x("//*")

查找頁面上所有的 div 標籤節點

$x("//div")

查找 id 屬性爲 site-logo 的節點

$x('//*[@id="site-logo"]')

查找節點的父節點

$x('//*[@id="site-logo"]/..')

XPath 順序關係(索引)

XPath 通過索引直接獲取對應元素:

# 獲取此節點下的所有的li元素
$x("//*[@id='ember21']//li")
# 獲取此節點下【所有的節點的】第一個li元素
$x("//*[@id='ember21']//li[1]")

XPath 高級用法

語法 含義
[last()] 選取最後一個
[@屬性名='屬性值' and @屬性名='屬性值'] 與關係
[@屬性名='屬性值' or @屬性名='屬性值'] 或關係
[text()='文本信息'] 根據文本信息定位
[contains(text(),'文本信息')] 根據文本信息包含定位

注意:所有的表達式需要和[]結合。

XPath 高級用法實戰

打開測試人社區(https://ceshiren.com/),F12 進入開發者模式。

選取最新的元素

選取最後一個 div 標籤

$x("(//div)[last()]")

多個屬性共同定位-交集

選取屬性 id 的值爲 ember24 並且屬性 class 的值爲 nav-item_new new ember-view 的 input 標籤

$x("//*[@class='nav-item_new new ember-view' and @id ='ember24']")

多屬性共同定位-交集

選取屬性 id 的值爲 ember24 或屬性 id 的值爲 ember23 的 input 標籤

$x("//*[@id='ember23' or @id ='ember24']")

文本信息定位

選取所有文本信息爲'所有類別'的元素

$x(' //*[text()="所有類別"]')

文本信息包含定位

選取所有文本信息包'Python 測試開發'的元素

$x('//*[contains(text(),"Python測試開發")]')

Xpath 定位-實戰

測試步驟

  1. 打開測試人社區(https://ceshiren.com/)
  2. 使用 css 高級定位,進入【類別】的頁面。
  3. 獲取文本值進行斷言。

Python 實現

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By


class Test():
    def setup(self):
        service = Service()
        options = webdriver.ChromeOptions()
        self.driver = webdriver.Chrome(service=service,options=options)
        self.driver.implicitly_wait(10)

    def teardown(self):
        self.driver.quit()

    def test_xpath(self):
        self.driver.get("https://www.ceshiren.com")
        self.driver.find_element(By.XPATH,"//*[text()='類別']").click()
        text = self.driver.find_element(By.XPATH,"//*[text()='提問區']").text
        assert text == '提問區'

Java 實現

public class web_auto_lianxiTest {
    static  WebDriver driver;
    @BeforeAll
    static  void setup(){
        driver = new EdgeDriver();

    }

    @AfterAll
    static void teardown(){
        driver.quit();

    }

    @Test
    void test4() throws InterruptedException {
        //打開瀏覽器頁面
        driver.get("https://ceshiren.com/");
        //獲取選擇按鈕的元素
        WebElement search = driver.findElement(By.xpath("//*[@class='search-button']"));
        //點擊選擇按鈕
        search.click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(1));
        //獲取高級搜索按鈕的元素,並點擊
        WebElement super_search = driver.findElement(By.xpath("//*[@class ='show-advanced-search']"));
        super_search.click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(1));
        //點擊類型下拉框
        driver.findElement(By.id("search-type-header")).click();
        //選擇下拉框第二個元素點擊
        driver.findElements(By.className("select-kit-row")).get(1).click();

        //找到搜素輸入框,輸入web自動化測試並回車
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        // WebElement bar = driver.findElement(By.id("search-bar"));
        WebElement input_serach = driver.findElement(By.xpath("//div[@class='search-bar']//input\n"));
        input_serach.sendKeys("web自動化測試");
        input_serach.sendKeys(Keys.ENTER);
        //斷言對比
        String text = driver.findElement(By.className("search-results")).getText();
        assert text.contains("自動化"):"搜索結果裏沒有包含自動化字眼";
    }
}

總結

XPath定位是一種非常便捷的方法,不僅可以通過常規的id、class等屬性進行元素定位,還可以通過父子關係和後代關係來實現更靈活的定位。這使得XPath在元素選擇和定位方面具有獨特的優勢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章