1. 程式人生 > >App控制元件定位

App控制元件定位

本文將分享Android相關基礎知識和Android APP控制元件定位工具的使用方法。 # Android基礎知識 ## Android佈局 Android是通過容器的**佈局屬性**來管理子控制元件的位置關係(iOS去掉了佈局的概念,直接用變數之間的相對關係完成位置的計算),把介面上所有的控制元件根據他們的間距的大小,擺放在正確的位置。佈局是一種可用於放置很多**控制元件**的容器,通過多層[佈局](https://developer.android.com/guide/topics/ui/declaring-layout?hl=zh-cn)巢狀完成一些比較複雜的介面。 Android佈局有LinearLayout(線性佈局)、RelativeLayout(相對佈局)、FrameLayout(幀佈局)、AbsoluteLayout(絕對佈局)、TableLayout(表格佈局)、Grid layout(網格佈局)、ConstraintLayout(約束佈局)等。佈局的內部除了放置控制元件外,也可以放置佈局,通過多層佈局的巢狀,我們就能夠完成一些比較複雜的介面。 ![](https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151750107-489322590.png) ## 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控制元件的定位其實就是節點和屬性的定位,Android App推薦使用uiautomatorviewer工具進行定位,它是 sdk路徑下的一個工具。也可以用Appium inspector工具來定位。 ## uiautomatorviewer定位 電腦通過無線或者USB連線到手機裝置後(或者連線到模擬機),雙擊uiautomatorviewer.bat開啟uiautomatorviewer工具。 ![](https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151836487-218908966.png) 點選左上角第二個或者第三個圖示獲取當前手機APP頁面,在右邊可以看到app的xml結構樹,可以獲取到每個節點的詳細屬性。 ![](https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151844335-44299238.png) ## Appium inspector工具 開啟appium,點選【啟動伺服器】 ![](https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151852660-1654085531.png) 點選右上角搜尋標誌圖示【Start Inspector Session】 ![](https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151904505-503349745.png) 編輯Desired Capabilities ![](https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151912435-1351266733.png) Capability設定: * 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:是否在測試前後重置相關環境(例如首次開啟彈框,或者是登入資訊) * unicodeKeyBoard:是否需要輸入非英文之外的語言並在測試完成後重置輸入法 * dontStopAppOnReset:首次啟動的時候,不停止app(可以除錯或者執行的時候提升執行速度) * skipDeviceInitialization:跳過安裝,許可權設定等操作(可以除錯或者執行的時候提升執行速度) 其他更多引數參考官方文件:[https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md](https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md) 主要設定好前面6個引數後,點選右下角【Start Session】,可以獲取到每個節點的詳細屬性。 ![](https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151927447-1835576217.png) # 用例錄製 appium desktop可以錄製用例,並生成測試程式碼 點選上方眼睛圖示,開始錄製,手動點選左邊app元素,右邊顯示了三種元素操作方法:Tap、Send Keys、Clear,選擇對應的操作 ![](https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151937272-701853145.png) 完成後測試步驟後,點選停止錄製,右上角可以看到生成的自動化程式碼,可以選擇Java,Python等語言。 ![](https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151943847-675433325.png) 獲取到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,點選輸入框,輸入”京東“,然後退出。 ```python #!/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--
> 文章標題:App控制元件定位 > 本文作者:hiyo > 本文連結:[https://www.cnblogs.com/hiyong/p/14163653.html](https://www.cnblogs.com/hiyong/p/14163653.html) > 歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!