如何对原生安卓+Flutter混合开发的安卓App使用Appium进行自动化测试
混合原生Android+Flutter应用Appium自动化测试适配方案
问题根因
你当前使用的UIAutomator2驱动仅能解析安卓系统原生视图树,而Flutter 1.22.6默认基于Skia引擎自主渲染UI,不会将元素信息同步到原生视图树,因此Flutter页面会被识别为单个不可拆分的View组,无法定位元素、触发交互。
可行适配方案
方案一:Appium Flutter Driver 双上下文切换方案(优先推荐,兼容现有技术栈)
该方案无需重写你原有原生侧的自动化测试代码,仅需做少量补充即可同时覆盖原生、Flutter两侧场景:
- 首先修改Flutter项目配置:
- 在
main.dart入口文件中,为测试包开启语义树:
所有需要定位的Flutter组件统一添加void main() { runApp(MyApp()); SemanticsBinding.instance.ensureSemantics(); }Key属性,Key值作为后续元素定位的唯一标识符 - 打包测试用APK时使用
debug或profile模式,Flutter 1.22.6的release模式会强制关闭语义树,无法识别元素
- 在
- Appium + WebdriverIO 侧配置:
- 启动会话时配置参数:
automationName: 'Flutter',其余appPackage、appActivity等原生配置保留不变 - 操作原生页面时,切换到
NATIVE_APP上下文,直接沿用你现有UIAutomator2的定位、交互逻辑 - 操作Flutter页面时,切换到
FLUTTER上下文,使用Flutter专属定位语法即可,示例:- 按Key定位元素:
const ele = await driver.$('flutter=Key("your_key_name")') - 触发输入:
await ele.addValue('测试内容') - 点击操作:
await ele.click()
- 按Key定位元素:
- 启动会话时配置参数:
方案二:原生视图桥接方案(无需修改自动化测试逻辑)
如果Flutter侧交互场景少,不想调整现有自动化代码,可以选择该方案:
- 在Flutter 1.22.6中使用
AndroidView组件将需要交互的Flutter UI封装为原生视图,自动暴露到安卓系统视图树,UIAutomator2可直接识别,原有原生侧的定位逻辑无需任何修改 - 缺点:会增加Flutter侧渲染开销,复杂页面会出现卡顿,仅适合Flutter模块占比低的场景
版本适配注意事项(针对Flutter 1.22.6)
- Appium Flutter Driver需使用1.8.x版本,过高版本会与Flutter 1.22.6的语义树协议不兼容,导致元素识别失败
- Flutter上下文下不要使用原生
sendKeys方法输入文本,直接调用元素的addValue方法即可避免输入失效问题 - 不要开启Flutter的页面过渡动画,会导致元素识别延迟,测试前可在Flutter入口配置
debugDisableTransitionAnimations = true
内容的提问来源于stack exchange,提问作者Manish Patel
相关产品推荐
相关产品推荐

