最近公司正在做 flutter sdk 的研发工作,脚本开发工作也随之而来,网上也找了很多资料对于 flutter 的自动化,貌似使用最多的还是本身 flutter_driver 驱动来做自动化测试,解决起来也踩了不少坑,这里记录一下
咱们先来看看这篇官方文档
https://flutter.dev/docs/cookbook/testing/integration/introduction
如果要用 flutter_driver 做自动化三个重要点:
//void main() => runApp(MyApp());
main() {
enableFlutterDriverExtension();
runApp(new MyApp());
}
#打包 debug
> flutter build apk --debug
> flutter build ios --debug
#运行 profile 或 debug
> flutter run --debug
> flutter run --profile
准备工作做完了,运行下看看 flutter_driver 做了啥
flutter run --profile
使用 profile 调试模式启动显示如下:
Flutter run key commands.
h Repeat this help message.
c Clear the screen
q Quit (terminate the application on the device).
An Observatory debugger and profiler on iPhone11 is available at:
http://localhost:51295
打开 web 页面:
监听了 51295 端口,看下这个端口进程是啥:
> lsof -i:51295
dart 3186 rong 17u IPv4 0x1a4dc03ef78fcf23 0t0 TCP localhost:51298->localhost:51295 (ESTABLISHED)
dart 3186 rong 21u IPv4 0x1a4dc03ef76f6523 0t0 TCP localhost:51300->localhost:51295 (ESTABLISHED)
iproxy 5936 rong 3u IPv4 0x1a4dc03f0f581523 0t0 TCP localhost:51295 (LISTEN)
iproxy 5936 rong 4u IPv6 0x1a4dc03eef247263 0t0 TCP localhost:51295 (LISTEN)
iproxy 5936 rong 5u IPv4 0x1a4dc03ef7993f23 0t0 TCP localhost:51295->localhost:51298 (ESTABLISHED)
iproxy 5936 rong 8u IPv4 0x1a4dc03ef05318a3 0t0 TCP localhost:51295->localhost:51300 (ESTABLISHED)
看来是 iproxy 转发了 dart 进程端口:
> ps -ax|grep iproxy
5936 ttys010 0:00.04 /Users/rong/tools/flutter/bin/cache/artifacts/usbmuxd/iproxy 51295:58019 --udid *******62c60b38c5e5*************
iproxy 转发了 ios 设备的 58019 端口,
搜一搜 ios 控制台日志
flutter: Observatory listening on http://127.0.0.1:58019/
基本逻辑貌似搞清楚了,通过 flutter_driver 端口拼接 ws 地址转发来执行操作命令,有兴趣的可以自己抓包看看, 下面咱们看看 Appium 怎么做自动化
官方 API 地址:https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/getLayerTree.html
appium 1.16 之后的版本已经有大佬写了支持 flutter_driver 驱动了 (当然 bug 不少,吐槽一下)
appium-flutter-driver 仓库地址:
https://github.com/truongsinh/appium-flutter-driver
我们写个 python demo 试试
driver = Remote('http://localhost:4723/wd/hub', dict(
platformName='iOS',
automationName='flutter',
deviceName='iPhone 11',
app="cn.rongcloud.sealbiz",
udid="*****7b3785e8f58****",
xcodeOrgId="***VMN****",
xcodeSigningId="iPhone Developer",
))
print(driver.execute_script('flutter: getRenderTree'))
ws 连接地址好像和上面 web 页面挺像的,但是一直连接不上,lsof 看看端口
lsof -i:57537
啥也没有,根据上面的原理,应该是要做本地转发手机里的 flutter-driver 端口应该才能连接上,试一下看看
iproxy 57537:57537 --udid ****62c60b38c5e5**********
成功连接上了,应该是 appium-flutter-driver 端口转发问题。
知道这个问题了去看看这个仓库啥情况,并没有看到任何端口转发,fork 仓库 做了一些端口转发 bug,重连时间的修改
https://github.com/YueChen-C/appium-flutter-driver 分支:real-device
!!!必须安装了 iproxy 工具!!!
可以自己打包,也可以使用我打包好的文件,
替换掉 appium/node_modules/appium-flutter-driver/bulid
build 文件 下载
链接: https://pan.baidu.com/s/1t2uAIC3YOPL8zZ5gZT8jrA 提取码: jbma
appium-flutter-driver 还有很多功能没做,也存在很多 bug 希望小伙伴们能共同研究 flutter ~