簡介
在前邊的第二十二篇文章里,已經(jīng)分享了通過獲取控件的坐標(biāo)點(diǎn)來獲取點(diǎn)擊事件的所需要的點(diǎn)擊位置,那么還有沒有其他方法來獲取控件點(diǎn)擊事件所需要的點(diǎn)擊位置呢?答案是:Yes!因?yàn)樵诓煌拇笮∑聊坏氖謾C(jī)上獲取控件的坐標(biāo)點(diǎn),不是一樣的,而是有變化的,因此在不同的手機(jī)機(jī)型上,我們可能都需要重新獲取坐標(biāo)點(diǎn),這么操作起來,如果操作控件特別的多,那么獲取控件的坐標(biāo)點(diǎn)就會顯得特別的繁瑣。因此我們可以通過獲取控件的ID來避免獲取控件坐標(biāo)點(diǎn)的這種弊端。
通過控件ID實(shí)現(xiàn)自動(dòng)化腳本的運(yùn)行,就性能而言,會比控件坐標(biāo)的實(shí)現(xiàn)差一些;但是對于不同分辨率的設(shè)備都通用,不需要?jiǎng)討B(tài)變換坐標(biāo)??丶蘒D的獲取主要是通過HierarchyViewer。下面就HierarchyViewer從打開方式和使用兩方面進(jìn)行講解。
HierarchyViewer的打開方式
HierarchyViewer的打開方式有兩種:一種是eclipse中打開HierarchyView視圖,另外一種是命令行中執(zhí)行sdk/tools/hierarchyviewer.bat。
HierarchyViewer默認(rèn)只能在非加密設(shè)備使用,例如工程機(jī),工程平板或者模擬器。如果要在手機(jī)上使用HierarchyViewer,你需要在你的應(yīng)用中添加一個(gè)開源庫View Server。鏈接地址:https://github.com/romainguy/ViewServer。該篇文章中有講解如何啟動(dòng)真機(jī)View Server,大家如果有興趣,可參考:https://dup2.org/node/1538。
方式一:
連接您的真機(jī)設(shè)備,或打開模擬器,在eclipse中, 依次選擇Window-Open Perspective-Other,在Other中,選擇HierarchyView視圖,即可打開。
方式二:
連接您的真機(jī)設(shè)備或打開模擬器,運(yùn)行cmd窗口,進(jìn)入到sdk/tools目錄下,輸入命令hierarchyviewer.bat,運(yùn)行hierarchyviewer。
或者直接在sdk/tools目錄下,找到hierarchyviewer.bat,雙擊運(yùn)行。
未開啟夜神模擬器的HierarchyViewer,如下圖:
開啟夜神模擬器后的HierarchyViewer,如下圖:
那么接下來看一下今天的重頭戲:講解利用HierarchyViewer獲取控件ID的方法。
HierarchyViewer獲取控件ID
HierarchyViewer啟動(dòng)后,首先會看到的第一個(gè)窗口顯示了設(shè)備和模擬器的列表。點(diǎn)擊左邊的箭頭,就會展開當(dāng)前設(shè)備或模擬器的Activity對象列表。列表中顯示了設(shè)備或模擬器上,UI當(dāng)前可視的所有Activity對象。這些對象按照它們的Android組件名稱列出來。列表中的內(nèi)容包含應(yīng)用的Activity對象和系統(tǒng)的Activity對象。
當(dāng)模擬器activity畫面變更后,點(diǎn)擊refresh可以加載新的頁面布局信息。
從列表中選擇你的activity名稱,雙擊,或點(diǎn)擊菜單欄的Load View Hierarchy按鈕,進(jìn)入View Hierarchy窗口,查看它的view層次結(jié)構(gòu);或者點(diǎn)擊Inspect Screenshot按鈕,進(jìn)入Pixel Perfect窗口,從而查看UI的一個(gè)放大圖像。我們這里點(diǎn)擊進(jìn)入View Hierarchy窗口。
可以從下圖中看到模擬器此activity的畫面布局信息,左邊部分是hierarchy通過樹形結(jié)構(gòu)展示的布局形式,右下角是模擬器上當(dāng)前頁面的UI布局信息。
通過滾動(dòng)鼠標(biāo),可以放大每個(gè)樹節(jié)點(diǎn);拖拽鼠標(biāo),移動(dòng)樹形結(jié)構(gòu)布局。雙擊樹節(jié)點(diǎn)可以展示單獨(dú)的UI部分。從下圖中,可以看到,id/btn_login即為登錄按鈕的ID。依次類推,可以查看其它控件ID。
注:對于列表、或者彈出框則無法直接通過點(diǎn)擊ID操作成功,需要計(jì)算ID的坐標(biāo)。
控件ID之Monkeyrunner腳本演示
? ? 同樣的,我們將下面一段Monkeyrunner腳本寫到一個(gè)test.py文件中,然后運(yùn)行test.py文件,查看模擬器上是不是做相應(yīng)的操作。
1 # coding=utf-8
2 # 1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行
3
4 # 2.注釋:包括記錄創(chuàng)建時(shí)間,創(chuàng)建人,項(xiàng)目名稱。
5 '''
6 Created on 2019-7-30
7 @author: 瀟瀟說測試
8 Project:學(xué)習(xí)和使用appium自動(dòng)化測試-獲取控件的ID
9 '''
10 # 3.導(dǎo)入模塊
11
12 from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
13
14 from com.android.monkeyrunner.easy import EasyMonkeyDevice #提供了根據(jù)ID進(jìn)行訪問
15
16 from com.android.monkeyrunner.easy import By #根據(jù)ID返回PyObject的方法
17
18 device=MonkeyRunner.waitForConnection()
19
20 #啟動(dòng)activity(這里啟動(dòng)qq)
21
22 device.startActivity(component="com.tencent.mobileqq/.activity.SplashActivity")
23
24 easy_device=EasyMonkeyDevice(device) #必須在activity啟動(dòng)之后
25
26 #登錄界面,點(diǎn)擊賬號輸入框
27
28 easy_device.touch(By.id('id/0x20e'),MonkeyDevice.DOWN_AND_UP)
29
30 device.type('1918991791') #輸入qq賬號
至此,獲取控件ID的方式已經(jīng)介紹完,由于沒有深入研究,肯定有不少功能點(diǎn)沒有介紹到,有時(shí)間的話再做完善。
控件ID不存在或重復(fù)
我們在用monkeyrunner進(jìn)行Android自動(dòng)化時(shí),通過獲取坐標(biāo)點(diǎn)或控件ID進(jìn)行一系列操作。由于使用坐標(biāo)點(diǎn)時(shí),屏幕分辨率一旦更改,則代碼中用到坐標(biāo)的地方都要修改,這樣導(dǎo)致代碼的復(fù)用率較低。因此,我們多采用控件ID操作(注:控件ID需要在模擬器中使用,對于絕大多數(shù)真機(jī)不適用)。但是,某些控件的ID是不存在的或重復(fù)存在,那么,遇到這種情況,我們怎樣繼續(xù)使用控件ID進(jìn)行自動(dòng)化測呢?
例如,下圖中,我想要獲取最右側(cè)紅框中的id/tv,但是,大家會發(fā)現(xiàn),和它并列的也有重復(fù)的控件id值。現(xiàn)在我們就講述一下這種情況(控件ID不存在同樣處理)。
我們從這個(gè)控件樹的節(jié)點(diǎn)角度來思考如何獲得控件的引用。我們可以看到在上圖hierarchy viewer中的每個(gè)控件所對應(yīng)的框形中,右下角都有一個(gè)數(shù)字。其實(shí)這個(gè)數(shù)字就是該控件在同級兄弟節(jié)點(diǎn)中的索引值,我們知道這個(gè)索引值后,就可以根據(jù)parentView.children[index]屬性來獲取任意父節(jié)點(diǎn)所對應(yīng)的子節(jié)點(diǎn)的對象引用。其中的parentView可以是樹形圖中有效ID的任意父節(jié)點(diǎn)(父節(jié)點(diǎn)要保證唯一有效),然后利用python函數(shù)的可變參數(shù)列表特性來傳入所需控件的索引列表即可構(gòu)造出得到任意節(jié)點(diǎn)引用的字符串,從而得到其引用。
核心代碼如下,把如下代碼加入自己的python腳本中,直接調(diào)用該函數(shù)即可。
1 # coding=utf-8
2 # 1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行
3
4 # 2.注釋:包括記錄創(chuàng)建時(shí)間,創(chuàng)建人,項(xiàng)目名稱。
5 '''
6 Created on 2019-7-30
7 @author: 瀟瀟說測試
8 Project:學(xué)習(xí)和使用appium自動(dòng)化測試-獲取控件的ID
9 '''
10 # 3.導(dǎo)入模塊
11
12 from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
13
14 from com.android.monkeyrunner.easy import EasyMonkeyDevice #提供了根據(jù)ID進(jìn)行訪問
15
16 from com.android.monkeyrunner.easy import By #根據(jù)ID返回PyObject的方法
17
18 device=MonkeyRunner.waitForConnection()
19
20 #啟動(dòng)activity(這里啟動(dòng)qq)
21
22 device.startActivity(component="com.tencent.mobileqq/.activity.SplashActivity")
23
24 easy_device=EasyMonkeyDevice(device) #必須在activity啟動(dòng)之后
25
26 #登錄界面,點(diǎn)擊賬號輸入框
27
28 easy_device.touch(By.id('id/0x20e'),MonkeyDevice.DOWN_AND_UP)
29
30 device.type('1918991791') #輸入qq賬號
有了以上代碼之后,我們可以獲取上圖中的id/tv,方法如下:
1 getChildView('id/province_list',5,0,0)
其中結(jié)合上圖可知,getChildView的第一個(gè)參數(shù)即:有效且唯一的父節(jié)點(diǎn)
參數(shù)二、三依次為要獲取的控件ID的父節(jié)點(diǎn)的父節(jié)點(diǎn)
注:用到的父節(jié)點(diǎn)即圖中的id/province_list,有效且唯一的值。當(dāng)前的父節(jié)點(diǎn)右下角的角標(biāo),不需要在getChildView函數(shù)中顯示。
這樣,通過以上函數(shù),再結(jié)合Hierarchyviewer圖形,我們獲取到了重復(fù)的控件ID。
由于Hierarchyviewer看起來不是特別方便,這里再推薦一款和Hierarchyviewer類似功能的工具:uiautomatorviewer(存儲在sdk\tools中,雙擊打開即可)
由上圖中,uiautomatorviewer每個(gè)控件前面的數(shù)字即相當(dāng)于Hierarchyviewer的角標(biāo),我們同樣可以獲取到目標(biāo)ID的最終有效且唯一的父節(jié)點(diǎn),從而調(diào)用函數(shù)getChildView('id/province_list',5,0,0)
獲取到了不存在或重復(fù)的控件ID后,我們可以通過其坐標(biāo),進(jìn)行點(diǎn)擊操作。
首先,定義一個(gè)“獲取指定按鈕坐標(biāo)”的函數(shù)
1 def getBtnPoint(btn):
2 print btn
3 point = device.getHierarchyViewer().getAbsoluteCenterOfView(btn);
4 return point
然后我們可以通過坐標(biāo),實(shí)現(xiàn)點(diǎn)擊操作,例如:
1 askView = getChildView('id/tabs',1)
2 askPpoint = getBtnPoint(askView)
3 device.touch(askPpoint.x,askPpoint.y,'DOWN_AND_UP')
至此,我們介紹完了處理控件ID不存在或重復(fù)時(shí)的方法,有興趣的小伙伴或者童鞋們可以自己動(dòng)手實(shí)踐一把,就會更能體會Hierarchyviewer/uiautomatorviewer+getChildView()獲取不存在或重復(fù)控件ID的用法、樂趣及其奧秘。
小結(jié)
一、直接在sdk>tools
下面找到hierarchyviewer.bat
雙擊運(yùn)行,然后運(yùn)行成功了。
但是出現(xiàn)這個(gè)提示:
The standalone version of hieararchyviewer is deprecated.
Please use Android Device Monitor (tools/monitor.bat) instead.
大概意思是說,單獨(dú)版本的?hieararchyviewer?已經(jīng)被棄用了。請使用?Android Device Monitor來代替。Android Device Monitor在tools
目錄下面找到monitor.bat
即可。
為了緊跟時(shí)代潮流,就決定用Android Device Monitor啟動(dòng)即可。
具體操作啟動(dòng)步驟:
1、運(yùn)行命令monitor.bat,如下圖
2、運(yùn)行命令后出現(xiàn),如下圖的界面
3、點(diǎn)擊“Window->Open Perspective”。如圖
4、按第三步操作完以后,出現(xiàn)如下圖:
5、選擇“hieararchyviewer?”,點(diǎn)擊“OK”,即可,如下圖
?二、如何在真機(jī)上正常使用Hierarchy View
? ?Hierarchy Viewer如果不進(jìn)行“特殊”配置的話是無法連接真機(jī),會報(bào)以下錯(cuò)誤:
[hierarchyviewer]Unable?to?get?view?server?version?from?device?XXXXX
[hierarchyviewer]Unable?to?get?view?server?protocol?version?from?device?XXXXXX
[ViewServerDevice]Unable?to?debug?device:?XXXXX
[hierarchyviewer]Missing?forwarded?port?for?XXXXX
[hierarchyviewer]Unable?to?get?the?focused?window?from?device?XXXXX
無法連接真機(jī)的原因是:To preserve security, Hierarchy Viewer can only connect to devices running a developer version of the Android system.出于安全性考慮, Hierarchy Viewe 只能連接開發(fā)版手機(jī)或模擬器。
? ?Android源碼實(shí)現(xiàn)這一限制的地方在/frameworks/base/services/core/java/com/android/server/wm/WindowManageService.java:
檢驗(yàn)一臺手機(jī)/模擬器是否開啟了View Server的辦法是:
adb shell service call window 3
若返回值是:Result: Parcel(00000000 00000000 '........')" 說明View Server處于關(guān)閉狀態(tài)
若返回值是:Result: Parcel(00000000 00000001 '........')" 說明View Server處于開啟狀態(tài)
有時(shí)碰到模擬器或開發(fā)發(fā)版手機(jī), view Hierarchy 還是無法連接,可以先使用以上方法檢查一下View Server狀態(tài)。如果沒有開啟,則使用以下命令打開View Server:
adb shell service call window 1 i32 4939
也可以使用使用以下命令關(guān)閉View Server:
adb shell service call window 2 i32 4939
那么如何在真機(jī)能夠正常使用Hierarchy Viewer了?通過實(shí)踐目前總結(jié)了以下三種方法:
方法一。
1,配置設(shè)備,打開手機(jī)的開發(fā)者選項(xiàng)
如果你的手機(jī)是android 4。0 或者以下,請根據(jù)開源項(xiàng)目 View ?Server(https://github.com/romainguy/ViewServer) 進(jìn)行安裝和配置
如果你的手機(jī)是4.1或以上,則必須進(jìn)行以下環(huán)境變量配置:
1.點(diǎn)擊 計(jì)算機(jī)屬性-》高級系統(tǒng)設(shè)置-》環(huán)境變量
2.新建環(huán)境變量ANDROID_HVPROTO, 并設(shè)置其值為 ddm, 保存重啟
PS:該方法參考android 官方文檔《Device Setup for Hierachy Viewer》https://developer.android.com/studio/profile/hierarchy-viewer-setup.html
然而在本人親自試用真機(jī)(魅族MX4pro android 5.1 和 android 4.4的機(jī)頂盒)測試過程中,配置環(huán)境變量的方法似乎并沒有起到作用,還是連不上。
不過直接在調(diào)試app中集成View Server開源項(xiàng)目是沒有任何問題的。
方法二:
話說前面Hierarchy Viewer只能連接Android開發(fā)版手機(jī)或是模擬器,只有ro.secure==0 && ro.debuggable==1的Android系統(tǒng)(這一句是其他網(wǎng)友的文章看到的,沒有在android 官方查證到 )。ro.xxxx這種句式大家是不是覺得有點(diǎn)熟悉?不就是android系統(tǒng)的 /system/build.prop文件中的配置樣式么。推測如果將ro.secure==0 && ro.debuggable==1這個(gè)兩個(gè)配置添加進(jìn)來應(yīng)該能夠起作用吧,于是進(jìn)行以下嘗試:
1.先把手機(jī)root
2.在進(jìn)到在/system/build.prop 中添加ro.secure==0? 和 ro.debuggable==1, 保存配置并重啟手機(jī),Hierarchy Viewer連接正常,終于可以正常調(diào)試了。
方法三:
參照《如何在Root的手機(jī)上開啟ViewServer,使得HierachyViewer能夠連接》http://maider.blog.sohu.com/255448342.html。該方法本人沒有實(shí)踐過,一看有18個(gè)步驟,
還涉及到 android逆向、smail,瞬間腦仁發(fā)緊,有興趣的同學(xué)可以自行嘗試一下。
三、好了,關(guān)于控件ID的獲取,就分享到這里。
????????????? 【下面是我整理的2023年最全的軟件測試工程師學(xué)習(xí)知識架構(gòu)體系圖】
一、Python編程入門到精通
二、接口自動(dòng)化項(xiàng)目實(shí)戰(zhàn)
三、Web自動(dòng)化項(xiàng)目實(shí)戰(zhàn)
四、App自動(dòng)化項(xiàng)目實(shí)戰(zhàn)
五、一線大廠簡歷
六、測試開發(fā)DevOps體系
七、常用自動(dòng)化測試工具
八、JMeter性能測試
九、總結(jié)(尾部小驚喜)
生命不息,奮斗不止。每一份努力都不會被辜負(fù),只要堅(jiān)持不懈,終究會有回報(bào)。珍惜時(shí)間,追求夢想。不忘初心,砥礪前行。你的未來,由你掌握!
生命短暫,時(shí)間寶貴,我們無法預(yù)知未來會發(fā)生什么,但我們可以掌握當(dāng)下。珍惜每一天,努力奮斗,讓自己變得更加強(qiáng)大和優(yōu)秀。堅(jiān)定信念,執(zhí)著追求,成功終將屬于你!文章來源:http://www.zghlxwxcb.cn/news/detail-611504.html
只有不斷地挑戰(zhàn)自己,才能不斷地超越自己。堅(jiān)持追求夢想,勇敢前行,你就會發(fā)現(xiàn)奮斗的過程是如此美好而值得。相信自己,你一定可以做到!文章來源地址http://www.zghlxwxcb.cn/news/detail-611504.html
到了這里,關(guān)于Appium+python自動(dòng)化(二十五)-獲取控件ID(超詳解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!