ATX tidevice 开源:不依赖 Xcode 也能启动 WDA

codeskyblue · 2021年01月27日 · 最后由 cmlanche 回复于 2021年02月26日 · 8145 次阅读
本帖已被设为精华帖!

简介

tidevice 是阿里的内部的一个小组用来做 iOS 自动化用的工具。最近终于开源了出来。
所以这篇文章就来介绍一下这款工具。

项目地址 https://github.com/alibaba/taobao-iphone-device,请先点个 Star ⭐ ,然后回来在看。

它有什么功能呢?

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

这个工具是纯 Python 写成的,所以也是跨平台的。也就是可以在能跑起来 Python 的 Windows、Linux、Mac 上运行。

其中网上最难找的应该是这个如何不依赖 xcode 启动 WebDriverAgent,这个工具就可以做到,原理的话可以翻源码。因为不依赖 Xcodebuild,所以就算你只有 Windows 或者 Linux 也能跑起来 iOS 自动化。

截止到发稿日期 2021/01/27,支持 iOS 手机的范围是 9.0-14.0

安装

该工具是用 Python 写的,依赖 Python3.6+
安装方法

pip3 install -U tidevice

截图、App 启动等一些常规操作

# 查看所有连接上的设备
$ tidevice list
List of apple devices attached
1234567892d8372eb752f413280722cdcc200954 iPhoneSE

# 截图
tidevice screenshot screenshot.jpg

# 启动苹果设置
tidevice launch com.apple.Preferences

# 查看已安装的第三方应用
tidevice applist

启动 WebDriverAgent 演示

本来想录个视频的,但是 Windows 电脑还要去借,太麻烦了。就不录视频了。反正你知道 Windows 能跑就行。

第一步用数据线将 iPhone 手机连接到 PC 上,另外还需要手机上已经有WebDriverAgent这个 App 了。这个可以通过 xcode 编译源码安装,也可以用开发者证书重签名的 WebDriverAgent.ipa 安装到手机。

WebDriverAgent.ipa 在项目的 tests/testdata 目录下可以找到我之前打包好的。

启动就是一个命令 tidevice xctest 或者指定执行设备和 bundleId tidevice -u $UDID xctest -B $BUNDLE_ID

需要运行运行自动化的话,可以直接用 facebook-wda

或者用 iproxy 8100 8100 将服务映射出来用 Appium 或其他自动化框架连接也可以。

我觉的这种方式的优点

  1. 启动速度快(基本都在 1s 内)
  2. CPU、Memory 占用率低,可以实现 1 台电脑挂载 10+ iPhone 设备的需求
  3. 不限操作系统。Linux,Windows 也可以。不过还是有条件上 Mac,也就贵一点而已。
  4. 最重要的就是这种方式稳定性高。

其他功能

tidevice applist
tidevice reboot
tidevice screenshot
tidevice info
tidevice install https://.....ipa

更多功能参考
tidevice -h

其他

我怕你忘记点 ⭐,这里再贴一遍 https://github.com/alibaba/taobao-iphone-device

PS: 本小组正在招人,欢迎投递简历并留言。https://testerhome.com/topics/23010

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 88 条回复 时间 点赞

膜拜大佬
另外日期是 2021 年?

有空试一下~~~

codeskyblue · #3 · 2021年01月27日 Author
仅楼主可见

另外想问一下,如果在 Windows 上测 iOS,可以抓取元素吗? 例如 weditor 或者 appium inspector ?

Jerry li 回复

可以

大佬们都在做这种工具的东西 我们就只会拿开源的组合到一起。。而且组合的还不太行。。

膜拜大佬 orz,我们刚好有几个点卡在这上边

前排膜拜大佬

这段时间弄这个 xctest 直挠头,大佬牛逼,来炒个作业😝

正要考虑要不要找公司借一台 mac 跑自动化,这下好了,抽个时间就去试试,感谢大佬~

11楼 已删除
12楼 已删除

真赞啊,真及时,正想要这个功能!!!

14楼 已删除

有独立包吗?

好东西!赞一个!

请问手机和电脑之间 wifi 连接方式支持么

大佬两个问题:
1.这一部已经成功,tidevice -u $UDID xctest -B $BUNDLE_ID 这时候怎么看 localhost:8100 ,页面打不开,怎么与 aietest 进行关联呢?
2.可否通过无线的方式建立连接

多谢大佬。

cmlanche 回复

别忘了点 Star

codeskyblue 回复

不用说,早就 star 点赞转发三连了

陈恒捷 将本帖设为了精华贴 01月28日 09:06

解决了 Windows 上不能做 ios 自动化的大问题 大佬牛逼!


大佬显示 ios 连接有问题

murphy 回复

😂 我也是一样的问题,还没解决。。。

哲豪 回复

已解决 要安装 iTunes

还有开发者证书重签名的 WebDriverAgent.ipa 应该只能安装在越狱设备上吧

点赞

赞,太强了

murphy 回复

开发者证书重签名一下也可以

