STF openstf+tidevice 开源,不依赖 Mac 也能跑 iOS 设备,同时支持一机多控

EasilyTest · 2021年02月05日 · 最后由 TD 回复于 2021年04月12日 · 1371 次阅读
本帖已被设为精华帖!

简介

近期 阿里的内部的一个小组用来做 iOS 自动化用的工具 tidevice ,终于开源了出来。所以就尝试着整合一下这个神奇的资源到 stf 上来
所以这篇文章主要就是来推广一下思路,烦请大家多多指点,可能是全网首发吧。

项目已经开源地址 https://github.com/EasilyTest/stf,请先点个 Star ⭐ ,然后回来在看。

它有什么功能呢?

截图
App 安装,启动,停止,查看
启动 WebDriverAgent
性能采集(类似 PerfDog)不过这块暂时只有 API 可以用。
功能还在不停的扩展中

这么一看,??这不是可以完全替代 xcodebuild 来启动 WebDriverAgent 了吗?那还要什么 Mac,我大 Linux 不香吗?
看过 stf 的 ios 启动方案的人都知道,最大的难点在于如何不依赖 xcode 启动 WebDriverAgent,如果解决了这个问题,那么就没 Mac 什么事情了,甚至可以直接把整个项目 docker 化,来一键部署。

那么问题来了如何实现?简单展示一下(这里会有一个小坑,test 的应用 id 是 com.apple.test......),利用 SubpPocess 模块,来执行 tidevice 操作,或者 execSync 来替换原先的 idevice -l。

  wdaPro = new SubpPocess("tidevice",["-u",options.serial,
          "xctest", "-B","com.apple.test.WebDriverAgentRunner-Runner"])
  wdaPro.start()
  return new Promise((resolve,reject)=>{
    wdaPro.on("exit",(code,signal)=>{
      wdaPro = null;
      bRestart = true
      //plugin.restartWda();
      return resolve()
    });
    wdaPro.on("stream-line",line=>{
      bRestart = false
      log.info("tidevice开始构建")
      log.info(line)
      if (line.indexOf("WebDriverAgent start successfully")!=-1){
        log.info("WDA启动成功")
        wda.launchApp('com.apple.Preferences')
        wda.initSession()
        wda.emit("started");
        bRestart=true
        bRestartCnt = 0
        if(checkTimer===null){
          batteryTimer = setInterval(plugin.getBatteryInfo,300000)
          checkTimer = setInterval(plugin.checkWdaStatus,3000)
        }
        return resolve()
      }

iDevice.prototype.read = function() {
    var stdout = execSync('tidevice list --json',{});
    var out = JSON.parse(stdout.toString());
    var tem = [];
    if(out!=[]){
    for (var i in out) {
        tem.push(out[i].udid.toString())
    }
        ref = tem;
        this.update(ref,'device');
    }else{
      this.update([],'device');
    }
    ref = simtcl.GetBootedSim()
    if(ref){
      this.update(ref,'emulator');
    }
  };

这样就完成了 xcodebuild 到 tidevice 的调用,根据原逻辑直接几行搞定,tidevice 启动 wda 的速度比原来的 xcodebuild 提高了 50 倍以上,实现了 wda 秒启。
直接运行 stf local --public-ip XXX.XXX.XXX.XXX,即可启动,不再需要--wda-path 参数。
同时我们可以对项目进行改造,网上的资料你经常能看到一级多控,多设备显示,但是就是没人开源没人分享,给思路不给代码,我实现了下大致效果图如下

页面核心内容在 stf/res/app/batch-control-panes 目录下,主要还是利用了 localStorage 的特性来存储和修改需要的参数,利用 stf 自带的 standalone 模式做出不同的小页面来展示在页面上。

至此,基于 stf 的一机多控 + 全平台通用已基本实现框架,不同端需要的依赖需要自行编译安装,这里稍微麻烦一些,后续会写个 shell 出来一键操作
,stf 代码也会逐步完善。如果你需要更好的功能或者有更好的思路欢迎 pr

传送门

tidevice 的帖子 https://testerhome.com/topics/27758
stf-ios 的帖子 https://testerhome.com/topics/19548

PS: QQ 群 962526549,如果有问题或者不想提 issue 的可以进群来交流心得

共收到 10 条回复 时间 点赞

特别赞!请教下,如果不在 mac 下,怎么去配置 webdriveragent,而且打包 webdriveragent 对 xcode 的版本有时候也有要求啊。这个如果离开 mac,怎么解决啊

黑山老妖 回复

根据 tidevice 的描述,你需要提前安装 webdriveragent,它提供了一个 ipa 包改一下签名就可以用它安装类似以下形式,
$ tidevice install example.ipa
$ tidevice install https://example.org/example.ipa
也就是说如果你有自己已经打好的包,可以直接通过 tidevice 或者 ideviceinstall 来安装

EasilyTest 回复

感谢回复!stf-ios 有一个逻辑是,当运行 wda 报错时,会重新 build 一个 wda,你的方案是重新安装一次 wda 并启动嘛

运行报错:

黑山老妖 回复

不重新安装,但是会重启执行 tidevice 模拟一遍 xcodebuild 执行

阿三 回复

用 cnpm 吧,依赖没全

你好,和 android 对比起来,操作效率如何

Wei Chuang 回复

ios 实际上和 android 对比起来帧数还是略低一些,所以还是会有部分的卡顿。
这个需要通过视频流来处理

EasilyTest 回复

依赖安装全了,运行 stf local --public-ip XXX.XXX.XXX.XXX 报错

恒温 将本帖设为了精华贴 04月06日 06:01

这个在 Linux 上怎么 docker 一键部署?我现在想在 Linux(Ubuntu 16.04.5 ) 上实现 ios 的 stf,这些依赖是在宿主机上安装吗?原本这上面部署了 openstf 可以实现 Android 的 stf,这个要怎么兼容 ios 的?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册