简介

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


↙↙↙阅读原文可查看相关链接,并与作者交流