大佬求指教,用 wda 去自动化跑场景,收集性能数据时,发现跑一会手机就发烫严重,内存也升高很多,感觉 wda 对性能影响很大,这个有什么解决办法吗😇

Jacc 回复

提供几个方法哈

  1. 装个风扇
  2. 换个手机
  3. 重写一下 WDA
  4. 证明一下是被测应用的问题,而不是 WDA
  5. 其他

1 和 2 不能从根本上解决问题,因为我用同一台手机,手动触发同样场景时,性能数据比较稳定,手机不怎么热
3 当前水平还不够。。
4 准备尝试用其他 app 试试,看看差异
5 有没有可能 wda 和被测 app 通信性能开销较大,或者 xcuitest 框架本身就有较大开销?xcuitest 自动运行应该和手动点点点调用 api 方式有所不同吧

执行
import wda

c = wda.USBClient()
print(c.info)
报:Unhandled endpoint: /session/7026A8F6-0569-4CFB-BE60-3F24BE4E59BE/wda/device/info -- http://127.0.0.1/ with parameters {
wildcards = (
"session/7026A8F6-0569-4CFB-BE60-3F24BE4E59BE/wda/device/info"
);
}

window 平台,怎么破啊,大佬

murphy 回复

好的 谢谢,这就去试试

codeskyblue 回复

但是你发的这个 webdriverAgent 是越狱版的呀 安装不起

“iproxy 8100 8100 将服务映射出来用 Appium 或其他自动化框架连接”
请问 这个 具体 怎么在 window 上实现啊, 现在 想用 我们自己的 wda 测试下😔

windows 上怎么使用 iproxy 8100 8100 呢?需要怎么安装?

TD 回复

windows 上应该要用 adb forward 了吧

xu 回复

你这个看起来已经连接上了,只是 WDA 的版本没有支持/wda/device/info 这个接口。你试试print(c.status()) 这个接口应该可以用的

cmlanche 回复

adb 是用于 Android 的吧

41楼 已删除
xu 回复

可以查看 http://127.0.0.1:8100/status 返回是否正常,返回正常跑自动化肯定没问题,不正常的话检查端口转发、wda 是否启动成功

@codeskyblue 请问下 windows 上 想测试 自己的 wda, iproxy 端口 这个怎么实现啊

Jacc 回复

我也遇到了,只有 start_app stop_app 有问题会提示,其他都正常的。是不是和本身的 tidevice launch 冲突了?
File "D:\AirtestIDE-win-1.2.6\AirtestIDE\airtest\core\ios\wda_client.py", line 83, in httpdo
raise WDAError(r.status, r.value)
airtest.core.ios.wda_client.WDAError: WDAError(status=1, value=Unhandled endpoint: /session/54A497B2-033A-4977-8F53-17E727686FAB/wda/apps/launch -- http://127.0.0.1:8100/ with parameters {
wildcards = (
"session/54A497B2-033A-4977-8F53-17E727686FAB/wda/apps/launch"
);
})

codeskyblue 回复

问下,wda 是怎么打包成 ipa 的?

TD 回复

我在 Mac 用 appium 试的可以,airtest 不太了解,要不你用 py-wda 试试?

murphy 回复

弱弱的问一句,这个 ipa 怎么导出的,为啥我百度 xcode 导出 ipa 的方法最后有点不一样,导出来的是.xcarchive 文件,而不是.ipa

TD 回复

我直接在他上传的文件目录拿到的
但是这个 ipa 需要重新签名 所以还是用 xcode 重新编译 wda 安装到你手机上把

@codeskyblue 支持无线么?貌似都是通过 usb 通信的

YueChen 回复

命令行不太好传,增加了一个通过环境变量传参的方法 tidevice 0.1.3 tidevice xctest -e USE_PORT:8100

WebDriverAgent.ipa 如何重签打包?

@codeskyblue 我本地打包重签后,tidevice launch 正常,tidevice xctest 报错了,帮忙看下吧

运行后 tidevice xctest -B WebDriverAgentRunner -e USE_PORT:8100
提示
[I 210129 23:41:45 _device:955] Start execute test plan with IDE version: 29
[I 210129 23:41:46 _device:877] WebDriverAgent start successfully

但是浏览器访问:http://127.0.0.1:8100
依然无法打开。
百思不得其解。。。

TD 回复

你启动这个 tidevice xctest -B WebDriverAgentRunner 后
能访问http://127.0.0.1:8100吗?
我看你连上 airtest 了,我启动后这个总是不通,所以一直无法连 airtest 的。。。
大佬 help。。

xu 回复

加个 iproxy 8100 8100 就可以了

codeskyblue 回复

我有看到这个文档,但是 Airtest 的 iOS-target 好像打不出来,能把帮忙看看这个可以打包出来吗?https://github.com/AirtestProject/iOS-Tagent

xu 回复

我是用了 itunnel_mux.exe --iport 8100 --lport 8100 这个工具,你可以搜看看

TD 回复

