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手机为例:

table th:first-of-type {
width: 100px;
}

相关命令 释义
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

也可关注“武散人”微信订阅号,随时接受文章推送。

《自拍教程46》Python_adb自动拍照100张的更多相关文章

  1. 《自拍教程52》Python_adb运行Shell脚本

    Android作为一款Linux终端,肯定是支持.sh后缀的Shell脚本的运行的, 有时候测试环境准备或者长时间截取复杂的日志等,开发会给到一些Shell脚本. Shell脚本的执行的优势: 快捷高 ...

  2. 《自拍教程45》Python_adb实时监控Logcat日志

    接上一篇:adb命令_一键截取logcat日志, 有一天, 系统稳定性开发负责人找到我,希望我能在跑android 系统monkey的时候, 实时监控logcat的输出,如果一旦发现"jav ...

  3. 《自拍教程51》Python_adb批量生成App版本表格

    案例一:版本在软件研发阶段是很重要的, 不同的版本, 已修复的Bug也不一样, 所实现的功能不一样, Android终端产品正式版本发布前,项目经理除了确保系统版本确定无误外, 还会逐个验证所搭载的所 ...

  4. webpack4 系列教程(十三):自动生成HTML文件

    作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十三):自动生成 HTML 文件>原文地址.更欢迎来我的小站看更多原创内容:go ...

  5. [Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现

    [Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现 今天做Android项目的时候要用到图片选择,要实现拍照获取图片和从相册获取图片,并且要求在获取完之后可以裁剪,试了很多方法之 ...

  6. JS练习--自动生成100个li

    点击按钮,自动生成100个li,红.黄.蓝.绿四种颜色的顺序显示出现在页面中 CSS: ;;} ul,li{list-style: none;} #ul1{position: relative;} # ...

  7. 魅族MX3 Flyme3.0找回手机功能支持远程拍照密码错两次自动拍照

    进入Flyme页面(http://app.meizu.com/),选择“查找手机”即可进行查找自己登记的魅族系列手机. 如果您在一个账号下登记过N多魅族系列手机,那么都是可以进行查找的,参见下图 魅族 ...

  8. arcpy地理处理工具案例教程-生成范围-自动画框-深度学习样本提取-人工智能-AI

    arcpy地理处理工具案例教程-生成范围-自动画框-深度学习样本提取-人工智能-AI 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 目的:对面. ...

  9. Directx11教程(46) alpha blend(3)

    原文:Directx11教程(46) alpha blend(3)       现在我们尝试改变box的贴图,使用一张带alpha的dds文件wirefence.dds, 用directx textu ...

随机推荐

  1. java中的二维数组基础知识

    二维数组基本知识,毕竟常见的有:概念,初始化,遍历 概念: 理解二维数组,首先要先理解一维数组是什么.一维数组是个容器,存储相同数据类型的容器(这里不再做一位数组的具体介绍).二维数组就是用来存储一维 ...

  2. baidumap 百度地图,实现多点之间的带方向路线图。

    通过lastVisitAt判断时间先后. 通过三角函数验证角度 再由baidumap 会制线段 绘制三角箭头 比较难看…… 测试个人 因为框架引用baidu 有各种问题失败,为最快实现,以此页作一个独 ...

  3. html和jsp页面中把文本框禁用,只能读不能写的方法

    方法常用有三种: 第一种,使用   onfocus="this.blur()" <input name="deptno" type="text& ...

  4. zookeeper伪分布式集群搭建

    zookeeper集群搭建注意点:         配置数据文件myid1/2/3对应server.1/2/3         通过zkCli.sh -server [ip]:[port]检测集群是否 ...

  5. React.js/HTML5和iOS双向通信

    最近,我使用WKWebView和React.js进行双向通信,自己写了React.js嵌入到Native中. Native操作Web,通过两种方式传值 第一种,通过JS传值给Native 通过这种方式 ...

  6. babel-runtime 使用场景

    Babel 转译后的代码要实现源代码同样的功能需要借助一些帮助函数,例如,{ [name]: 'JavaScript' } 转译后的代码如下所示: 'use strict'; function _de ...

  7. 生死状:苹果VS他的供应商

    据知情人士透露,苹果已经组建了代号为Titan的汽车团队,并招募了数百名员工,准备进入汽车领域,iCar大有呼之欲出之势.事实上,苹果CEO蒂姆-库克早在去年就参观了宝马位于莱比锡的核心工厂,学习如何 ...

  8. O2O疯狂烧钱路:止血还是放血好

    在国内,无论是互联网巨头还是创业者,很多都将O2O领域当做下一个金矿.而对于很多O2O项目来说,市场规模.用户基数.发展潜力等传统指数依然被当做硬性指标.而为了抢夺用户,很多O2O项目都只能疯狂烧钱, ...

  9. Coding and Paper Letter(十五)

    资源整理. 1.Nature Climate Change论文"Higher temperatures increase suicide rates in the United States ...

  10. 斑马难题Step by Step

    问题描述 分析 代码 在exercism.io被这个 Zebra Puzzle 难住了.这里一步一步的解决... 1.There are five houses. 2.The Englishman l ...