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。開始進入正題....(如有不當之處還望指出批評)

一、UiObject

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

先從藍色字體來看,自動化測試腳本在測試設備上實現控件點擊操作可以分為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彈框,對話框...)

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

二、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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM