Appium Appium 做 flutter 自动化测试实践&采坑

YueChen · July 17, 2020 · Last by Yu replied at August 18, 2020 · 1857 hits

最近公司正在做 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 ~

共收到 9 条回复 时间 点赞

flutter做自动化测试真的很坑,你这种还是单Flutter的,还有混合Flutter的做自动化测试就更难了。

YueChen #2 · July 17, 2020 作者
0x88 回复

Android 还好点,至少能看到基本元素布局。iOS XCUITest 框架真的是什么元素都看不到,但官方表示这不重要😩

YueChen 回复

关键还要加启动参数 release包怎么办

你这个是真机跑的吗?我看FlutterDriver还不支持真机呀!

Yu 回复

嗯,主要问题修改就是解决真机无法跑的问题

flutter后 就不用再搞UI了,毕竟debug包很多不愿意提供的.

YueChen 回复

厉害了,我现在只看模拟器上能获取到元素,我设置到驱动名没用Flutter,还是用的XCUITest,我们的App现在是原生加Flutter的形式,Flutter的代码写好后是以一个库的形式引用,光把环境配置好就弄了半天😥

Yu 回复

咦,用 XCUITest 要怎么样才能在混合工程里拿到 Flutter 元素鸭?

SpiciedCrab 回复

真机现在没法拿,模拟器可以,但是你可以是一下按照博主的来,最新版本的Appium已经内置来Flutter驱动的,但是还是等Appium官方支持把

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up