为啥我 Windows 下会提示 An unknown server-side error occurred while processing the command. Original error: Could not determine Xcode version: Could not find path to Xcode by symlinks located in /var/db/xcode_select_link, or /usr/share/xcode-select/xcode_dir_link

有人在 Windows 下用 Appium 调成功了吗

@codeskyblue 大佬,可以修改一下 tidevice/_device.py 中写死的 WebDriverAgentRunner 路径么,这个可以通过 app_info 获取,这样我就不仅可以通过 tidevice 启动 wda,而且也可以启动其他应用(比如我还可以启动 iOS monkey 了)
_launch_wda 方法下实测可以启动不同的应用

app_info = self.installation.lookup(bundle_id)
sign_identity = app_info.get("SignerIdentity", "")
logger.info("SignIdentity: %r", sign_identity)

app_container = app_info['Container']
target = app_info.get("CFBundleName").split("-")[0]
xctest_path = "/tmp/{}-".format(target) + str(session_identifier).upper() + ".xctestconfiguration" # yapf: disable
xctest_content = bplist.objc_encode(bplist.XCTestConfiguration({
    "testBundleURL": bplist.NSURL(None, "file://" + app_info['Path'] + "/PlugIns/{}.xctest".format(target)),
    "sessionIdentifier": session_identifier,
})) # yapf: disable
tester 回复

可以啊,要不要提个 pr 啊,坑位给你留着

codeskyblue 回复

晚点提,公司电脑访问 github 只有读权限

有空试试,顶一下大佬。

win 电脑想搞 ios 的福音啊,但是 wda 安装也得用到 xcode 来编译打包?楼主大佬可否出个 windows-ios 平台安装 wda+tidevice+appium 得教程🙋

太为难我了,我其实没 windows 电脑的,只有找别人借才行

codeskyblue 回复

嗯嗯,俺们自己先研究一波,感谢分享,已 star 已三连

优秀,弱弱问下性能测试啥时候支持呢😉

TD 回复

我是 windows 机器。。。所以还是运行不了:http://127.0.0.1:8100

Yu 回复

这个怎么用,还是不行。。大佬,救我。

codeskyblue 回复

就凭能在 windows 上跑 ios 就能吹爆,大佬牛逼,已 fork

请问支持 Ios 模拟器吗?用模拟器的 udid,提示 no match

Wei Chuang 回复

你试试 facebook 的 idb,我看文档感觉操作模拟器还挺方便的


请教下,安装 ipa 包时,这个报错如何解决一下🙋

用 python3.8 就不会报错了

77楼 已删除
linpengcheng 回复

好的,我试试,谢谢

请问支持 iOS 性能收集了吗?求解~


请教一下,这是哪里出错了呀

tester 回复

是 swiftmonkey 吗,能跑起来吗?

@yanderder 兄台,你这个问题解决了么,我也碰到你这个问题了

Wei Chuang 回复

是的,可以跑呀

maohangyu 回复

应该是企业证书签的名不行

@yanderder 我是个人开发者账号啊。。。

maohangyu 回复

我也是,我也不行😂

好东西,感谢大佬,感谢阿里开源,之前楼主的 uiautomator2 就很好用,正准备去尝试 appium 做 iOS 自动化,现在可以试试这个了。

python 升级到 3.7+ 就可以

我通过包名启动 WebDriverAgent,报错:AssertionError: Invalid CFBundleExecutable: YYMobile
请教一下大佬是什么原因?

你这个 com.yy.enterprise.yyvoice 不是 WebDriverAgent 吧

codeskyblue 回复

我发现 tidevice 启动 wda 后,直接调用 wda 的接口(如启动 app、获取控件树、控件查找等),在第一次的时候回特别慢,有时候多达五六分钟,难以忍受(health 检查会很快返回),请问您知道吗,有什么优化的点吗?

cmlanche 回复

是不是用的 WDA 有问题,或者是 app 的问题,你试试启动个系统 app 试试 com.apple.Preferences

codeskyblue 回复

测试了下,发现是 app 的包名在手机上不存在,启动 app 也能成功,但是会耗时很长时间,包名正确很快就可以启动了

codeskyblue 回复
$ tidevice -u 5ef7f64cacb615d9172ebf0fa4377e7b172af89f xctest -B com.facebook.WebDriverAgentRunner.xctrunner
[I 210226 17:25:01 _device:909] BundleID: com.facebook.WebDriverAgentRunner.xctrunner
[I 210226 17:25:01 _device:911] DeviceIdentifier: xxx
[I 210226 17:25:02 _device:773] SignIdentity: xxx
[I 210226 17:25:02 _device:840] Launch 'com.facebook.WebDriverAgentRunner.xctrunner' pid: 257
[I 210226 17:25:02 _device:1003] ProductVersion: 12.0
[W 210226 17:25:02 _instruments:560] unexpected error: socket connection broken
[W 210226 17:25:02 _device:1033] xctrunner quited

貌似 tidevice 无法在低版本的 iOS 设备上启动,发现不止一个设备了,请问是这样吗?

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