Appium 做 flutter 自動化測試實踐&採坑

YueChen發表於2020-07-17

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

相關文章