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