XPATH元素定位詳解

Xpath,Css元素通用定位

一、問題:
通常情況下,元素定位使用id、name、class、text可以滿足日常大部分定位需求。但是

隨着自動化測試的深入,和不同框架要求,會發現上面的定位方式無法解決一些元素定位。尤其對於這樣一些元素:

1、沒有id、name、class等屬性;

2、標籤的屬性或文本信息特徵沒有或者不明顯;

3、標籤嵌套複雜,層次太多等。

這時候我們不得不借助Xpath和Css來實現元素定位了

二、Xpath定位
1.xpath簡介

XPath是XML Path的簡稱,它是一種用來確定XML(可擴展標記語言)文檔中某部分位置的語言。Xpath也是一種表達式語言,它基於XML的樹狀結構,可以用來在整個樹中來尋找指定的節點,因此它的返回值可能是節點,節點集合,原子值,以及節點和原子值的混合等。由於HTML文檔本身就是一個標準的XML頁面,因此我們可以使用XPath的語法來定位頁面元素。

2.通用定位:

由於絕對路徑會極易受中間層級變動影響,一般使用相對路徑定位

比如:

<id=“form1” class=“fm” action="/s" name=“f1”>

2.1、根據元素自身屬性,使用單個屬性定位(加上前面的標籤名來定位)
Xpath = //*[@id=’kw1’]

//表示某個層級下,*表示某個標籤名。@id=kw1 表示這個元素有個id等於kw1 。

當然,一般可以指定標籤名:

Xpath = //input[@id=‘kw1’]

元素本身,可以利用的屬性就不只侷限爲於id和name ,在<>開始標記內除標籤外,其他都可以看做是屬性,如:

Xpath = //input[@type=‘text’]

Xpath = //input[@autocomplete=‘off’]

需保證這些元素可以唯一的識別一個元素。

2.2、使用多個屬性定位
蟲師比喻的好:根據一個人的身份證和姓名來唯一確定一個人

Xpath = //input[@id=‘kw1’ and @name=‘wd’]

或者Xpath = //input[@id=‘kw1’][@name=‘wd’]

2.3、使用父子關係來定位
<id=“form1” class=“fm” action="/s" name=“f1”>

通過爸爸來定位:

xpath = //span[@class=’bg s_ipt_w’]/input

如果爸爸沒有唯一的屬性,可以找爺爺:

xpath = //form[@id=’form1’]/span/input

2.4、使用常用函數來輔助定位
在這裏插入圖片描述

1)字符串查找函數: contains()

語法:contains(string1,string2),表示如果 string1 包含 string2,則返回 true,否則返回 false。

b.獲取元素的文本內容: text()

c.從起始位置匹配字符串:starts-with ()

2.5Xpath軸:
上面這些方法都不能定位時,這時候就得考慮依據元素的父輩、兄弟或者子輩節點來定位了,這就需要用到Xpath軸,利用軸可定位某個相對於當前節點的節點集。

語法:軸名稱::標籤名

在這裏插入圖片描述

例如使用瀏覽器默認定位得到的xpath是:

//*[@id=‘validate’]/dl/dd[6]/span[2]/p/span

現在使用Xpath的following軸就可以輕鬆定位到:

//*[@id=‘pricetip’]/following::span[1]

2.6Xpath絕對路徑

在這裏插入圖片描述

xpath=(//input[@name=‘account’])[2]

在這裏插入圖片描述
選擇分支:

對於存在多個元素時想唯一定位,可以使用[]中括號來選擇分支,下標從1開始(切記不是像數組那樣從0開始哦)。

在這裏插入圖片描述

三、css定位
Css的定位更靈活,因爲他它用到的更多的匹配符和規格。

http://www.w3school.com.cn/cssref/css_selectors.asp

【舉例】

在這裏插入圖片描述

2種定位方式

css=.footer-link .stop (class=footer-link元素內的所有class=stop的元素。如果stop只有1個的話,那麼直接css=.stop也可以 )

xpath=//a[text()=“停止投放”]’ 文本等於“停止投放”的所有鏈接a元素

對於有子元素的,可以使用元素:nth-child(n)表示:
在這裏插入圖片描述

css=#ershou .category-group a:nth-child(2)

在這裏插入圖片描述
在這裏插入圖片描述

<form id="form1" class="fm" action="/s" name="f1">
    <span class="bg s_ipt_wr">
    <input id="kw1" class="s_ipt" type="text" maxlength="100" name="wd" autocomplete="off">

3.1 id定位: css=#kw1

3.2 class定位:css=.s_ipt

3.3 單個屬性定位:css=[name=wd] css=[type=text] css=[autocomplete=off]

3.4 多個屬性定位:css=[#form1 input[name=text]]

3.5 父子定位:

css=span > input

css=form > span > input

3.6 根據標籤名定位:

css=input

再次舉例:
在這裏插入圖片描述

想要定位到某個元素的話,首先應該考慮這個元素有沒有唯一屬性,例如id。

如果沒有唯一屬性的話,再考慮從這個元素的父元素、祖宗元素、隔壁元素中找到唯一屬性,然後再定位到這個元素(參考)。

//通過有唯一屬性的父元素,向下定位到目標元素。注意"空格"和">"的區別

css =“li[data-sku=‘13435315793’] .p-img>a”

這樣一來,不管這個數據的位置如何改變,只要改商品的標誌,即13435315793不變,測試用例都不需要額外的維護了。

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