Android手機測驗,
涉及照相機(Camera)應用程式的穩定性測驗的用例,
需要涉及100張照片的拍照自動化測驗,
準備階段
- 先清理老照片,照片一般存放在/scard/DCIM目錄下
- adb shell am start + 相機的Activity 可以打開相機App
- adb shell input tap 坐標可以模擬點擊拍照按鈕
- 坐標可以通過設定-》開發者選項-》打開指標位置(坐標),
可以查看拍照按鈕的具體坐標(x,y)值
如何查看應用程式的包名
應用程式的包名(Package Name), 作為應用的唯一標識, 代表了一個apk,
包名用于應用程式管理(安裝,卸載), 如何看包名呢?
以魅族Note5手機為例:
| 相關命令 | 釋義 |
|---|---|
| pm list package |grep camera | 列出本手機里所有已經安裝了應用程式包名, 過濾后只顯示涉及camera相關的包名 |
| dumpsys package com.meizu.media.camera |grep Activity | 查看com.meizu.media.camera軟體包的各類資訊, 過濾后只顯示與Activity相關的資訊 |
Python批處理腳本模式
# coding=utf-8
import os
import time
# 清除舊的照片
os.system("adb shell rm -rf /sdcard/DCIM/*")
# 打開相機
os.system("adb shell am start com.meizu.media.camera/.CameraActivity")
# 回圈點擊拍照按鈕100次
for i in range(1, 101):
os.system("adb shell input tap 551 1773") # 點擊相機拍照按鈕的坐標
print("第%d張照片已經拍照完成"%i)
time.sleep(1) # 拍完一張后,間隔1s,再拍下一張
# 匯出剛剛拍的100張照片, 再由測驗人員手動Check相片質量
os.system("adb pull /sdcard/DCIM .")
print("Test Over, Photos saved to %s%sDCIM" % (os.getcwd(), os.sep))
os.system("pause")
os.getcwd()是獲取當前python腳本的當前路徑,
os.sep 是一個路徑分隔符, 建議大家常用,
可以很好的適配不同的作業系統路徑分隔符,
如果是在Windows系統,代表一個\字符 ; 如果是Linux系統,代表一個/字符,
Python面向程序函式形式
只需要一個拍照的函式camera_capture, 可以傳拍多少輪(張)照片,
# coding=utf-8
import os
import time
def camera_capture(cycle):
# 清除舊的照片
os.system("adb shell rm -rf /sdcard/DCIM/*")
# 打開相機
os.system("adb shell am start com.meizu.media.camera/.CameraActivity")
# 回圈點擊拍照按鈕100次
for i in range(1, cycle+1):
os.system("adb shell input tap 551 1773") # 點擊相機拍照按鈕的坐標
print("第%d張照片已經拍照完成"%i)
time.sleep(1) # 拍完一張后,間隔1s,再拍下一張
# 匯出剛剛拍的100張照片, 再由測驗人員手動Check相片質量
os.system("adb pull /sdcard/DCIM .")
print("Test Over, Photos saved to %s%sDCIM" % (os.getcwd(), os.sep))
camera_capture(100)
os.system("pause")
Python面向物件類形式
- 以"萬物皆可歸類"的思想, 先抽象化出一個類來,
類名一般建議用"名詞", 所以我們命名為"CameraCapturer",
代表螢屏捕捉器, 且一般要駝峰式(首字母大寫)來規范類的命名. - 養成良好的類的初始化(__init__)的習慣,
初始化程序中, 可以pass(什么都不做) - 這個CameraCapturer類, 目前只需要一個拍照函式(動作功能)就足夠了,
函式的命名一般建議用"動詞", 所以我們命名為: "camera_capture" . - 類是一個抽象的事物, 必須實體化成具體的物件后,
才能進行呼叫, 所以我們實體化并命名成了c_obj, 表明是一個物件. - 實體化成具體物件后, 物件就可以呼叫camera_capture這個函式了.
# coding=utf-8
import os
import time
class CameraCapturer():
def __init__(self):
pass
def camera_capture(self, cycle):
# 清除舊的照片
os.system("adb shell rm -rf /sdcard/DCIM/*")
# 打開相機
os.system("adb shell am start com.meizu.media.camera/.CameraActivity")
# 回圈點擊拍照按鈕100次
for i in range(1, cycle + 1):
os.system("adb shell input tap 551 1773") # 點擊相機拍照按鈕的坐標
print("第%d張照片已經拍照完" % i)
time.sleep(1) # 拍完一張后,間隔1s,再拍下一張
# 匯出剛剛拍的100張照片, 再由測驗人員手動Check相片質量
os.system("adb pull /sdcard/DCIM .")
print("Test Over, Photos saved to %s%sDCIM" % (os.getcwd(), os.sep))
if __name__ == '__main__':
c_obj = CameraCapturer()
c_obj.camera_capture(100)
os.system("pause")
代碼運行方式
確保Android車機設備通過USB線與電腦連接了,adb設備有效連接,
以上代碼的3種實作形式都可以直接運行,比如保存為take_photo.py并放在桌面,
可以考慮python take_photo.py 運行或者直接雙擊運行,
腳本優化方向
- 可以考慮自動做圖片對比,如果發現圖片在連續拍攝同意物體的程序中,
同一畫面,不同照片像素大小相差太大(或者色差相差太大),
則需要提示例外讓測驗做檢測, 多媒體測驗相關案例會介紹如何實作, - 拍照程序中,考慮下把logcat log匯出來,因為可能拍照程序中,出現了bug,
有log才能更好地跟蹤Bug,
包名與行程名(Process Name)不同,行程名用于行程管理(創建,銷毀),
應用程式的包名(Package Name), 作為應用的唯一標識,
代表了一個apk,包名用于應用程式管理(安裝,卸載),
后續性能監控之類的,都是用行程進行行程級別的監控,
后續monkey之類的,都是用包名來進行指定Monkey的App,
更多更好的原創文章,請訪問官方網站:www.zipython.com
自拍教程(自動化測驗Python教程,武散人編著)
原文鏈接:https://www.zipython.com/#/detail?id=609bf757abd548e5aca2a07f2c3a55f3
也可關注“武散人”微信訂閱號,隨時接受文章推送,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/170378.html
標籤:Python
下一篇:python(re 模塊)
