自动化工具 让 Appium XCUITest 驱动识别 Flutter App 元素跑起来真机自动化

YueChen · 2020年09月08日 · 最后由 tigerwu 回复于 2021年07月28日 · 5390 次阅读

之前也写过一篇文章
Appium 做 flutter 自动化测试实践&采坑 appium-flutter-deriver 驱动来测试 flutter 应用,这个插件有不少 bug ,之前也改动了下驱动源码解决了 ios 真机无法连接问题,但是真正使用上这个三方库,元素识别,输入等是真的难用,混合应用没啥办法,而且必须还要是 debug 模式。

现在做 iOS UI 自动化的同学大多都在使用 Wda XCUITest 框架,但是 XCUITest 驱动看不到元素树,这篇主要记录下使用 XCUITest 来测试 Flutter 的过程。

网上搜索好多资料 flutter issues 看了好多,也问了好多,不知道是问的不对,官方最终建议使用:flutter_driver 驱动做 UI 自动化😹 😹 😹 ,总之都没啥好的解决方案, 没办法自己找找吧
官方盖楼 https://github.com/flutter/flutter/issues/17988

用真机安装 Flutter app 看看实际效果,好吧果然是没有元素树的

但是使用模拟器启动,居然可以看到元素树内容

既然模拟器可以看到,真机看不到,那么官方必然做了某些限制,开始各种找资料
看了一篇大佬写的 flutter 视图渲染流程 RendererBinding 主要负责的是视图渲染相关的,跑去看看官方
RendererBinding api 有什么重要的内容,发现一个 api

setSemanticsEnabled(bool enabled) → void
Whether the render tree associated with this binding should produce a tree of SemanticsNode objects.

感觉很靠谱去官方源码里面一阵乱看,搜到了一段源码,inspector is enabled on the simulator 感觉好像找到了原因。

#if TARGET_OS_SIMULATOR
  // There doesn't appear to be any way to determine whether the accessibility
  // inspector is enabled on the simulator. We conservatively always turn on the
  // accessibility bridge in the simulator, but never assistive technology.
  platformView->SetSemanticsEnabled(true);
  platformView->SetAccessibilityFeatures(flags);
#else
  bool enabled = UIAccessibilityIsVoiceOverRunning() || UIAccessibilityIsSwitchControlRunning();
  if (enabled)
    flags |= static_cast<int32_t>(flutter::AccessibilityFeatureFlag::kAccessibleNavigation);
  platformView->SetSemanticsEnabled(enabled || UIAccessibilityIsSpeakScreenEnabled());
  platformView->SetAccessibilityFeatures(flags);
#endif

https://github.com/flutter/engine/blob/0c504da039beb48105bdd336335ab146d6ddd59f/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm#L1053

如果是模拟器,默认开启 inspector,真机则需要需要开启 UIAccessibilityIsVoiceOverRunning() 或者 UIAccessibilityIsSwitchControlRunning() 方法

https://developer.apple.com/documentation/uikit/1615187-uiaccessibilityisvoiceoverrunnin

意思是需要真机开启手机的 VoiceOver 读屏功能才会开启元素树展示,试一下
通用->辅助功能->语音 开启

再来看下真机 App 到此元素终于能出来,元素终于出来了,打包一个 release 也看下,依然能识别, flutter app 和 混合 app 用 XCUITest 测试好像有救了啦,过程比较艰辛,结果确如此简单😤

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

好的,非常感谢👍

tigerwu 回复

找找研发看这个元素哪里设置了,应该是可以取消的,或者找下元素的上层父级看看有没有遮盖层什么的。

YueChen 回复

这种问题,需要研发怎么调整才能解决啊?

tigerwu 回复

找到原因了,这个元素可以找到,但是 visible=false,估计这个导致点击无法跳转的

YueChen 回复


可以找到,点击了没有响应。手机开启读屏模式后,需要先单击后再双击元素才会跳转。是不是这个操作的改变影响到了?

tigerwu 回复

你先试试 Appium 桌面版,使用你元素和拾取类型看看能不能查找到吧

👍 手机开启朗读内容后,可以加载出元素树,但是操作元素时是没有响应的,楼主是怎么 解决的?

强强强,找了一圈还是这里解决了!!

这样确实可以看到视图结构了,经过测试发现大部分都是能正常识别,并能找到并响应点击输入,但还是有个别 Widget 由于写法的不同导致 设置了点击事件 但并不能被识别出来(父 Widget 被识别出来),我给这种无法识别的 Widget 加上了 Key,但是依然无法识别出来。但是 Flutter Driver 可以。。。

YueChen 回复

手机辅助功能 - 朗读内容,开启了 朗读所选项、朗读屏幕 ,混合 APP(native+flutter)还是没有元素树~

太强了,楼主牛逼

谢谢楼主,点个赞

芜湖 回复

👊 👊 👊
能给大家一些帮助就好~~

特地登录来给你点个赞

少策 Appium 的 ios 中 webview 问题 中提及了此贴 11月26日 15:50
ltyd5788 ios XCUIElement 元素定位问题 中提及了此贴 10月22日 16:52

楼主牛逼

YueChen 有谁做 flutter 的自动化的吗?出来聊聊 中提及了此贴 10月22日 10:30
YueChen Appium 做 flutter 自动化测试实践&采坑 中提及了此贴 10月22日 10:22
黑凤梨 回复

用了上述方法之后,就和普通 iOS App 运行没有任何区别了,驱动还是使用 automationName:"XCUITest"

楼主,你好:
不得不佩服您,真的是太牛了。
小弟再请教您,如果用 java 脚本如何调用起来 flutter 的 app 呢? 我本地调用一直报错。

YueChen 回复

嗯,我现在默认还是使用 androiddriver,ui2server 太容易被手机的管家或者手机系统 kill 掉。

chenyouan 回复

安卓不需要 ,用 UiAutomator1 驱动操作基本没啥问题,UiAutomator2 可能部分会找不到

楼主你为何如此 NB

仅楼主可见
chenyouan 回复

如果想用 XCUITest 测试,要么改官方源码默认开启 inspector 重新编译,要么在自己 App 源码里手动
RendererBinding.instance.setSemanticsEnabled(true); 如果都不想改开启辅助功能读屏功能。

这么说得话,就是要把手机辅助功能读屏功能打开,才可以做 fluter app 测试

楼主你为何如此 NB

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