UiAutomator2.0 - 控件實現點擊操做過程

穿梭各大技術博客網站,天天都能看到一些的新的技術。忽然感受UiAutomator 2.0相對於如今來講已是個好久遠的東西了ε=(´ο`*)))。寫仍是不寫?這是個問題(仍是總結總結吧)。先說明一下這裏的2.0指的是Android測試支持庫的uiautomator-v18:2.1.2.jar(位置:sdk-tools-windows\extras\android\m2repository\com\android\support\test),並不是sdk-tools-windows\platforms\android-'xx'路徑下的 uiautomator.jar。開始進入正題....(若有不當之處還望指出批評)android

1、UiObject

在2.0中保留了uiautomator.jar中的UiObject,可是將其查找方式 new Object() 更改成 findObject() .其餘可見《UiAutomator1.0 與 UiAutomator2.0》。接下來先上圖來看看UiObject 控件點擊操做的實現過程。(爲方便只畫了一張圖,圖畫的不是很好,可能還有些問題(/ω\)。歡迎指正批評 )
windows

先從藍色字體來看,自動化測試腳本在測試設備上實現控件點擊操做能夠分爲3步:首先要對設備控件操做就得得到一個UiDevice對象; 其次在該設備上獲取要操做的UiObject對象; 最後對該設備的控件進行操做(如:點擊,滑動,拖拽等)數組

  1. UiDevice:[綠色部分]
    從圖中就能夠知道是經過Instrumentation得到 UiDevice的實例對象,而至於具體Instrumentation的獲取,可自行搜索"Instrumentation原理"。
  2. UiObject : [淺黃色部分]
    要獲得一個UiObject對象,首先得構造一個控件選擇器對象,而選擇器的標準則是依據該控件的具體屬性。
        當建立一個UiObject引用對象且有一個選擇器標準時,此時分兩步:一是將其屬性及屬性值存儲在稀疏數組中;二是結合UiDevice#findObject方法構造UiObject對象。也就是說這時的 UiObject 並無直接綁定到視圖做爲引用對象。
  3. clickAndWaitForNewWindow/click :[紅色部分]
    控件點擊操做有兩種:點擊等待新窗口/點擊。當控件調用點擊等待新窗口方法,纔開始在設備上對控件進行查找匹配-點擊-等待窗口事件.
        經過QueryController#findAccessibilityNodeInfo方法:首先等待設備空閒,獲取當前窗口可訪問性節點信息。以此時點擊操做的選擇器標準做爲匹配條件,遍歷稀疏數組中的屬性與可訪問性節點信息相關屬性是否匹配。若匹配,則返回該選擇器對應的AccessibilityNodeInfo對象;不然拋出UiObjectNotFoundException。而後經過該節點信息獲得控件中心座標點。
        經過InteractionController#runAndWaitForEvents方法:首先啓動線程執行點擊操做---本質是將MotionEvent.ACTION_DOWN以及中心座標點做爲運行事件進行注入,等待100ms,再將MotionEvent.ACTION_UP進行注入。而後在指定(5500ms)的等待時間內監聽事件AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED |AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED
        最後看到設備點擊操做後,等待窗口內容或狀態更新(如:啓動新的Activity,Pop-up彈框,對話框...)

注:若點擊操做後未出現監聽到窗口內容或狀態事件則等待最大時長。點擊操做和點擊等待新窗口的區別在於: 等待事件不同、等待時間不同測試

2、UiObject2

UiObject2是 2.0中新增的類,功能與UiObject大致一致。區別在於其選擇器、控件的查找方式、控件對象的生命週期。也上張圖來看看吧!
字體

先從藍色字體來看,UiObject與 UiObject2的區別在於 第二步和第三步。UiObject2中的使用的新的 選擇器 By 和 點擊方法 clickAndWait()網站

  1. UiDevice:[綠色部分]
    與UiObject 是一致的狀況。
  2. UiObject2 : [紅色->粉紅部分]
    經過By 靜態工廠構造選擇器對象。圖中能夠看出此時直接與AccessibilityNodeInfo進行匹配(也就是與當前窗口),存在控件則進入下一步,最多等待10s,判斷當前窗口是否刷新,刷新則拋出控件過期異常。因此能夠看出使用UiObject2的方式時 控件與視圖是處於綁定的狀態。
  3. clickAndWait/click :[紅色部分]
    與Object的點擊方式不一樣:點擊等待指定事件條件,且將x,y構形成Point對象,而後再包裝成指針手勢(點擊,長按,滑動等)。其他操做相似,執行手勢線程使用手勢控制器將點擊操做進行注入,與此同時監聽當前指定事件。最後設備進行相應的操做。

注:Until 只提供了2個事件條件:Until.newWindow() 和 Until.scrollFinished(Direction direction)ui

相關文章
相關標籤/搜索