前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >IOS自动化的那些经验

IOS自动化的那些经验

作者头像
赵云龙龙
发布于 2019-11-09 06:25:00
发布于 2019-11-09 06:25:00
2.6K00
代码可运行
举报
文章被收录于专栏:python爱好部落python爱好部落
运行总次数:0
代码可运行

“在自动化测试过程中,Android可以用adb来辅助,IOS却不太好操作,有没有办法呢?

在自动化中,IOS我们可以用libimobiledevice来辅助做一些工作,用xcrun simctl可以来操纵模拟器,具体咋用呢?

什么是libimobiledevice

一个跨平台的软件协议库和工具来与iOS设备进行本地通信 LipimBielEdter是一个跨平台的软件库,用于支持iPhone等mac设备的协议。不像其他项目,它不依赖于使用任何现有的专有库,不需要越狱。它允许其他软件轻松访问设备的文件系统,检索有关设备及其内部设备的信息。官方网站:http://www.libimobiledevice.org github地址:https://github.com/libimobiledevice

安装(Install For MacOS

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  # 若mac没有homebrew则执行此条命令,安装
$ brew install libimobiledevice    $ brew install ideviceinstaller      # ipa安装命令

1、打印app列表和信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ideviceinstaller -l

2、查看当前已连接的设备的UUID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
idevice_id -l

3、获取设备信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ideviceinfo

4、获取设备时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
idevicedate

5、重启设备

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
idevicediagnostics restart 重启idevicediagnostics shutdown 关机idevicediagnostics sleep 休眠

6、安装ipa包,卸载应用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ideviceinstaller -i xxx.ipa //命令安装一个ipa文件到手机上,如果是企业签名的,非越狱机器也可以直接安装了。
ideviceinstaller -U [bundleID] //命令卸载应用,需要知道此应用的bundleID

7、查看系统日志

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
idevicesyslog//屏幕上即可看见手机上所有的日志
idevicesyslog >> iphone.log &//该命令是将日志导入到iphone.log这个文件,并且是在后台执行。//然后用tail -f和grep查看log
tail -f iphone.logtail -f iphone.log | grep 'WeChat’  # 查看包含WeChat的行

8、截图idevicescreenshot//如果在使用截图的时候出现报错信息,那么就去把相应版本的DeveloperDiskImage的两个文件复制到libimobiledevice文件下面。

路径:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/对应版本/

获取版本号命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ideviceinfo -k ProductVersion

安装DeveloperDiskImage命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ideviceimagemounter DeveloperDiskImage.dmg//然后就可以正常截图了

9、 遇到报错

解决方法:卸载重装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew uninstall ideviceinstallerbrew uninstall libimobiledevicebrew install --HEAD libimobiledevicebrew install ideviceinstaller

遇到的问题 问题1 执行命令ideviceinfo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
报错:ERROR: Could not connect to lockdownd, error code -21

问题2 安装过程报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Requested ‘libusbmuxd >= 1.1.0’ but version of libusbmuxd is 1.0.10

解决方案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew updatebrew uninstall --ignore-dependencies libimobiledevicebrew uninstall --ignore-dependencies usbmuxdbrew install --HEAD usbmuxdbrew install --HEAD libimobiledevice

问题3:执行 ideviceinstaller -i ‘安装包路径’。抛出错误如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
29385 abort  ideviceinstaller -i

解决方案:卸载ideviceinstaller,安装最新版本的ideviceinstaller

操作iOS模拟器命令(xcrun simctl)

在做自动化测试的时候,有时候用模拟器来代替真机,这样有几个好处,一个是不一定有那么多真机设备,可以节约资源,还有就是不存在电量耗尽的情况。

我们需要了解一下模拟器和真机的区别:模拟器是i386处理器 真机是arm系列。arm是嵌入式设备的cpu,理论上的确精度要差一些。所以在编写移动设备时应当充分的考虑这些因素。

硬件限制 iOS 模拟器没有硬件限制,比如内存。所以会有应用出现在模拟器上很快,真机很慢的情况,原因是真机的内存被用完了。

我们在做基本的功能自动化,可以用模拟器来代替。我们可以用命令来操作模拟器,下面来看看xcrun simctl有哪些功能吧!

  1. 截图
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xcrun simctl io booted screenshot /pictures/test.png
  1. 录屏命令
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xcrun simctl io booted recordVideo /videos/test.mp4#  在终端按Ctrl+C来停止录屏.
  1. 查看已安装的设备
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xcrun simctl list#列出安装的可用的模拟器xcrun instruments -s查看已安装的模拟器ios-sim showdevicetypes
  1. 启动模拟器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#用来启动模拟器,其中的UUID参数就是之前列表中的UUID。xcrun simctl boot $UUIDxcrun instruments -w "iPhone 8(11.2)"
  1. 关闭模拟器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xcrun simctl shutdown $UUID
  1. 重置模拟器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xcrun simctl erase $UUID
  1. 清理不可用的模拟器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#当Mac空间不够用时,这条命令或许可以帮你重获不是磁盘空间。xcrun simctl delete unavailable
  1. 安装指定app
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xcrun simctl install booted <app路径>ios-sim launch /Users/nali/Desktop/ting.app --devicetypeid iPhone-X, 11.2#多设备时xcrun simctl install <device> <app路径>
  1. 运行指定的app
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xcrun simctl launch booted <bundle identifier>#多设备时xcrun simctl launch <device> <bundle identifier>
  1. 关闭已经打开的应用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xcrun simctl terminate booted <bundle identifer>#多设备时xcrun simctl terminate <device> <bundle identifier>
  1. 卸载指定应用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xcrun simctl uninstall booted <bundle identifer>#多设备时xcrun simctl uninstall <device> <bundle identifier>
  1. 在模拟器与Mac设备之间进行复制&粘贴pbcopy & pbpaste
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pbcopy 复制内容到Mac设备的剪贴板pbpaste 将 Mac设备的剪贴板的内容进行粘贴xcrun simctl pbcopy booted  将Mac设备中剪贴板上的内容复制到模拟器上的剪贴板上;方向:Mac=》模拟器xcrun simctl pbpaste booted 将模拟器中剪贴板上的内容复制到Mac设备上的剪贴板上:方向:模拟器=》Macxcrun simctl pbsync sourceDevice destDevice 将source设备中剪贴板上的内容同步到dest设备上的剪贴板上;方向:source《=》dest,其中可以用 host 表示Mac设备
  1. 更多功能查看
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xcrun simctl -h

这些命令,自己可以写一个包来调用,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import osimport reimport subprocessimport time
current_time = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time()))

