1. 程式人生 > 實用技巧 >app自動化測試之appium元素定位常用方法

app自動化測試之appium元素定位常用方法

對於Android而言,查詢appUI介面元素屬性的工具有三種:appium desktop,uiautomatorviewer.bat,weditor。之前已經介紹過了weditor的使用,這裡我將通過使用uiautomatorview工具檢視元素的屬性值,來介紹Android app元素定位的八種方式。

一,使用uiautomatorview對app頁面截圖,檢視元素屬性

  • 連線Android手機
  • 在Android SDK的目錄裡的tools資料夾中找到uiautomatorviewer.bat檔案,雙擊啟動,會出現如下頁面:(未安裝Android SDK的請參考Android SDK 安裝與配置

建議建立uiautomatorviewer.bat的快捷方式到桌面,下次使用時就不需要進入到android-sdk/tools裡開啟。

  • 如下圖,1所示位置從左至右依次為:Open(開啟之前儲存的佈局),Device Screenshot(獲取詳細布局),Device Screenshot -compressed(獲取簡單佈局),Save(儲存當前頁面的佈局);2所示位置展示app當前頁面的UI樹;3所示位置展示當前app頁面被選擇元素的屬性值。

  • 確認手機連線後,點選頁面的Device Screenshot(獲取詳細布局)按鈕,獲取app當前頁面的截圖。此時工具頁面可能會報錯,請參考以下方法解決:

    1,手機系統為Android 8.0以上版本請參考Android8.0以上版本使用uiautomatorviewer定位報錯解決方法,替換SDK中相應的檔案。
    2,參考教程替換SDK中相應的檔案後,仍然報錯。請確認appium是否關閉,appium開啟的狀態下,uiautomatorviewer會與之衝突。

  • 檢視app當前頁面的元素及對應的元素屬性值。
    以今日頭條app為例,Node Detail裡展示的便是【釋出】按鈕的各種屬性值,後續在自動化程式碼中,我們就可以通過查詢元素對應的屬性來定位該元素並做相關操作。

二,appium移動端自動化常用的元素定位方法

appium繼承了selenium框架中webdriver提供的元素定位方法,接下介紹幾種常用的方法。

  • find_element_by_id()
    如果某個元素的resource-id對應的值在app當前頁面是唯一,那麼就可以優先通過id定位該元素。以上圖中點選【釋出】按鈕為例,寫法如下
driver.find_element_by_id("com.ss.android.article.news:id/cde").click()

  • find_element_by_class_name()
    元素的class屬性值唯一,可以通過class name定位。如下圖中所指的元素,其class屬性值在當前頁面唯一
find_element_by_class_name("android.widget.HorizontalScrollView")
  • find_element_by_xpath()
    如果不是原生app,這大概是元素定位過程中用的最多的方法,使用比較靈活。
    1,如果當前頁面某元素的text屬性值唯一,就可以使用text文字構造xpath,如【釋出】按鈕
# "//*[@text='釋出']"該字串表示:當前頁面下所有元素裡面text='釋出'的元素
drvier.find_element_by_xpath("//*[@text='釋出']").click()

2,class唯一的話可以使用find_element_by_class_name()定位,但大部分情況向class都不是唯一的,此時可以用class與其他屬性結合構成xpath,如:

# class與text
driver.find_element_by_xpath("//android.widget.TextView[@text='訊息通知']").click()
# class、text、resource-id結合,注意text與id之間使用and
driver.find_element_by_xpath("//android.widget.TextView[@text='訊息通知' and @resource-id='com.ss.android.article.news:id/c_3']").click()

3,通過父元素定位子元素
在實際專案中,我們可能通過UI的層級結果進行定位。如下圖,我們要定位【收藏】按鈕,除了使用2方外,還可以它的上一級元素定位。

# 父元素下面有4個class相同的子元素,子元素後面不加索引,則預設定位的是第一個子元素
driver.find_element_by_xpath("//androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout")


子元素有多個,通過class的索引定位

# 後面的2表示索引,注意uiautomatorviewer裡顯示的是從0開始的,而xpath裡面是從1開始
driver.find_element_by_xpath("//androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout[2]")

4,通過元素子元素定位父元素
即通過下一級元素定位上一級元素。

# 後面的/..表示當前級的上一級,此處即整個下載管理按鈕區域
driver.find_element_by_xpath("//android.widget.TextView[@text='下載管理']/..")

同樣定位元素的上一級的上一級(孫子定位爺爺),如下

driver.find_element_by_xpath("//android.widget.TextView[@text='下載管理']/../..")

5,定位兄弟元素
通過同級元素定位,下面以定位【下載管理】上的圖示為例

# 兄->父->兄
driver.find_element_by_xpath("//android.widget.TextView[@text='下載管理']/../android.widget.ImageView")

三,總結。

  • 具體使用什麼樣的方式定位,與app開發框架有關,一般使用id與xpath使用的比較多。需要注意的是,能使用的id定位元素的話就不要使用xpath定位,因為id定位元素方便維護的同時,效率也相對xpath更高。
  • xpath語法的基礎知識需要有所瞭解,這樣有助於能更好的理解元素定位。
  • 當然appium還有其他的定位元素方法,這裡不做過多的介紹,有興趣的話可以去百度其他方法。實際使用過程中,常用的就是以上幾種方法。