Python封装tidevice实现pull、push功能

在做自动化测试时,会进行iOS设备的资源操作,常用的“ios-deploy”命令依赖xcode环境,并且可用性差;阿里开源了一个叫做tidevice的工具替代,但是只能实现单个文件的push和pull操作,对于目录级别支持不好,以下使用python进行简单封装,方便直接使用:

import os
import shutil
import subprocess


def adb_shell(cmd):
    logger.info(cmd)
    output = subprocess.getoutput(cmd)
    logger.info(output)
    return output

""" 使用tidevice进行iOS相关文件操作 """
# 清除iOS设备整个文件夹所有内容
def ios_clear_path(device_id, bundle_id, path):
    adb_shell('tidevice -u {} fsync -B {} rmtree {}'.format(device_id, bundle_id, path))

# 从本地往iOS设备push文件,支持整个目录到目录,使用示例:utils.ios_push_files(serialno, pkg_name, 'tmp/testdir1', 'Documents/res')
def ios_push_files(device_id, bundle_id, local_path, device_path):
    local_file_pre_list = []
    local_file_list = get_filelist_and_pre(local_path, '', [], local_file_pre_list)
    local_file_pre_list = list(set(local_file_pre_list))
    if len(local_file_list) > 0:
        for pre in local_file_pre_list:
            device_pre = pre.replace(local_path, device_path, 1)
            if not device_pre.find('__MACOSX') > 0:
                adb_shell('tidevice -u {} fsync -B {} mkdir {}'.format(device_id, bundle_id, device_pre))
    device_file_list = []
    for file in local_file_list:
        file_device = file
        file_device = file_device.replace(local_path, device_path, 1)
        device_file_list.append(file_device)
    for index in range(len(local_file_list)):
        if not local_file_list[index].endswith('.DS_Store') and not local_file_list[index].find('__MACOSX') > 0:
            adb_shell('tidevice -u {} fsync -B {} push {} {}'.format(device_id, bundle_id, local_file_list[index], device_file_list[index]))

# 从iOS设备往本地pull文件,支持整个目录到目录(有个缺陷,本地将不含设备中的子目录,而是将所有文件放到一个目录下),使用示例:utils.ios_pull_files(serialno, pkg_name, 'Documents/', 'tmp/test_ios_pull/')
def ios_pull_files(device_id, bundle_id, device_path, local_path):
    no_pre_file_list = []
    files_list = ios_recursively_get_file_list(device_id, bundle_id, device_path, no_pre_file_list)
    logger.info('ios_pull_files no_pre_file_list: {}'.format(no_pre_file_list))
    if len(files_list) > 0 :
        if not os.path.exists(local_path):
            os.makedirs(local_path)
        for file in files_list:
            # if file != '.DS_Store':
            adb_shell('tidevice -u {} fsync -B {} pull {}'.format(device_id, bundle_id, file))
        for file in no_pre_file_list:
            shutil.move(file, local_path + '/')

# 递归获取iOS设备文件夹里所有文件,返回的result_file_list会带具体目录前缀,no_pre_file_list不带前缀
def ios_recursively_get_file_list(device_id, bundle_id, path, no_pre_file_list):
    # adb_shell('tidevice -u {} fsync -B {} tree {}'.format(device_id, bundle_id, path))
    result_file_list = []
    files_list = []
    files_list_txt = adb_shell('tidevice -u {} fsync -B {} ls {}'.format(device_id, bundle_id, path))
    if files_list_txt and files_list_txt != '[\'\']' :
        files_list = eval(files_list_txt)
    for file in files_list:
        tmp_no_pre_file_list = []
        inner_list = ios_recursively_get_file_list(device_id, bundle_id, path + '/' + file, tmp_no_pre_file_list)
        if len(inner_list) > 0:
            for file_inn in inner_list:
                result_file_list.append(file_inn)
            for file_no_pre in tmp_no_pre_file_list:
                no_pre_file_list.append(file_no_pre)
        else:
            result_file_list.append(path + '/' + file)
            no_pre_file_list.append(file)
    return result_file_list

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
什么是HPSocket HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中[1]。 为了让使用者能方便快速地学习和使用 HP-Socket ,迅速掌握框架的设计思想和使用方法,特此精心制作了大量 Demo 示例(如:PUSH 模型示例、PULL 模型示例、性能测试示例以及其它编程语言示例)。HP-Socket 目前运行在 Windows 平台,将来会实现跨平台支持。 --- 百度百科 什么是异步, 什么是同步 "HPsocket所有组件都是异步的"我记得我开始学习HP的时候看见这行字我内心是崩溃的. 我觉得一些聊天室/游戏什么的才用异步,那么我专门写一些网关中间件什么的. 常用的是"应答式(同步)".即: 发送响应.类似http请求, 但不会断开客户端 异步: 专门绑定一个事件, 收到的所有数据都投送给事件处理.适合聊天室/游戏等等 同步: 发送后等待响应, 获取响应数据后继续向下执行. 不需要绑定事件什么的.类似post, 不会断开连接就是了 为什么做这个玩意 记得是去年开始学习hp的, 当时在群"怪物乐园"询问如何实现同步. 与某(忘记了)个管理发生了py交易. 他热心的帮助我写了一个"PACK模型"的同步操作例子. 之后应用在一个项目中并不理想,因为PACK模型是整个包发送,有大小限制,还经常出现问题. 今年一个项目想用HP的PULL模型,所以自己分析那个大神给的例子.终于魔改封装出了一个"PULL模型"的同步操作类. 之前有易友希望我开源,其实我早就想开源了的,因为需要从项目中分离出来太麻烦了, 而且工作忙(上班),所以就拖到了今天
什么是HPSocket HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中[1]  。 为了让使用者能方便快速地学习和使用 HP-Socket ,迅速掌握框架的设计思想和使用方法,特此精心制作了大量 Demo 示例(如:PUSH 模型示例、PULL 模型示例、性能测试示例以及其它编程语言示例)。HP-Socket 目前运行在 Windows 平台,将来会实现跨平台支持。 --- 百度百科 什么是异步, 什么是同步 "HPsocket所有组件都是异步的"  我记得我开始学习HP的时候看见这行字我内心是崩溃的. 我觉得一些聊天室/游戏什么的才用异步,  那么我专门写一些网关中间件什么的.   常用的是"应答式(同步)".  即: 发送<--->响应.  类似http请求, 但不会断开客户端 异步: 专门绑定一个事件, 收到的所有数据都投送给事件处理.    适合聊天室/游戏等等 同步: 发送后等待响应, 获取响应数据后继续向下执行.   不需要绑定事件什么的.  类似post, 不会断开连接就是了 为什么做这个玩意 记得是去年开始学习hp的,   当时在群"怪物乐园"询问如何实现同步.   与某(忘记了)个管理发生了py交易.   他热心的帮助我写了一个"PACK模型"的同步操作例子. 之后应用在一个项目中并不理想,  因为PACK模型是整个包发送,  有大小限制,  还经常出现问题. 今年一个项目想用HP的PULL模型,  所以自己分析那个大神给的例子.    终于魔改封装出了一个"PULL模型"的同步操作类. 之前有易友希望我开源,  其实我早就想开源了的,  因为需要从项目中分离出来太麻烦了, 而且工作忙(上班),  所以就拖到了今天

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值