关于自动化测试:跨平台进行iOS自动化新选择

43次阅读

共计 2914 个字符,预计需要花费 8 分钟才能阅读完成。

什么是 sonic-ios-bridge

sonic-ios-bridge(以下简称 sib),用于 pc 与 ios 通信的工具,以后版本蕴含以下根底性能
1、跨平台启动 wda
2、app 列表、装置、卸载、启动
3、设施高低线监听
4、设施详细信息
5、主动挂载开发者镜像
Github 地址

只有你的 ios 有 wda 包,能够应用 sib 唤起之后,用 appium 等框架间接连贯对应 url,就能实现跨平台(Linux、Win、Mac)自动化,能够不依赖 mac 和 xcode(当然打 wda 到 ios 的时候须要 xcode,后续跑自动化就不须要了)

Sonic 为什么思考替换 tidevice

tidevice 是一个十分优良的工具,然而这边如果单因为 tidevice 让用户部署 python 环境无疑是微小的节约,以往不少用户部署 Agent 的时候都是在 python 环境踩了坑。而 go 语言打包的可执行二进制文件能够不须要部署额定的环境运行,并且 go 语言天生的性能与速度都是十分优的。
援用网上一篇文章的话

Go 语言的特点表明它具备轻量级线程实现(Goroutine)、智能规范库、弱小的内置安全性,且可应用最简语法进行编程。

所以,如果你本人是 Sonic 平台层面的用户,那么这个新技术带来的成果兴许是不痛不痒,最显著收益是部署时不须要 py 环境。
如果你是 python 语言为主做 iOS 自动化,那么还是举荐持续应用 tidevice
如果你是 java 或其余语言为主做 iOS 自动化,那么能够思考应用 sib,不要搭建 py 环境啦~

尝试本人造轮子

过后查找了大量 usbmuxd、lockdown 的文章,也有参考了 tidevice 的代码。用本人的形式实现了跨平台与 usbmuxd 的通信与 iOS 的 lockdown 通信,做出了

  1. 获取设施详情
  2. 监听设施高低线
  3. 设施端口转发,相似 iproxy

停顿还是挺顺利,接下来搞启动 wda

发现宝藏

前面着手进行启动 wda 这最难的性能的时候,testmanager 等等一系列恶心人的逻辑让我痛不欲生,启动 wda 简直围绕了整个 iOS 协定走了一圈,偶然逛 github 的时候发现原来有小伙伴用 go 实现过 ios 通信了,叫 gidevice,也有伴生了 cli 版。然而因为没有主动挂载开发者镜像的性能,还不能间接接到 sonic 外面,加上某些数据根底还是要联合 sonic 业务来开展。
于是放弃之前本人做的轮子,间接基于 gidevice 的根底上,来做一层 sonic 的 cli 与辅助扩大

扩大性能如下几点:

1. 获取设施型号的中文名称,如 iPhone14,5 -> iPhone 13

整顿的映射表
次要从 apple 的 wiki 爬取下来的

2. 自定义输入 json 数据格式与格式化格局

这个次要用来联合 sonic 业务做的

3. 主动挂载开发者镜像

这里参考了 tidevice 的做法,在仓库下载对应版本号的开发者镜像并进行挂载操作

func downloadZip(url, version string) error {if versionMap[version] != "" {version = versionMap[version]
    }
    _, errT := os.Stat(fmt.Sprintf(".sib/%s.zip", version))
    if errT != nil {_, err := os.Stat(".sib")
        if err != nil {os.MkdirAll(".sib", os.ModePerm)
        }
        client := http.Client{Timeout: DownLoadTimeOut,}
        res, err := client.Get(fmt.Sprintf("%s/iOSDeviceSupport/raw/master/DeviceSupport/%s.zip", url, version))
        if err != nil {return err}
        defer res.Body.Close()
        r := bufio.NewReaderSize(res.Body, 32*1024)
        newFile, err := os.Create(fmt.Sprintf(".sib/%s.zip", version))
        w := bufio.NewWriter(newFile)
        io.Copy(w, r)
        abs, _ := filepath.Abs(newFile.Name())
        errZip := unzip(abs, ".sib", version)
        if errZip != nil {os.Remove(newFile.Name())
            return errZip
        }
    }
    return nil
}
4. 设施离线后填充对应序列号到对应字段

离线后只能拿到 deviceID,这个 id 是连贯时候通过自增定义的,并不是设施的序列号,须要本人做解决

5. 监听时展现设施详细信息

这个属于扩大性能,搭配 sonic 业务应用

6. 获取 app 信息,包含中文名与长版本号

原本 gidevice 提供的 applist 只有 app 的英文名称和短版本号,须要用 gidevice 另一个 InstallationProxyBrowse 的办法做,并且筛选用户的利用

if device.Properties().SerialNumber != "" {result, errList := device.InstallationProxyBrowse(giDevice.WithApplicationType(giDevice.ApplicationTypeUser))
                if errList != nil {return util.NewErrorPrint(util.ErrSendCommand, "appList", errList)
                }
                var appList entity.AppList
                for _, app := range result {a := entity.Application{}
                    mapstructure.Decode(app, &a)
                    appList.ApplicationList = append(appList.ApplicationList, a)
                }
                data := util.ResultData(appList)
                fmt.Println(util.Format(data, isFormat, isJson))
            } else {fmt.Println("device no found")
                os.Exit(0)
            }

如何应用

  1. Sonic 平台用户能够不必关怀,应用起来跟以往无异,Agent 层会主动调用 sib,并解决了以往版本我还没修复的很多 bug,实践上更稳固。
  2. 非间接应用平台的用户能够返回这里下载对应版本文件
sib run wda -b 你的 wda 包名

执行之后能够浏览器关上 localhost:9100,有手机画面代表胜利
包名如果没有.xctrunner 会主动补全.xctrunner,默认应用第一台手机,如果想指定手机,能够

sib run wda -u 序列号 -b 你的 wda 包名

如果想更改端口号,能够

sib run wda -h 来查看对应参数

获取序列号能够通过

sib devices

更多用法能够通过 sib -h 或者 github 的文档查看哦~

结语

这里还是非常感谢 gidevice 作者雷系泡泡,给我省去了不少造轮子的工夫。
sib 也将在 v1.3.2-beta 开始接入 sonic,心愿大家多多期待

正文完
 0