• 《自拍教程46》Python adb自动拍照100张


    Android手机测试,
    涉及照相机(Camera)应用程序的稳定性测试的用例,
    需要涉及100张照片的拍照自动化测试。


    准备阶段
    1. 先清理老照片,照片一般存放在/scard/DCIM目录下
    2. adb shell am start + 相机的Activity 可以打开相机App
    3. adb shell input tap 坐标可以模拟点击拍照按钮
    4. 坐标可以通过设置-》开发者选项-》打开指针位置(坐标),
      可以查看拍照按钮的具体坐标(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面向对象类形式
    1. 以"万物皆可归类"的思想, 先抽象化出一个类来,
      类名一般建议用"名词", 所以我们命名为"CameraCapturer",
      代表屏幕捕捉器, 且一般要驼峰式(首字母大写)来规范类的命名.
    2. 养成良好的类的初始化(__init__)的习惯,
      初始化过程中, 可以pass(什么都不做)
    3. 这个CameraCapturer类, 目前只需要一个拍照函数(动作功能)就足够了,
      函数的命名一般建议用"动词", 所以我们命名为: "camera_capture" .
    4. 类是一个抽象的事物, 必须实例化成具体的对象后,
      才能进行调用, 所以我们实例化并命名成了c_obj, 表明是一个对象.
    5. 实例化成具体对象后, 对象就可以调用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 运行或者直接双击运行。


    脚本优化方向
    1. 可以考虑自动做图片对比,如果发现图片在连续拍摄同意物体的过程中,
      同一画面,不同照片像素大小相差太大(或者色差相差太大),
      则需要提示异常让测试做检测, 多媒体测试相关案例会介绍如何实现。
    2. 拍照过程中,考虑下把logcat log导出来,因为可能拍照过程中,出现了bug,
      有log才能更好地跟踪Bug。

    包名与进程名(Process Name)不同,进程名用于进程管理(创建,销毁),
    应用程序的包名(Package Name), 作为应用的唯一标识,
    代表了一个apk。包名用于应用程序管理(安装,卸载)。
    后续性能监控之类的,都是用进程进行进程级别的监控,
    后续monkey之类的,都是用包名来进行指定Monkey的App。

    更多更好的原创文章,请访问官方网站:www.zipython.com
    自拍教程(自动化测试Python教程,武散人编著)
    原文链接:https://www.zipython.com/#/detail?id=609bf757abd548e5aca2a07f2c3a55f3
    也可关注“武散人”微信订阅号,随时接受文章推送。

  • 相关阅读:
    老王讲架构:负载均衡
    支付宝系统架构内部剖析
    Effective Java 第三版——61. 基本类型优于装箱的基本类型
    Effective Java 第三版——60. 需要精确的结果时避免使用float和double类型
    Effective Java 第三版——59. 熟悉并使用Java类库
    Effective Java 第三版——58. for-each循环优于传统for循环
    Effective Java 第三版——57. 最小化局部变量的作用域
    Effective Java 第三版——56. 为所有已公开的API元素编写文档注释
    Effective Java 第三版——55. 明智而审慎地返回Optional
    Effective Java 第三版——54. 返回空的数组或集合不要返回null
  • 原文地址:https://www.cnblogs.com/zipython/p/12527332.html
Copyright © 2020-2023  润新知