class iosinformation():    def exec_command(self, cmd):        result = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)        (stdoutdata, stderrdata) = result.communicate()        # print("Result is:%s") % stdoutdata        if (re.search("No device found", str(stdoutdata)) or re.search("Could not connect", str(stdoutdata))):            print ("Please connet it agian, or add permission like: brew install libimobiledevice --HEAD,sudo chmod -R 777 /var/db/lockdown/")        else:            return stdoutdata
    def Get_UUID(self):        cmd = 'idevice_id -l'        uuid = self.exec_command(cmd)        return uuid
    def Get_Device_Name(self):        cmd = 'ideviceinfo -k DeviceName'        device_name = self.exec_command(cmd)        return device_name
    def Get_Device_information(self):        cmd = 'ideviceinfo -k ProductVersion'        device_information = self.exec_command(cmd)        return device_information
    def Get_Device_Product_type(self):        cmd = 'ideviceinfo -k ProductType'        product_type = self.exec_command(cmd)        return product_type
    def List_All_Pakages(self, uuid):        cmd = 'ideviceinstaller -u {0}'.format(uuid)
        all_pakages = self.exec_command(cmd)
        return all_pakages
    def List_All_Logs(self, uuid):        all_logs = "idevicesyslog -u {0}".format(uuid)        return all_logs
    def Take_Screenshot(self):        current_dir = os.path.split(os.path.realpath(__file__))[0]        cmd1 = "idevicescreenshot {0} + '/' + screenshot-DATE.tiff".format(current_dir)        cmd2 = "sips - s format png {0}.tiff - -out {1}.png".format(current_time, current_time)        self.exec_command(cmd1)
        # self.exec_command(cmd2)
    def Install_Ipa(self, ipa):        cmd = 'ideviceinstaller -i {0}'.format(ipa)        result = self.exec_command(cmd)        return result
    def Uninstall_Ipa(self, appid):        cmd1 = 'ideviceinstaller -l'        cmd2 = 'ideviceinstaller -U {0}'.format(appid)        result = self.exec_command(cmd1)        appids=[]        for id in result.split('\n'):            if re.search('-',id):                str = id[0:id.find("-")].strip()                appids.append(str)
            else:                pass
        if appid in appids:            result = self.exec_command(cmd2)        else:            print ("The appid dosen't exit in the devices")


        # cmd2 = 'ideviceinstaller -u appid'.format(appid)        # result = self.exec_command(cmd)        # return result

