App控件定位:Android 控件介紹及元素定位方法


本文將分享Android相關基礎知識和Android APP控件定位工具的使用方法。

Android基礎知識

Android布局

Android是通過容器的布局屬性來管理子控件的位置關系(iOS去掉了布局的概念,直接用變量之間的相對關系完成位置的計算),把界面上所有的控件根據他們的間距的大小,擺放在正確的位置。布局是一種可用於放置很多控件的容器,通過多層布局嵌套完成一些比較復雜的界面。

Android布局有LinearLayout(線性布局)、RelativeLayout(相對布局)、FrameLayout(幀布局)、AbsoluteLayout(絕對布局)、TableLayout(表格布局)、Grid layout(網格布局)、ConstraintLayout(約束布局)等。布局的內部除了放置控件外,也可以放置布局,通過多層布局的嵌套,我們就能夠完成一些比較復雜的界面。

Android四大組件

Android四大基本組件分別是Activity,Service服務,Content Provider內容提供者,Broadcast Receiver廣播接收器。

1、activity

  • 與用戶交互的可視化界面
  • 一個Activity通常就是一個單獨的屏幕(窗口)
  • Activity之間通過Intent進行通信

2、Service

  • service 實現后台運行程序,在后台完成用戶指定的操作
  • 通常用於為其他組件提供后台服務或監控其他組件的運行狀態。

3、Content Provider

  • content provider 內容提供者,提供程序所需要的數據
  • 只有需要在多個應用程序間共享數據才需要內容提供者,是不同應用程序間共享數據的唯一方式。

4、Broadcast Receiver

  • 監聽外部事件的到來(比如來電)

Android控件

常用的控件:

  • TextView(文本控件),EditText(可編輯文本控件)

  • Button(按鈕),imageButton(圖片按鈕),ToggIeButton(開關按鈕)

  • Image View(圖片控件)

  • CheckBox(復選框控件), RadioButton(單選框控件)

元素定位實際上就是定位控件,Android應用的層級結構使用xml編寫,xml全名叫可擴展標記語言,類似於HTML,可以看作一個微型的數據庫。android系統里安裝的每一個app,其信息都被存到一個xml里。

xml定義了節點和屬性,每個控件都有它的屬性(resourceid, xpath, aid),沒有css屬性(樣式文件和布局xml文件是分開的)。

Android中提供了三種解析XML的方式:DOM(Document Object Model)、SAX(Simple API XML)以及Pull解析方式。DOM解析器在解析XML文檔時,會把文檔中的所有元素按照其出現的層次關系,解析成一個個Node對象(節點),形成Dom樹。DOM允許用戶遍歷文檔樹,訪問父節點、子節點或者兄弟節點。每個節點具有特定的屬性:

  • clickable
  • content-desc
  • resource-id
  • text
  • bounds
  • ...

App控件定位

對App控件的定位其實就是節點和屬性的定位,下面介紹三種UI元素定位工具:

  • Android App可以使用uiautomatorviewer工具進行定位,它是 sdk路徑下的一個工具。
  • 基於瀏覽器技術的weditor 工具
  • Appium inspector工具

uiautomatorviewer定位

電腦通過無線或者USB連接到手機設備后(或者連接到模擬機),雙擊uiautomatorviewer.bat打開uiautomatorviewer工具。

點擊左上角第二個或者第三個圖標獲取當前手機APP頁面,在右邊可以看到app的xml結構樹,可以獲取到每個節點的詳細屬性。

weditor

weditor是基於瀏覽器技術的UI查看器,直接在瀏覽器打開。

項目地址:https://github.com/alibaba/web-editor

環境要求Python3.6+,通過pip安裝:

pip3 install -U weditor # 會安裝uiautomator2和facebook-wda兩個庫,分別支持android和iOS APP。

在命令窗口輸入如下命令運行:

$ weditor # 啟動server並打開瀏覽器

啟動后會在瀏覽器自動訪問 http://localhost:17310

Appium inspector工具

打開appium,點擊【啟動服務器】

點擊右上角搜索標志圖標【Start Inspector Session】

編輯Desired Capabilities

Capability設置:https://appium.io/docs/en/writing-running-appium/caps/

  • platformName:Android或者iOS
  • deviceName:設備名,127.0.0.1:7555是網易mumu模擬器,開啟后需要使用adb命令adb connect 127.0.0.1:7555連接。
  • appPackage:包名
  • appActivity:Activity名字
  • platformVersion:系統版本
  • automationName:默認使用 uiautomator2(andorid默認使用 uiautomator2,ios默認使用 XCUITest)
  • noReset:是否在測試前后重置相關環境(例如首次打開彈框,或者是登錄信息)
  • fullReset:執行完全復位:關閉APP,清除APP數據,卸載apk。
  • unicodeKeyBoard:是否需要輸入非英文之外的語言並在測試完成后重置輸入法
  • dontStopAppOnReset:首次啟動的時候,不停止app(可以調試或者運行的時候提升運行速度)
  • skipDeviceInitialization:跳過安裝,權限設置等操作(可以調試或者運行的時候提升運行速度)
  • newCommandTimeout:兩條命令的最大間隔時間,默認60s
  • udid:連接設備的唯一標識
  • autoGrantPermissions:自動允許/拒絕彈框信息,默認為false,如果noReset為true時,這個參數不生效

其他更多參數參考官方文檔:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md

主要設置好上面介紹的前面6個參數后,點擊右下角【Start Session】,可以獲取到每個節點的詳細屬性。

用例錄制

appium desktop可以錄制用例,並生成測試代碼

點擊上方眼睛圖標,開始錄制,手動點擊左邊app元素,右邊顯示了三種元素操作方法:Tap、Send Keys、Clear,選擇對應的操作

完成后測試步驟后,點擊停止錄制,右上角可以看到生成的自動化代碼,可以選擇Java,Python等語言。

獲取到app頁面元素屬性值后就可以使用appium來進行定位,實現對app的操作。下一篇文章將介紹appium元素定位方法。

Python + Appium啟動APP

APP自動化測試關鍵步驟包括:

  • 導入依賴:
    from appium import webdriver
  • capabilities設置
  • 初始化 driver
    webdriver.remote('http://127.0.0.1:4723/wd/hub', desired_caps)
  • 元素定位與操作
  • 斷言 assert

下面代碼實現打開雪球APP,點擊輸入框,輸入”京東“,然后退出。

#!/usr/bin/python3
# -*-coding:utf-8-*-
from appium import webdriver
desired_caps = {}
# desired_caps['recreateChromeDriverSessions'] = True
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1.1'
desired_caps['deviceName'] = '127.0.0.1:7555'
desired_caps['appPackage'] = 'com.xueqiu.android'
desired_caps['automationName'] = 'Uiautomator2'
desired_caps['appActivity'] = '.common.MainActivity'
desired_caps['newCommandTimeout'] = 3000
desired_caps['unicodeKeyboard'] = True
desired_caps['noReset'] = 'true'
desired_caps['dontStopAppOnReset'] = 'true'
desired_caps['skipDeviceInitialization'] = 'true'
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
driver.implicitly_wait(15)
driver.find_element_by_id("com.xueqiu.android:id/tv_search").click()
driver.find_element_by_id("com.xueqiu.android:id/search_input_text").send_keys("京東")
driver.quit()
--THE END--

歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!


免責聲明!

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



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