Python脚本葵花宝典之一键批量复制文件
问题
QA小张新接了一个测试任务,其中有一测试项需要使用有批量视频或图片的安卓设备,而且还需要使用不同的机型系统适配,如果使用传统的手工复制操作,成本很高,首先要找到系统相册,然后进行复制操作
-
相册中照片或视频较少,需在相册中多次进行全选复制操作
-
相册中照片或视频较少,如果从外部导入要确保外部有批量文件且了解要导入的路径
-
如涉及到适配,需要在每个设备都操作一次
问题分析
是否有一个方案能实现自动化复制文件的功能?
联想到adb shell cp命令支持文件复制,可以考虑将封装脚本自动化实现,另外在复制前,需要检查adb连接状态,复制后需要刷新图库,否则系统相册无法及时更新复制的文件
方案 | 优势 | 劣势 |
---|---|---|
方案一 手工操作 | 直接操作,没有编写脚本耗时 | 重复操作比较耗时 |
方案二 自动化脚本 | 一次开发多次使用 | 需要下载并熟悉脚本 |
Python脚本实现
步骤一 检查adb连接状态
def check_adb_status(self):
print("第一步:检查adb连接状态")
command = 'adb devices'
adbfile = os.popen(command, "r")
result = adbfile.read()
adbfile.close()
# 对result处理,获取连接状态
formatresult = result.replace('\n', '').replace(' ', '')
if " device" not in formatresult:
print("adb连接失败,请重新连接\n")
sys.exit(1)
else:
print("adb连接成功\n")
self.get_lock_screen()
步骤二 实现拷贝的功能。传入两个参数file_path和copy_count,分别代表要复制的源文件路径和要复制的次数。
def run_copy_file(cls, file_path, copy_count):
ADB_PUSH = 'adb push %s /data/local/tmp/' % file_path
os.system(ADB_PUSH)
time.sleep(2)
filename = os.path.basename(file_path)
print('filename名称为' + filename)
now = datetime.datetime.now()
nowtime = now.strftime('%Y_%m_%d_%H_%M_%S')
count = 1
while count <= copy_count:
ADB_SHELL_CP = 'adb shell cp /data/local/tmp/%s /sdcard/DCIM/Camera/%s_%s_%s'\
% (filename, count, nowtime, filename)
print("第%s次复制" % count)
print("ADB_SHELL_CP*******" + ADB_SHELL_CP)
os.system(ADB_SHELL_CP)
time.sleep(2)
count = count + 1
#更新广播,刷新系统相册
print("复制完成,刷新相册")
os.system(ADB_SHLEL_BROADCAST)
注:为了便于识别拷贝的文件,文件名称由三部分组成,拷贝次数_当前时间_被拷贝文件名称,如29_2020_04_19_19_11_50_jiantou.gif
脚本执行过程及结果
传入本地待复制文件路径和预期复制次数,以复制gif文件且复制次数为30次为例,如下
if __name__ == "__main__":
cpfile = CopyFile()
cpfile.check_adb_status()
copy_file_count = 30
# file_path = r"D:\技术\读书笔记\gaoxiaoxuexi.jpg"
copy_file_path = r"D:\技术\读书笔记\jiantou.gif"
# file_path = r'D:\技术\读书笔记\WeChat_20200409154818.mp4'
CopyFile.run_copy_file(copy_file_path, copy_file_count)
脚本执行结果,截图部分如下
第一步:检查adb连接状态
adb连接成功
第二步:开始检查设备锁屏状态
未锁屏可继续操作
441 KB/s (15827 bytes in 0.035s)
filename名称为jiantou.gif
第1次复制
ADB_SHELL_CP*******adb shell cp /data/local/tmp/jiantou.gif /sdcard/DCIM/Camera/1_2020_04_19_19_11_50_jiantou.gif
....
第29次复制
ADB_SHELL_CP*******adb shell cp /data/local/tmp/jiantou.gif /sdcard/DCIM/Camera/29_2020_04_19_19_11_50_jiantou.gif
第30次复制
ADB_SHELL_CP*******adb shell cp /data/local/tmp/jiantou.gif /sdcard/DCIM/Camera/30_2020_04_19_19_11_50_jiantou.gif
复制完成,刷新相册
Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=file:///sdcard/DCIM/Camera flg=0x400000 }
Broadcast completed: result=0
脚本执行完成后,在设备相机和设备文件下均展示复制成功的文件,如下图所示
脚本格式化检查
通过pylint检查代码是否需要进符合规范,如下检查结果7.45/10需要优化
pylint copyfile_nosh.py
************* Module 9.utils.copyfile_nosh
copyfile_nosh.py:1:0: C0114: Missing module docstring (missing-module-docstring)
copyfile_nosh.py:17:4: C0116: Missing function or method docstring (missing-function-docstring)
copyfile_nosh.py:32:4: C0116: Missing function or method docstring (missing-function-docstring)
copyfile_nosh.py:32:4: R0201: Method could be a function (no-self-use)
copyfile_nosh.py:45:4: C0116: Missing function or method docstring (missing-function-docstring)
copyfile_nosh.py:45:27: W0621: Redefining name 'file_path' from outer scope (line 71) (redefined-outer-name)
copyfile_nosh.py:45:38: W0621: Redefining name 'copy_count' from outer scope (line 69) (redefined-outer-name)
copyfile_nosh.py:46:8: C0103: Variable name "ADB_PUSH" doesn't conform to snake_case naming style (invalid-name)
copyfile_nosh.py:53:12: C0103: Variable name "ADB_SHELL_CP" doesn't conform to snake_case naming style (invalid-name)
copyfile_nosh.py:45:4: R0201: Method could be a function (no-self-use)
copyfile_nosh.py:67:4: C0103: Constant name "cpfile" doesn't conform to UPPER_CASE naming style (invalid-name)
copyfile_nosh.py:69:4: C0103: Constant name "copy_count" doesn't conform to UPPER_CASE naming style (invalid-name)
copyfile_nosh.py:71:4: C0103: Constant name "file_path" doesn't conform to UPPER_CASE naming style (invalid-name)
------------------------------------------------------------------
Your code has been rated at 7.45/10 (previous run: 6.20/10, +1.25)
按照提示修改后,执行结果如下,终于9分以上了,如果与git关联,并设置git-pylint配置limit=9.0 那么代码就可以提交成功啦
注:有些提示如要忽略,可使用-d ,如下
pylint copyfile_nosh.py -d C0103 -d C0116
************* Module 9.utils.copyfile_nosh
copyfile_nosh.py:1:0: C0114: Missing module docstring (missing-module-docstring)
------------------------------------------------------------------
Your code has been rated at 9.81/10 (previous run: 9.81/10, +0.00)
遇到的小坑
在文件复制后,系统相册仍未展示复制后的照片或视频,此时需要刷新图库,执行如下命令
方案一 执行如下命令即可
adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/DCIM/Camera
方案二 重启设备,如果方案一不生效
猜你喜欢