最近公司正在做 flutter sdk 的研发工作,脚本开发工作也随之而来,网上也找了很多资料对于 flutter 的自动化,貌似使用最多的还是本身 flutter_driver 驱动来做自动化测试,解决起来也踩了不少坑,这里记录一下

flutter_driver 驱动自动化测试

咱们先来看看这篇官方文档
https://flutter.dev/docs/cookbook/testing/integration/introduction

如果要用 flutter_driver 做自动化三个重要点:

  1. 代码依赖里面需要 dev_dependencies 添加依赖 flutter_driver
  2. 要在 app 代码主进程 main() 里的 runApp 之前加入 enableFlutterDriverExtension() 开启调试功能。 例如:
//void main() => runApp(MyApp());

main() {
  enableFlutterDriverExtension();
  runApp(new MyApp());
}
  1. app 启动方式需要是 profile 或者 debug 包 #打包 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 使用 flutter-driver 驱动执行 执行自动化测试

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 ~


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