自學網站:http://www.runoob.com/xpath/xpath-axes.html
在appium中只是使用xpath技術查找元素,其他的不適用
什麼是xpath:XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。
一、選取節點
XPath 使用路徑表達式在 XML 文檔中選取節點。節點是通過沿着路徑或者 step 來選取的。
下面列出了最有用的路徑表達式:
表達式 |
描述 |
/ |
從根節點選取。(絕對路徑) |
// |
從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。(相對路徑) |
. |
選取當前節點。(表示當前的) |
.. |
選取當前節點的父節點。(當前目錄或路徑的上一級) |
@ |
選取屬性。 |
[ ] |
索引,從1開始 |
* |
表示所有,不限制元素的類型 |
實例
在下面的表格中,我們已列出了一些路徑表達式以及表達式的結果:
路徑表達式 |
結果 |
/html |
選取根元素 html。 註釋:假如路徑起始於正斜槓( / ),則此路徑始終代表到某元素的絕對路徑! |
html/body |
選取屬於 html 的子元素的所有 body 元素。 |
//div |
選取所有 div子元素,而不管它們在文檔中的位置。 |
//body//div |
選擇屬於 body 元素的後代的所有 div 元素,而不管它們位於 body 之下的什麼位置。 |
//@id |
選取有 id 屬性的所有元素。 |
二、謂語(Predicates)
謂語用來查找某個特定的節點或者包含某個指定的值的節點。
謂語被嵌在方括號中
實例
在下面的表格中,我們列出了帶有謂語的一些路徑表達式,以及表達式的結果:
路徑表達式 |
結果 |
/html/body/div[1] |
選取屬於 body 子元素的第一個 div 元素。 |
/html/body/div[last()] |
選取屬於 body子元素的最後一個 div元素。 |
/html/body/div[1]/div[last()-1] |
選取屬於 body子元素的第一個div子元素的倒數第二個 div 元素。 |
/html/body/div[1]/div[position()<3] |
選取屬於 body子元素的第一個div子元素的前兩個 div 元素。 Position表示的是一個位置 |
//a[@id] |
選取所有具有id 的屬性的 a 元素。 |
//a[@id='nav_default'] |
選取所有 a 元素,且這些元素的id屬性值爲nav_default |
//body//div[span>223] |
選取 body 元素下的所有 div 元素,且其中的 span 元素的值須大於 223。 |
//body//div[span>22]/strong |
選取 body子元素中的 div元素下的所有 strong元素,且其中的 span元素的值須大於 223。 |
//div[contains(@class’top’)] |
查找class包括top的元素 |
//*[contains(@class’top’)] |
查找包括top的元素,不限制類型 |
三、選取未知節點
XPath 通配符可用來選取未知的 XML 元素。
通配符 |
描述 |
* |
匹配任何元素節點。 |
@* |
匹配任何屬性節點。 |
node() |
匹配任何類型的節點。 |
實例
在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:
路徑表達式 |
結果 |
//body/* |
選取 body 元素的所有子元素。 |
//* |
選取文檔中的所有元素。 |
//a[@*] |
選取所有帶有屬性的 a 元素。 |
四、選取若干路徑
通過在路徑表達式中使用“|”運算符,您可以選取若干個路徑。
實例
在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:
路徑表達式 |
結果 |
//li | //ul |
選取所有的 li元素和 ul元素。 |
五、XPath 軸
軸可定義相對於當前節點的節點集。
軸名稱 |
結果 |
ancestor |
選取當前節點的所有先輩(父、祖父等)。不包自己 |
ancestor-or-self |
選取當前節點的所有先輩(父、祖父等)以及當前節點本身。 |
attribute |
選取當前節點的所有屬性。 |
child |
選取當前節點的所有子元素。 |
descendant |
選取當前節點的所有後代元素(子、孫等)。 |
descendant-or-self |
選取當前節點的所有後代元素(子、孫等)以及當前節點本身。 |
following |
選取文檔中當前節點的結束標籤之後的所有節點。 |
namespace |
選取當前節點的所有命名空間節點。 |
parent |
選取當前節點的父節點。 |
preceding |
選取文檔中當前節點的開始標籤之前的所有節點。 |
preceding-sibling |
選取當前節點之前的所有同級節點。兄弟節點 |
self |
選取當前節點。 |
實例
例子 |
結果 |
//*[@id='course']/child::ul |
選取id值爲course的元素的所有ul子元素。 |
//div/attribute::id |
選取具有id屬性的所有div元素 |
//div[@id='course']/child::* |
選取id值爲course的元素的所有子元素。 |
//div[@id='course']/descendant::li |
選取id值爲course的元素的所有後代li元素 |
//*[@id='nav_default']/ancestor::li |
選擇id爲nav_default節點的所有 li 先輩。 |
.//*[@id='nav_default']/parent::li |
選擇id爲nav_default節點的所有 li父元素。 |
//div[@id='course']/preceding-sibling::* |
選擇id爲course元素的之前的所有同級元素,哥哥姐姐們 |
//div[@id='course']/following-sibling::* |
選擇id爲course元素的之後的所有同級元素,弟弟妹妹們 |
六、自我實用總結
- <html> 標籤相當於uiautomator中的class屬性
Xpath中的根節點是<html>
Uiautomator根節點是class
2、Xpath下查找html下的body元素
Uiautomator中的選擇
/android.widget.FrameLayout/android.widget.LinearLayout
3、查找div標籤
1)絕對路徑: /html/body/div[2] 或 html/body/div[2]
2)相對路徑: //body/div[2]
4. 查找所有的div標籤
5. 查找統計所有的div標籤
6. 查找具備id屬性的div的標籤
7、查找id屬性等於global-navbar的div變遷
8、複製帶空格的class屬性,必須加兩個空格
9. 在div標籤中,查找class屬性,class屬性的值包含top的元素
10、查找最後一個div標籤
11、查找倒數第二個div標籤
12、選擇前三個,用position()
13、選擇倒數兩個div
14、選擇body下所有的子元素(不包含body本身),不包含body子元素的子元素
15、查找body下所有的子元素和子元素的子元素
16、查找div標籤或者a標籤——》結果:就是a和div都會被找到
17、通過用戶登錄找到立即註冊,找上級
先找到用戶登錄的上一級標籤,通過上一級標籤找到立即註冊