《自拍教程46》Python_adb自动拍照100张
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。
更多更好的原创文章,请访问官方网站:
自拍教程(自动化测试python教程,武散人编著)
原文链接:
也可关注“武散人”微信订阅号,随时接受文章推送。
上一篇: jQuery 属性,元素
下一篇: 网页简单布局之结构与表现原则案例