Python調用安卓adb命令

來源:互聯網
上載者:User

標籤:new   移動   tap   計算   斷行符號   top   lin   預設   app測試   

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"IME來進行中文的輸入,通過廣播的方式達到輸入中文字元,具體命令: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"檔案就是儲存簡訊內容的資料庫檔案,那麼剩下的工作自然就是資料庫的讀操作了,用Regex匹配到驗證碼即可,最後通過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命令

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.