Appium根據(jù)xpath獲取控件實(shí)例隨筆
時(shí)間?2014-10-03 10:45:11CSDN博客
原文http://blog.csdn.net/zhubaitian/article/details/39754233
如文章《Appium基于安卓的各種FindElement的控件定位方法實(shí)踐》所述辐啄,Appium擁有眾多獲取控件的方法雏亚。其中一種就是根據(jù)控件所在頁(yè)面的XPATH來(lái)定位控件。
本文就是嘗試通過(guò)自己的試驗(yàn)來(lái)嘗試對(duì)Appium如何用xpath來(lái)定位控件做一個(gè)闡述等孵,當(dāng)中如有不對(duì)的地方敬請(qǐng)大家指出。
1. 背景
本文嘗試使用的試驗(yàn)對(duì)象是SDK自帶的NotePad應(yīng)用實(shí)例忆谓,假設(shè)已經(jīng)有兩個(gè)Notes分別是“note1”和“note2”添加到Notepad上面孙技,我們要做的就是嘗試用xpath的方法來(lái)定位“note2”這個(gè)ListView下面的TextView控件。
注意界面上有3個(gè)TextView類型的控件:
最上面的作為整個(gè)ListView的Title文本為“Notes”的TextView崖咨,Index為0
中間的文本為“note2”的TextView锻拘,Index也是0
最下面的文本為“note1”的TextView,Index是1
2. xPath獲取控件方式
2.1 通過(guò)判斷控件屬性獲取控件
控件的所有屬性都可以用作判斷,比如它的text署拟,index婉宰,resource-id是否clickable等,例如:
2.1.1 通過(guò)文本查找目標(biāo)控件
el = driver.findElementByXPath("http://android.widget.TextView[contains(@text,'note2')]");? ? ? ? assertThat(el.getText(),equalTo("note2"));
2.1.2 通過(guò)index查找目標(biāo)控件
如果我們像下面的方式使用index為0來(lái)查找控件note2推穷,那么將會(huì)失敗心包,因?yàn)樵搙path只是說(shuō)“我要查找頁(yè)面上android.widget.TextView類型的index為0的控件“,但如背景所說(shuō)我們事實(shí)上有3個(gè)TextView控件馒铃,其中最上面的和中間的控件他們的Index都是0.所以最終獲得的控件其實(shí)是Appium第一個(gè)找到的最上面文本為”Notes“的TextView蟹腾。
el = driver.findElementByXPath("http://android.widget.TextView[contains(@index,0)]");? ? ? ? assertThat(el.getText(),equalTo("note2"));
那么我們就要想辦法加多點(diǎn)路徑,讓xpath能分辨出需要的是下面的index為0的TextView区宇,而不是上面的娃殖。觀看上圖的UIAutomatorViewer控件的分層結(jié)構(gòu),發(fā)現(xiàn)這兩個(gè)TextView是從LinearLayout開始分叉的议谷,所以我們應(yīng)該從該路徑開始通過(guò)數(shù)組下標(biāo)指定我們需要的是”在LinearLayout下面的第二個(gè)FrameLayout下面的ListView下面的Index為0的TextView:
el = driver.findElementByXPath("http://android.widget.LinearLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.TextView[contains(@index,0)]");? ? ? ? assertThat(el.getText(),equalTo("note2"));
2.1.3 通過(guò)其他屬性查找目標(biāo)控件
TBD
炉爆,這些就不一一列舉了,參照以上兩個(gè)示例進(jìn)行實(shí)現(xiàn)就可以了
2.2 通過(guò)指定選擇集合的位置獲得控件
按照我的實(shí)踐和理解卧晓,通過(guò)這種方式獲取控件是不靠譜的芬首,起碼存在兩個(gè)問(wèn)題。
問(wèn)題1:控件在集合中的位置是不可控的逼裆。
el = driver.findElementByXPath("http://android.widget.TextView[1]");? ? ? ? assertThat(el.getText(),equalTo("note2"));
以上的例子我原意是想把UIAutomatorViewer里面的上中下3個(gè)TextView中的中間那個(gè)給找出來(lái)郁稍,但結(jié)果返回來(lái)給我的確實(shí)最上面的那個(gè)“Notes”。
問(wèn)題2:通過(guò)增加路徑層數(shù)限制查找指定元素集合不起效胜宇。
el = driver.findElementByXPath("http://android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.TextView[0]");? ? ? ? assertThat(el.getText(),equalTo("note2"));
以上例子我本意是想通過(guò)增加父路徑的限制來(lái)表明“我想要的控件是ListView下面的那兩個(gè)TextView控件中的第一個(gè)”耀怜,但返回給我的是“An unknown server-side error occurred while processing the command",感覺是越界了的樣子。
2.4 xpath用法官方手冊(cè)
至于其他非主流獲的通過(guò)xpath取控件的方式掸屡,請(qǐng)參考xpath官方手冊(cè)中文版:http://wenku.baidu.com/link?url=tLdn9X4ucgmzYyKj4dpsgSDbshXEw6W8BTyqQAXd0kTMY6lBQqLiIL9FHtcZmdIeO8o5ZKV-fzlw96mFgvmWZ-qz35EPObyv8hKLTuyxbv3