簡介
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 定位-實戰
測試步驟
- 打開測試人社區(https://ceshiren.com/)
- 使用 css 高級定位,進入【類別】的頁面。
- 獲取文本值進行斷言。
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在元素選擇和定位方面具有獨特的優勢。