能否用Dart替代Appium+WDIO+Appium Flutter Driver做Flutter应用独立回归测试?
可行方案:用Dart实现Flutter移动端独立自动化测试
完全可以用Dart替代Appium+WDIO的方案,实现不依赖应用源码、仅基于构建包的Flutter移动端自动化测试,以下是两种落地方案:
方案一:基于Flutter Driver的纯Dart测试(推荐,速度快)
这种方案利用Flutter官方的flutter_driver库编写测试代码,测试仓库完全独立,仅依赖打好的应用构建包(需提前在应用中开启Flutter Driver扩展)。
前置要求
你用来测试的APK/IPA必须是开启了Flutter Driver扩展的构建包:
在应用源码(构建包时的源码)的
main.dart中添加扩展初始化代码:void main() { enableFlutterDriverExtension(); // 必须添加这一行 runApp(const MyApp()); }构建debug或profile版本的安装包(release版本默认不支持该扩展,需额外配置)。
搭建独立测试仓库
- 初始化Flutter测试项目:
flutter create flutter_app_auto_tests cd flutter_app_auto_tests - 在
pubspec.yaml中添加依赖:dev_dependencies: flutter_driver: sdk: flutter test: any
编写Dart测试代码
在test_driver目录下创建测试文件(如app_functional_test.dart),示例如下:
import 'package:flutter_driver/flutter_driver.dart'; import 'package:test/test.dart'; import 'package:flutter_driver/src/common/logical_key.dart'; void main() { group('Flutter App 功能测试', () { late FlutterDriver driver; setUpAll(() async { // 连接到已安装在设备上的应用 driver = await FlutterDriver.connect(); }); tearDownAll(() async { await driver.close(); }); test('点击登录按钮并验证跳转', () async { // 通过应用中预设的ValueKey定位元素(需应用开发时给元素设置该key) final loginButton = find.byValueKey('login_btn'); await driver.tap(loginButton); // 等待首页元素出现,验证跳转成功 final homeScreen = find.byValueKey('home_page'); await driver.waitFor(homeScreen); }); test('模拟系统按键操作', () async { // 模拟返回键 await driver.sendKeyEvent(LogicalKeyboardKey.backspace); // 模拟主页键 await driver.sendKeyEvent(LogicalKeyboardKey.home); }); }); }
注意:若应用未给元素设置
ValueKey,也可使用find.text('登录')或find.byType('ElevatedButton')定位,但稳定性不如key定位。
运行测试
- 在模拟器/真机上安装好你的应用构建包;
- 执行测试命令:
flutter drive --target=test_driver/app_functional_test.dart
方案二:Dart结合Appium客户端(兼容原生/Flutter,无需修改应用)
如果你不想依赖Flutter Driver扩展,可直接用Dart版本的Appium客户端库,完全复刻Appium+WDIO的流程,只是将JS测试代码换成Dart,无需修改应用源码,仅依赖构建包。
步骤
- 启动本地或远程Appium服务;
- 在测试仓库中添加Dart的Appium依赖(如
appium_client)到pubspec.yaml; - 编写测试代码连接Appium服务,控制已安装的应用:
import 'package:appium_client/appium_client.dart'; import 'package:appium_client/src/commands/element.dart'; import 'package:test/test.dart'; void main() { late AppiumDriver driver; setUpAll(() async { // 配置设备和应用信息 final capabilities = { 'platformName': 'Android', 'deviceName': 'emulator-5554', 'appPackage': 'com.your.app.package', // 替换为你的应用包名 'appActivity': 'com.your.app.MainActivity', // 替换为启动Activity 'noReset': true // 保留应用状态,避免重复初始化 }; // 连接到Appium服务 driver = await AppiumDriver.connect( Uri.parse('http://localhost:4723/wd/hub'), capabilities, ); }); tearDownAll(() async { await driver.quit(); }); test('点击登录按钮', () async { // 通过元素ID定位(也可用XPath、文本等方式) final loginBtn = await driver.findElement(By.id('login_button')); await loginBtn.click(); }); }
两种方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| Flutter Driver | 测试速度快,元素定位精准 | 需应用构建包开启扩展,依赖元素key设置 |
| Dart+Appium | 无需修改应用,兼容原生/Flutter元素 | 测试速度稍慢,定位稳定性略低 |
内容的提问来源于stack exchange,提问作者Vlad Easy
相关产品推荐
相关产品推荐

