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

EasilyTest · 2021年02月05日 · 最后由 jamin 回复于 2023年03月20日 · 13212 次阅读
本帖已被设为精华帖!

简介

近期 阿里的内部的一个小组用来做 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 的可以进群来交流心得

共收到 20 条回复 时间 点赞

大佬,请教个问题。我这 wda 启动起来了,但是点击进投屏页面, minicap server 连接不上

迪文 回复

已修复,参考 https://github.com/DeviceFarmer/stf/issues/219

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日 14:01

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

npm install 提示 ng-context-menu 找不到,浏览器访问了下 404。

bower ng-context-menu#~1.0.5                                                 ECMDERR Failed to execute "git ls-remote --tags --heads https://github.com/AdiDahan/ng-context-menu.git", exit code of #128 remote: Repository not found. fatal: repository 'https://github.com/AdiDahan/ng-context-menu.git/' not found

ln -s /usr/local/libsodium/bin/* /usr/local/bin/ libsodium 安装后只有 lib include 目录 没有 bin 目录 老哥

牛啊,先收藏

Linux 安装不了,很多依赖安装不上

有大佬在 Linux 下成功部署楼主的这套 stf 控制 iOS 吗?

楼主,部署了你的这个 stf,
stf 启动时启动 ios-provider,但没启动成功,进程中并没有看到 ios-provider 进程,可能哪里有问题呢?

stf 启动 ios-provider 的日志:

2023-03-20T12:54:46.398Z INF/util:procutil 8404 [*] Forking "/root/stf/lib/cli ios-provider --name ubuntu-18-04 --min-port 6100 --max-port 6900 --connect-sub tcp://127.0.0.1:7114 --connect-push tcp://127.0.0.1:7116 --group-timeout 900 --public-ip 192.168.2.120 --storage-url http://localhost:7100/ --wda-path /root/stf/WebDriverAgent/ --wda-port 8100 --wda-mjpeg-port 9100 --vnc-initial-size 600x800 --mute-master never --allow-remote"

stf 启动的相关进程:

root       8404  0.0  0.4 884816 39120 pts/1    Sl+  12:54   0:00 node /root/.nvm/versions/node/v8.9.0/bin/stf local --public-ip 192.168.2.120 --allow-remote
root       8416  0.0  0.5 983988 41356 pts/1    Sl+  12:54   0:00 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli triproxy app001 --bind-pub tcp://127.0.0.1:7111 --bind-dealer tcp://127.0.0.1
root       8417  0.0  0.5 984008 41460 pts/1    Sl+  12:54   0:00 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli triproxy dev001 --bind-pub tcp://127.0.0.1:7114 --bind-dealer tcp://127.0.0.1
root       8422  0.0  0.6 989996 52044 pts/1    Sl+  12:54   0:00 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli processor proc001 --connect-app-dealer tcp://127.0.0.1:7112 --connect-dev-dea
root       8429  0.0  0.6 991200 53664 pts/1    Sl+  12:54   0:00 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli processor proc002 --connect-app-dealer tcp://127.0.0.1:7112 --connect-dev-dea
root       8434  0.0  0.6 991220 54456 pts/1    Sl+  12:54   0:00 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli reaper reaper001 --connect-push tcp://127.0.0.1:7116 --connect-sub tcp://127.
root       8440  0.0  0.5 1000064 47044 pts/1   Sl+  12:54   0:00 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli provider --name ubuntu-18-04 --min-port 7400 --max-port 7700 --connect-sub tc
root       8453  0.1  0.5 906772 48748 pts/1    Sl+  12:54   0:01 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli auth-mock --port 7120 --secret kute kittykat --app-url http://192.168.2.120:7
root       8465  0.1  0.6 927156 53116 pts/1    Sl+  12:54   0:01 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli app --port 7105 --secret kute kittykat --auth-url http://192.168.2.120:7100/a
root       8473  0.2  0.9 1073124 77360 pts/1   Sl+  12:54   0:02 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli api --port 7106 --secret kute kittykat --connect-push tcp://127.0.0.1:7113 --
root       8481  0.5  0.7 1001700 61088 pts/1   Sl+  12:54   0:05 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli groups-engine --connect-push tcp://127.0.0.1:7113 --connect-sub tcp://127.0.0
root       8482  0.1  0.6 1029456 56836 pts/1   Sl+  12:54   0:01 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli websocket --port 7110 --secret kute kittykat --storage-url http://localhost:7
root       8495  0.1  0.5 904036 46456 pts/1    Sl+  12:54   0:01 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli storage-temp --port 7102
root       8496  0.0  0.5 901332 42316 pts/1    Sl+  12:54   0:00 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli storage-plugin-image --port 7103 --storage-url http://localhost:7100/
root       8509  0.1  0.5 903448 44644 pts/1    Sl+  12:54   0:01 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli storage-plugin-apk --port 7104 --storage-url http://localhost:7100/
root       8519  0.0  0.5 887240 44156 pts/1    Sl+  12:54   0:00 /root/.nvm/versions/node/v8.9.0/bin/node /root/stf/lib/cli poorxy --port 7100 --app-url http://localhost:7105/ --auth-url http://localho

大佬的这个 stf 在 Linux 下能成功启动 ios-provider 吗?
我看 stf-ios 的作者说 CentOS 下能安装,但不能启动 ios-provider ...

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

18楼 已删除
黑山老妖 回复

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

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