运行Flutter Driver测试时如何跳过或授权推送通知提示?
解决Flutter Driver测试中推送授权弹窗导致超时的问题
我之前在做Flutter E2E测试的时候也遇到过这个推送授权弹窗打断测试流程的问题,折腾了好几种方法,这里分享几个亲测有效的解决方案:
方案1:预先通过命令行给测试设备授权(推荐用于CI/CD流水线)
这个方法最直接,在启动Flutter Driver测试前,用系统命令给模拟器/真机预先授予推送权限,从根源上避免弹窗出现。
针对iOS模拟器
先确认你的测试设备名称(比如你用的"iPhone 11")和App的Bundle ID,然后执行以下命令:
# 授予推送权限 xcrun simctl privacy "iPhone 11" grant com.apple.privacy.notifications your.app.bundle.id
如果需要测试拒绝授权的场景,可把grant换成revoke来撤销权限。
针对Android设备
用adb命令直接给App开启通知权限:
adb shell appops set your.app.bundle.id POST_NOTIFICATIONS allow
方案2:在测试代码中模拟用户授权操作
如果你需要测试用户授权推送的完整流程,可借助Flutter Driver的原生元素操作能力来处理弹窗。注意系统弹窗属于原生控件,需要用nativeDriver相关API:
import 'package:flutter_driver/flutter_driver.dart'; void main() { group('Smoke Test Suite', () { FlutterDriver? driver; setUpAll(() async { driver = await FlutterDriver.connect(); // 等待推送授权弹窗出现(根据系统语言调整按钮文本,英文环境用"Allow") await driver.waitForNativeElement(find.text('允许'), timeout: const Duration(seconds: 5)); // 点击"允许"按钮完成授权 await driver.tapNativeElement(find.text('允许')); }); test('Smoke test flow', () async { // 你的测试逻辑... }); tearDownAll(() async { await driver?.close(); }); }); }
方案3:在测试环境禁用推送权限请求
如果你的E2E测试不需要验证推送功能,可以通过环境变量在Flutter代码中跳过权限请求:
1. 修改Flutter初始化代码
在App的入口或推送初始化处添加环境判断:
void main() { // 通过dart-define传入测试环境标识 const isTestEnv = bool.fromEnvironment('IS_TEST_ENV'); runApp(MyApp(isTestEnvironment: isTestEnv)); } // 推送初始化逻辑 void initPushNotifications(bool isTestEnv) async { if (!isTestEnv) { // 仅在非测试环境请求推送权限 await FirebaseMessaging.instance.requestPermission(); // 其他推送初始化操作... } }
2. 运行测试时传入环境变量
修改你的Flutter Driver命令,添加--dart-define参数:
flutter drive --flavor=development --dart-define=IS_TEST_ENV=true --target=e2e/instrumented_app.dart --driver=e2e/scenarios/smoke_scenario.dart -d "iPhone 11"
方案4:iOS模拟器启动参数配置(临时测试用)
在Xcode中打开你的测试Scheme,添加启动参数-com.apple.CoreSimulator.NotificationAuthorization YES,这样模拟器启动App时会自动授予推送权限,不会弹出请求弹窗。
内容的提问来源于stack exchange,提问作者Dominik Roszkowski
相关产品推荐
相关产品推荐