def main():    ios = iosinformation()
    uuid = ios.Get_UUID()    print (" uuid is {0}".format(uuid))    device = ios.Get_Device_Name()    print (" device is {0}".format(device))    device_info = ios.Get_Device_information()    print (" device_info is {0}".format(device_info))    product_type = ios.Get_Device_Product_type()    print (" product_type is {0}".format(product_type))    # all_pakagas = ios.List_All_Pakages(uuid)    # print " all_pakagas is {0}".format(all_pakagas)    ios.Take_Screenshot()
if __name__ == '__main__':    main()

经验在于积累,在日常工作中,点滴积累,也许就能大幅度提高工作效率!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python爱好部落 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
离散数学-二元关系、闭包的概念
设S是一个非空集合,R是关于S的元素的一个条件.如果对S中任意一个有序元素对(a,b),我们总能确定a与b是否满足条件R,就称R是S的一个关系(relation).如果a与b满足条件R,则称a与b满足条件R,则称a与b有关系R,记做aRb;否则称a与b无关系R.关系R也成为二元关系. 定义: 集合 X 与集合 Y 上的二元关系是 R=(X, Y, G(R)) 当中 G(R),称为R 的图,是笛卡儿积 X × Y的子集.若 (x,y) ∈ G(R) 则称 x 是 R-关系於 y 并记作 xRy 或 R(x,y).
陈黎栋
2020/02/18
2.7K0
【集合论】关系闭包 ( 关系闭包相关定理 )
文章目录 一、关系闭包相关定理 ( 闭包运算不动点 ) 二、关系闭包相关定理 ( 闭包运算单调性 ) 三、关系闭包相关定理 ( 闭包运算与并运算之间的关系 ) 四、传递闭包并集反例 一、关系闭包相关定理 ( 闭包运算不动点 ) ---- R 关系是 A 集合上的二元关系 , R \subseteq A , 且 A 集合不为空集 , A \not= \varnothing R 关系是自反的 , 当且仅当 R 关系的自反闭包 r ( R ) 也是 R 关系本身 ; R 自反 \Le
韩曙亮
2023/03/28
6900
【集合论】关系闭包 ( 关系闭包相关定理 )
离散数学与组合数学-02二元关系
由笛卡儿积定义可以看出: 1 设 A, B 是任意两个集合,则不一定有 A × B = B × A,即笛卡儿积不满足交换律; 2 A × B = ∅ 当且仅当 A = ∅ 或者 B = ∅; 3 设 A,B, C 是任意三个集合,则不一定有 A × (B × C) = (A × B) × C,即笛卡儿积不满足结合律; 4 当集合 A, B 都是有限集时,|A × B| = |B × A| = |A| × |B|。 5 笛卡儿积对并运算和交运算满足分配律。
用户2225445
2023/10/16
4120
离散数学与组合数学-02二元关系
【集合论】关系闭包 ( 关系闭包求法 | 关系图求闭包 | 关系矩阵求闭包 | 闭包运算与关系性质 | 闭包复合运算 )
次幂 , 不用求出很多幂运算 , 因为关系的幂运算后面都是循环的 , 求出已知的所有
韩曙亮
2023/03/28
2.2K0
【集合论】关系闭包 ( 关系闭包求法 | 关系图求闭包 | 关系矩阵求闭包 | 闭包运算与关系性质 | 闭包复合运算 )
NLP入门之形式语言与自动机学习(一)
任何一门科学都有其自身的理论基础,计算机科学也是这样.大家现在看看计算机的技术变化的很快,现在我们很流行的框架和工具很有可能几年内就会变成过时的东西.但是计算机科学的整体的思维不会变,在学习中,我们更要应该看思考能力的培养,如何清楚的表达自己的能力,如何清晰地解决问题的能力以及自己还欠缺的能力.这方面的东西在我看来,是具有持久的价值的,学习理论能够拓展人们的思维,并能使人们在这方面得到训练.
云时之间
2018/04/10
2.2K2
离散数学复习
两个元素按照一定的顺序组成的二元组就是序偶,使用尖括号进行表示,尖括号里面的元素一般都是有顺序的;
阑梦清川
2025/02/24
600
离散数学复习
【集合论】等价关系个数计算问题 ( 有序对个数计算 | 二元关系个数计算 | 划分 | 等价关系 )
个二元关系 , 逐个验证 等价关系 要求的 自反 , 对称 , 传递 性质 , 肯定行不通 , 计算量巨大 ;
韩曙亮
2023/03/27
1.7K0
离散数学第九章抽象代数笔记
本文适用于bupt的离散数学,或了解学习群论相关知识。 我们说一个集合A到B的二元关系是一个集合,这个关系集合是A和B集合的笛卡尔乘积构成的大集合的子集。对于a∈A,b∈B,记号写成aRb,或者(a,b)∈R。举个例子,
Sarlren
2022/10/28
2.9K0
离散数学第九章抽象代数笔记
离散数学中集合上二元关系的判定及实现
输入一个集合的二元关系,判定其是否满足自反性、反自反性、对称性、反对称性、传递性。并求出自反、对称和传递闭包。 大二上学期时的写的代码,C++语言实现。 #include<iostream> #include<string> using namespace std; class Relation//构造函数 { private: int R[11][2];//存储关系R int R1[11][2], R2[11][2], R3[11][2];//分别存储自反,对称,传递闭包 int m,n;//分别
SuperHeroes
2018/05/30
2.1K0
【集合论】序关系 ( 偏序关系 | 偏序集 | 偏序集示例 )
等价关系 是用于 分类 的 , 偏序关系 是用于 组织 的 , 在每个类的内部 , 赋予一个结构 ;
韩曙亮
2023/03/28
1.3K0
【集合论】关系闭包 ( 自反闭包 | 对称闭包 | 传递闭包 )
包含给定的元素 , 并且 具有指定性质 的 最小的 集合 , 称为关系的闭包 ; 这个指定的性质就是关系
韩曙亮
2023/03/28
4.3K0
【集合论】关系闭包 ( 自反闭包 | 对称闭包 | 传递闭包 )
【集合论】偏序关系 ( 偏序关系定义 | 偏序集定义 | 大于等于关系 | 小于等于关系 | 整除关系 | 包含关系 | 加细关系 )
划分 5 : 对应 3 个等价关系 , 分成 3 类 ; 每个元素自己自成一类
韩曙亮
2023/03/27
5.7K0
【集合论】关系性质 ( 常见的关系的性质 | 关系性质示例 | 关系运算性质 )
参考 : 【集合论】二元关系 ( 特殊关系类型 | 空关系 | 恒等关系 | 全域关系 | 整除关系 | 大小关系 ) 三、 整除关系
韩曙亮
2023/03/28
2K0
【集合论】关系性质 ( 常见的关系的性质 | 关系性质示例 | 关系运算性质 )
【集合论】关系性质 ( 传递性 | 传递性示例 | 传递性相关定理 )
大于 , 大于等于 , 小于 , 小于等于 , 等于 , 等关系 , 是传递的 ;
韩曙亮
2023/03/28
7740
【集合论】关系性质 ( 传递性 | 传递性示例 | 传递性相关定理 )
具体数学-第11课(Stern-Brocot树和同余关系)
开始走到它所在的结点。如果向左走就记为L,向右走记为R,最终可以得到一个L和R的序列。例如
godweiyang
2020/03/24
5890
具体数学-第11课(Stern-Brocot树和同余关系)
【集合论】序关系 : 总结 ( 偏序关系 | 偏序集 | 可比 | 严格小于 | 覆盖 | 哈斯图 | 全序关系 | 拟序关系 | 偏序关系八种特殊元素 | 链 | 反链 ) ★★
等价关系 是用于 分类 的 , 偏序关系 是用于 组织 的 , 在每个类的内部 , 赋予一个结构 ;
韩曙亮
2023/03/28
1.4K0
【集合论】序关系 : 总结 ( 偏序关系 | 偏序集 | 可比 | 严格小于 | 覆盖 | 哈斯图 | 全序关系 | 拟序关系 | 偏序关系八种特殊元素 | 链 | 反链 ) ★★
【集合论】Stirling 子集数 ( 斯特林子集数概念 | 放球模型 | Stirling 子集数递推公式 | 划分的二元关系 加细关系 )
Stirling 子集数作用 : 求集合中有多少不同的 等价关系 , 即求集合中有多少个不同的 划分 ;
韩曙亮
2023/03/28
9290
【集合论】Stirling 子集数 ( 斯特林子集数概念 | 放球模型 | Stirling 子集数递推公式 | 划分的二元关系 加细关系 )
数据库关系运算理论:专门的关系运算概念解析
设有一个学生—课程数据库。学生关系包括学号、姓名、性别、年龄和院系五个属性,课程关系包括课程号、课程名和学分三个属性,选修关系包括学号、课程号和成绩三个属性。
Srlua
2024/03/23
4730
数据库关系运算理论:专门的关系运算概念解析
数学思想的一次飞跃——详述模糊数学
模糊数学是以前较为有争议的一个领域,因为和数学的严谨性统计规律性相悖,但是由于现实中模糊现象较多,使得它在短暂的时间内就迅速发展起来了,现在在社会众多领域都有渗透,可以称为是一次变革。所谓模糊是指处于中间过渡状态的不分明性和辩证性,区别于随机,随机是指一个事件要么发生要么不发生(取决于发生的可能性),比如硬币就只有正反两个可能,基本事件总数总是一定的,而模糊则不一样,比如形容一个人很高,那多高算高?如果他1.8我们就说他比较高,这里的比较高是一个模糊概念,很难用确定性的数学描述,类似的还有老年人与年轻人的划分、污染严重与不严重的界限等,这些都是模糊概念。
用户7506105
2021/09/07
2.9K0
【集合论】偏序关系 相关题目解析 ( 偏序关系 中的特殊元素 | 绘制哈斯图 | 链 | 反链 )
是一条 长为 4 的 链 ; 这四个元素互相之间是可比的 ; 并且也是覆盖的 ,
韩曙亮
2023/03/27
7590
【集合论】偏序关系 相关题目解析  ( 偏序关系 中的特殊元素 | 绘制哈斯图 | 链 | 反链 )
推荐阅读
离散数学-二元关系、闭包的概念
2.7K0
【集合论】关系闭包 ( 关系闭包相关定理 )
6900
离散数学与组合数学-02二元关系
4120
【集合论】关系闭包 ( 关系闭包求法 | 关系图求闭包 | 关系矩阵求闭包 | 闭包运算与关系性质 | 闭包复合运算 )
2.2K0
NLP入门之形式语言与自动机学习(一)
2.2K2
离散数学复习
600
【集合论】等价关系个数计算问题 ( 有序对个数计算 | 二元关系个数计算 | 划分 | 等价关系 )
1.7K0
离散数学第九章抽象代数笔记
2.9K0
离散数学中集合上二元关系的判定及实现
2.1K0
【集合论】序关系 ( 偏序关系 | 偏序集 | 偏序集示例 )
1.3K0
【集合论】关系闭包 ( 自反闭包 | 对称闭包 | 传递闭包 )
4.3K0
【集合论】偏序关系 ( 偏序关系定义 | 偏序集定义 | 大于等于关系 | 小于等于关系 | 整除关系 | 包含关系 | 加细关系 )
5.7K0
【集合论】关系性质 ( 常见的关系的性质 | 关系性质示例 | 关系运算性质 )
2K0
【集合论】关系性质 ( 传递性 | 传递性示例 | 传递性相关定理 )
7740
具体数学-第11课(Stern-Brocot树和同余关系)
5890
【集合论】序关系 : 总结 ( 偏序关系 | 偏序集 | 可比 | 严格小于 | 覆盖 | 哈斯图 | 全序关系 | 拟序关系 | 偏序关系八种特殊元素 | 链 | 反链 ) ★★
1.4K0
【集合论】Stirling 子集数 ( 斯特林子集数概念 | 放球模型 | Stirling 子集数递推公式 | 划分的二元关系 加细关系 )
9290
数据库关系运算理论:专门的关系运算概念解析
4730
数学思想的一次飞跃——详述模糊数学
2.9K0
【集合论】偏序关系 相关题目解析 ( 偏序关系 中的特殊元素 | 绘制哈斯图 | 链 | 反链 )
7590
相关推荐
离散数学-二元关系、闭包的概念
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档