標籤:
本人之前以前撰文描寫敘述Appium和UIAutomator架構是怎樣定位Android介面上的控制項的。
- UIAutomator定位Android控制項的方法實踐和建議
- Appium基於安卓的各種FindElement的控制項定位方法實踐和建議
今天我們換一個淵源更留長,當今更盛行的架構Robotium,實踐下看它又是怎樣對控制項進行定位的。
1. 背景為保持這個系列的一致性,我們繼續用SDK內建的NotePad執行個體應用作為我們的實驗目標應用,可是這次不不過像曾經一樣主要環繞Menu Option裡面的那個"Add note”控制項進行定位,而是會設計到NotePad上的多個不同的控制項定位。但主要環繞的還是Notepad的NotesList這個Launchable activity了,以下先看下UIAutomatorViewer以下捕獲的我們會涉及到的不同介面吧。
- NotesList Activity的第一個頁面列表中會包括note3到note9的筆記
- NoteList Activity往下拉後還會看到有note1到note2以及兩個反覆的名稱為note的筆記
- 點擊系統的menu後會出現“Add note”這個menu entry供我們測實驗證用
2. 通過控制項的文本資訊text進行定位Robotium裡面的非常多方法都支援直接輸入text作為參數進行操作,比方clickOnText,clickLongOnText等,通過text來尋找控制項是最快捷顯而易見的。下面我們用clickOnText以及其重載方法進行說明,其它的以text方式尋找的方法類似(我們當然也能夠直接調用Solo.clickOnButton(String text)來限制僅僅通過text方法來尋找button控制項了)。2.1Solo.clickOnText(String text)2.1.1 示範範例
solo.clickOnText("^note$");assertTrue(solo.searchText("^note$"));
找到第一個text絕對等於note的控制項並進行點擊。2.1.2 分析和建議以上示範範例有兩點須要指出來引起注意的:
- Robotium會自己主動往下滾動直到定位到目標控制項為止:這就是為什麼以上示範範例不用先進行scrolldown動作就能夠直接尋找到在第二個頁面的“note”的原因
- Robotium假設尋找到的滿足條件的控制項多於一個的話,預設會返回第一個
- Robotium依據text進行控制項定位的時候預設就是支援用正則表達式的
比方把以上範例改成以下就會宣告失敗:
solo.clickOnText("note");assertTrue(solo.searchText("^note$"));在這裡點擊的將會列表最上面的日記,在我們的範例中就是“note9”。為什麼呢?由於note1到note9以及note都包括了“note”這個text,而以上代碼中的參數在正則表達式中的意思是“
尋找文本中包括note字串的控制項進行點擊”。所以我們必須把它改成"^note$"以精確尋找text絕對等於note的控制項。那麼假設這樣子還是有反覆的控制項怎麼辦呢?請往下看。2.2 Solo.clickOnText(String text, int match)2.2.1 示範範例
solo.clickOnText("^note$", 2);assertTrue(solo.searchText("^note$"));2.2.2 解析假設通過text尋找回來的控制項有超過一個,那麼我們能夠在基於
1的基礎上從左至右自上往下的順序指定須要的是第幾個控制項。
2.3 Solo.clickOnText(String text, int match, boolean scroll)2.3.1 示範範例
solo.clickOnText("^note2$", 1, false);assertTrue(solo.searchText("^note2$"));2.3.2 解析最後一個參數是指定是否自己主動scrolldown去尋找控制項。
3. ListView子控制項定位假設要定位的控制項是在一個ListView裡面的,那麼除了能夠使用以上的text方式進行定位之外,我們還能夠通過指定控制項在該ListView的地幾行進行定位。3.1Solo.clickInList(int line):指定行數進行定位3.1.1 示範範例
solo.clickInList(2);assertTrue(solo.searchText("^note8$"));3.1.2 解析點擊第一個ListView的第2行。那麼假設介面有多於一個ListView怎麼辦呢?那麼就要看以下這種方法了。
3.2 Solo.clickInList(int line, int index):同一時候指定第幾個ListView的第幾行進行定位3.2.1 示範範例
solo.clickInList(2, 0);assertTrue(solo.searchText("^note8$"));3.2.2 解析當中第一個參數是行數,第二個參數指的是第幾個ListView,依照我的經驗,就是基於1,介面從左至右從上到下的順序這個ListView所處的位置。
4. ActionBar控制項定位Android 3.0之後引入的新的對象,ActionBar能夠說是一個方便快捷的導航神器。它能夠作為活動的標題,突出活動的一些關鍵操作(如“搜尋”、“建立”、“共用”等)、作為菜單的靈活使用,還能夠實作類別似TabWidget的標籤功能以及下拉導航的功能,系統能夠非常好依據不同的螢幕配置來適應ActionBar的外觀。由於在NotePad中沒有實現ActionBar功能,所以我們這章節使用的是小米內建的便簽進行描寫敘述說明。
4.1 Solo.clickOnActionBarHomeButton()該方法的目的就是點擊ActionBar左上方的Home或者Up的icon導航到上一頁
4.2 Solo.clickOnActionBarItem(int id)參數整型id指的是R.id,也就是說項目project中的R.java裡面的id。
5. 通過控制項的排列順序來定位在上面的3.2.2章節我們已經體驗過怎樣通過指定第幾個ListView來定位控制項了。其實非常多控制項都能夠通過指定控制項在介面上的排列順序來定位,就以click相關的方法為範例,我們就能夠找出下面這些針對不同控制項的排列順序來定位的方法
- Solo.clickOnButton(int index)
- Solo.clickOnCheckBox(int index);
- Solo.clickOnEditText(int index)
- Solo.clickOnImage(int index)
- Solo.clickOnImageButton(int index)
- Solo.clickOnRadioButton(int index)
這樣的定位方式如同MonkeyRunner通過座標點進行定位的方式一樣存在局限性,非常大一個就是當介面控制項順序有調整的時候就要立馬進行測試代碼的維護更新。5.1 示範範例
solo.clickLongOnTextAndPress("note9", 2);solo.clickOnButton(0);5.2 分析以上代碼所做的事情就是
- 在彈出menu中選擇由0數起的第2個menu entry,也就是“Edit Title”
- 點擊介面從左至右由上往下由0數起的第0個Button,也就是“ok“這個Button
6. 通過控制項的內部屬性來定位以上擷取控制項的方式和操作該控制項都是在一個方法中就實現了的,事實上Robotium也支援先獲得控制項,然後再針對控制項慢慢進行操作了。Robotium的Solo類中有一些列getView的重載方法就是專門做這個事情的。可是不像UIAutoamtor和Appium支援用眾多的控制項內部屬性推斷是否是目標控制項,Robotium僅僅支援通過兩種控制項內部屬性來定位控制項:
- ResrouceId:能夠是字串類型(通過UIAutomatorViewer獲得)也能夠是整型(通過R.java檔案獲得)
- ClassName:控制項的Class(能夠通過UIAutomatorViewer獲得),只是注意不是字串,而是真實的class
這裡我們用getView來作為一個範例來說明怎樣通過控制項內部屬性獲得控制項,以起到一個拋磚引玉的左右。當然除了getView,Robotium還支援其它的入getViews,getCurrentViews等方法,但原理一致,就不累述了。
6.1 Solo.getView(String/int id,[int index])6.1.1 示範範例
View view = null;view = solo.getView("android:id/text1",1);solo.clickOnView(view);6.1.2 分析這段代碼所做的事情就是去獲得從0數起的第1個ResourceId為”android:id/text1"的控制項。
這裡為什麼須要填寫index呢?事實上我們要注意Android的Activity以下的控制項的ResourceId是同意反覆的,比方NotePad上面的ListView裡面的每個Note的ResourceId事實上都是"android:id/text1".所以這樣的情況下我們必須要加上index來區分開我們須要的是第幾個note。比方下面代碼得到的將是ListView裡面的第一個Note
View view = null;view = solo.getView("android:id/text1");solo.clickOnView(view);6.2 Solo.getView(Class<T> viewClass, int index)6.2.1 示範範例
View view = null;view = solo.getView(TextView.class,1);solo.clickOnView(view);
點擊從0開始的第1個TextView類型的控制項,也就是中的note4。依照從左至右自上往下的順序,<span style="font-family: Arial, Helvetica, sans-serif;">這裡的第0個是ListView的Title名稱為Notes的 那個TextView:</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><img src="http://img.blog.csdn.net/20141004182018767?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1YmFpdGlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></span>
6.2.2 解析注意這裡的類名viewClass和UIAutomator(
New UiSelector().className(String className))以及Appium(
AppiumDriver.findElementByClassName(String className))的通過className尋找時填寫的類的格式和類型是不一樣的,就以TextView為例:
- Robotium :Class類型 || 不須要FQCN(也就是不須要寫成andoid.widget.Textview,這在UIAutomator和Appium中是必須的)
- UIAutomator: String類型 || FQCN
- Appium :String類型 || FQCN
7 無需定位的控制項我們經常使用到的兩個系統控制項是不須要定位的,一個是系統的Menu鍵,一個是系統的goBack。可是注意Menu以下的Menu Entry還是須要定位的,比方我們範例中的”Add note“這個Menu Entry。
8 還有嗎?以上列出了Robotium中對本人當前最重要的擷取控制項的方法,當然Solo裡面另一些其它的方法,但不是easy理解就是如今用不上,所以就不一一陳述了
- 通過座標點操作控制項 :easy理解,就是獲得座標點然後點擊螢幕座標。
- 擷取和操作WebView控制項 :如今用不上,到時實用到了再去深究
- 還有其它嗎?
Item |
Description |
Warning |
Author |
天地會珠海分舵 |
轉載請註明出處! 很多其它精彩文章請查看本人部落格! |
Blog Address |
http://blog.csdn.net/zhubaitian
|
Robotium之Android控制項定位實踐和建議(Appium/UIAutomator姊妹篇)