1. 程式人生 > >Python調用安卓adb命令

Python調用安卓adb命令

board www. 開始 關心 src 但是 是不是 cmd命令 tab

1.1、概要

今天是《Python自動化測試應用》的第十一篇,本篇將繼續第十篇的adb命令結合pyapp框架編寫過程中實際遇到的那些坑。後面的內容不是簡單的列舉命令(因為網絡上大把,大家關心什麽可以自己搜索),而是延續一貫的風格以實戰為主。好了各位同學坐穩了,我要發車了,哈哈。

1.2、那些需要註意的adb命令

1.2.1、"adb shell input ……"

這條命令,在測試過程中也是經常用到的,它後面可以跟 tap,text,swipe,進行點擊屏幕,輸入文本,滑屏的操作,具體在python中使用按照命令格式執行也不會出現什麽問題。但是如果我們要長按某個元素,從而實現具體功能呢?下面給出實現代碼。

def long_press(dev,data,hold_time):

action='adb -s '+dev+' shell input touchscreen swipe '+'%d'%data[0][0]+' '+'%d'%(data[0][1])+' '+'%d'%data[-1][0]+' '+'%d'%(data[-1][1])+' '+hold_time

print action

pi= subprocess.Popen(action,shell=True,stdout=subprocess.PIPE)

long_press('4d0041b1be98b01f',[[540,716],[545,718]],'1000')

可以看到我定義的long_press方法,action裏用到的仍然是swipe命令,大家知道swipe是滑動屏幕的操作,那麽如果我們在傳遞滑動範圍坐標的時候,設定的滑動範圍非常小,那麽是不是就是間接的達到了長按某一個區域的目的,然後配合一個整個命令的執行時間的參數,是不是就完美解決了長按這個動作。

我們看一看完整的adb命令:

adb -s 4d0041b1be98b01f shell input touchscreen swipe 540 716 545 718 1000

解釋:-s 後跟設備號 ,swipe 先傳移動坐標範圍"540 716 545 718",然後1000是長按的時間,1000的單位是毫秒(註意)。

大家不要以為這條命令就這樣介紹結束了,還沒有。按道理來說input後面的source源在swipe命令裏默認就是touchscreen,所以一般我們在寫這條命令時是可以省略touchscreen的,但是實際我在編寫pyapp框架的時候(由於pyapp設計需要支持多臺設備),拿了不同型號品牌(分辨率)的手機做適配,畢竟框架要照顧的範圍要必須廣要有一定的普適性。我發現,在pyapp的僚機模式下(就是一臺主設備操控多臺附屬設備,獲取最新pyswat和pyapp程序),主設備的長按操作在有些副設備上實現不成功,開始我也是在命令裏省略了touchscreen。開始也想不到什麽原因,因為命令來說也不復雜不存在寫錯的情況,畢竟有些副設備還是能正確響應動作的,後來我把shell input命令的幫助結果打印出來研究了一下(見上一篇文中有截圖),在swipe命令的參數傳遞中說明了touchscreen是缺省,默認屬性,所以正常來說我們是不用在命令中明確指定該參數值的,然而我也是瞎貓碰到死耗子,試著在命令裏加入了touchscreen,最後執行結果每一臺副設備在長按命令的執行上都成功了。

1.2.2、adb命令如何輸入中文?

db命令裏進行輸入文本輸入'adb -s 設備號shell input text 輸入的內容'。在原生的adb命令裏是不支持中文輸入的,所以我們在測試的時候只能輸入英文字符。然而實際我們在做app測試的時候避免不了需要輸入中文字符的情況,這裏給大家介紹一種曲線救國的辦法。利用"ADBKeyBoard"輸入法來進行中文的輸入,通過廣播的方式達到輸入中文字符,具體命令:adb shell am broadcast -a ADB_INPUT_TEXT --es msg "內容"。

1.2.3、啟動應用

在appium的應用中每次只能開啟一個app,而如果用adb命令的話就靈活許多,輸入:adb shell am start -n package名/.activity名,這裏的package名和activity名和appium中配置的一致。比如我們啟動計算器程序,對應的命令就是"adb shell am start -n com.android.calculator2/.Calculator"。這裏要再提醒大家一點,APP的package名和activity名一定要找對特別是activity名,具體大家可以參看我的《python自動化測試應用-第2篇(APP測試)--Appium初識篇》裏邊講解了具體的查找方法。當然大家也是可以根據adb命令去進行查找,在pyapp測試框架中我就是根據adb命令進行名稱的查找啟動應用的。這裏我講解一下思路,利用命令adb shell pm list packages -3,將手機中安裝的第三方app列舉出來,然後通過時間比對找到新安裝的app從而確定名稱。其實大家只要有了思路可以在百度中查找對應的命令即可。

1.2.4、只會發短信,那麽查看短信呢?不會你就out了!

網上你可能找到如何發短信,打電話的相關adb命令的介紹,其實原理也就是1.2.3中介紹的,還是啟動對應的應用程序來實現。比如發短息:adb shell am start -a android.intent.action.SENDTO -d smsto:發送號碼 --es sms_body 短信內容。那麽如何讀取一條短信內容呢?

在編寫pyapp框架的過程中為了實現app的驗證碼自動填寫功能,著實費了一番功夫。目前大部分的註冊登錄都是可以用動態短信驗證碼來進行操作的,當然app開發者本身是可以實現在收到短信後讀取驗證碼進行自動填寫,遇到沒有這種功能的app我們當然也可以按照此原理去實現。由於安卓手機的所有短信都是存儲在數據庫中,那麽我們只要找到短信的這個數據庫文件,自然就可以輕松的通過python的數據庫操作讀取到短信內容了。'/data/data/com.android.providers.telephony/databases/mmssms.db'這個路徑下"mmssms.db"文件就是保存短信內容的數據庫文件,那麽剩下的工作自然就是數據庫的讀操作了,用正則表達式匹配到驗證碼即可,最後通過adb的input命令寫入到app中即可。這裏還需要註意的是,操作"mmssms.db"文件需要root權限,所以你要想在pyapp框架裏使用這個功能必須是使用root過的手機設備。

1.2.5、adb命令su權限如何使用?

什麽是adb命令的su權限,舉個簡單的例子,比如說你要訪問手機的內存/data/system路徑下的文件。在cmd命令窗中你需要執行三步:

(1)在cmd窗體中輸入命令:adb shell回車

技術分享圖片


(2)輸入su回車

技術分享圖片


  查看更多精彩內容,請點擊下載:

http://www.51testing.com/html/39/n-3723839.html

版權聲明:本文出自《51測試天地》第四十八期。51Testing軟件測試網及相關內容提供者擁有51testing.com內容的全部版權,未經明確的書面許可,任何人或單位不得對本網站內容復制、轉載或進行鏡像,否則將追究法律責任。


Python調用安卓adb命令