在 Flutter 端到端测试中允许权限对话框?
Allow permission dialog in Flutter end-to-end testing?
在Flutter端到端测试中,测试过程中需要允许一个权限。 driver.tap(find.text("ALLOW")
不起作用。如何点击"ALLOW".
您可以在 运行 测试前授予权限。
import 'dart:io';
import 'package:path/path.dart';
// ...
setUpAll(() async {
final envVars = Platform.environment;
final adbPath = join(
envVars['ANDROID_SDK_ROOT'] ?? envVars['ANDROID_HOME'],
'platform-tools',
Platform.isWindows ? 'adb.exe' : 'adb',
);
await Process.run(adbPath, [
'shell',
'pm',
'grant',
'com.example.yourapp', // replace with your app id
'android.permission.RECORD_AUDIO'
]);
driver = await FlutterDriver.connect();
});
对我来说上面的代码不起作用不知道为什么
然后我尝试使用以下代码及其工作
setUpAll(() async {
await Process.run('add_adb_path/adb.exe' , ['shell' ,'pm', 'grant', 'add_app_package_name', 'android.permission.ACCESS_MEDIA_LOCATION']);
await Process.run('add_adb_path/adb.exe' , ['shell' ,'pm', 'grant', 'add_app_package_name', 'android.permission.READ_EXTERNAL_STORAGE']);
await Process.run('add_adb_path/adb.exe' , ['shell' ,'pm', 'grant', 'add_app_package_name', 'android.permission.WRITE_EXTERNAL_STORAGE']);
driver = await FlutterDriver.connect();
});
如果您使用的是最新的 Flutter Integration Testing,其他答案对您没有帮助,因为我们不需要 FlutterDriver 连接。
所以现在,您需要在我们初始化 integrationDriver()
的 test_driver.dart 文件中添加以下代码
Future<void> main() async {
final Map<String, String> envVars = Platform.environment;
String? adbPath = join(envVars['ANDROID_SDK_ROOT'] ?? envVars['ANDROID_HOME']!,
'platform-tools',
Platform.isWindows ? 'adb.exe' : 'adb',
);
await Process.run(adbPath , ['shell' ,'pm', 'grant', 'com.example', 'android.permission.CAMERA']);
await Process.run(adbPath , ['shell' ,'pm', 'grant', 'com.example', 'android.permission.WRITE_EXTERNAL_STORAGE']);
await integrationDriver();
}
此更改是必需的,因为 FlutterDriver
在您初始化并连接后建立连接,但新的集成测试流程已经有一个连接,因此我们需要在连接发生之前对其进行初始化。
对于 运行 代码,在终端上使用以下命令,如您所见,为了获得更好的结果,我创建了两个文件夹,
test_driver:包含上面提到的驱动程序代码。
integration_test: 包含测试文件。
flutter drive --driver=test_driver/test_driver.dart --target=integration_test/my_test.dart
在Flutter端到端测试中,测试过程中需要允许一个权限。 driver.tap(find.text("ALLOW")
不起作用。如何点击"ALLOW".
您可以在 运行 测试前授予权限。
import 'dart:io';
import 'package:path/path.dart';
// ...
setUpAll(() async {
final envVars = Platform.environment;
final adbPath = join(
envVars['ANDROID_SDK_ROOT'] ?? envVars['ANDROID_HOME'],
'platform-tools',
Platform.isWindows ? 'adb.exe' : 'adb',
);
await Process.run(adbPath, [
'shell',
'pm',
'grant',
'com.example.yourapp', // replace with your app id
'android.permission.RECORD_AUDIO'
]);
driver = await FlutterDriver.connect();
});
对我来说上面的代码不起作用不知道为什么
然后我尝试使用以下代码及其工作
setUpAll(() async {
await Process.run('add_adb_path/adb.exe' , ['shell' ,'pm', 'grant', 'add_app_package_name', 'android.permission.ACCESS_MEDIA_LOCATION']);
await Process.run('add_adb_path/adb.exe' , ['shell' ,'pm', 'grant', 'add_app_package_name', 'android.permission.READ_EXTERNAL_STORAGE']);
await Process.run('add_adb_path/adb.exe' , ['shell' ,'pm', 'grant', 'add_app_package_name', 'android.permission.WRITE_EXTERNAL_STORAGE']);
driver = await FlutterDriver.connect();
});
如果您使用的是最新的 Flutter Integration Testing,其他答案对您没有帮助,因为我们不需要 FlutterDriver 连接。
所以现在,您需要在我们初始化 integrationDriver()
Future<void> main() async {
final Map<String, String> envVars = Platform.environment;
String? adbPath = join(envVars['ANDROID_SDK_ROOT'] ?? envVars['ANDROID_HOME']!,
'platform-tools',
Platform.isWindows ? 'adb.exe' : 'adb',
);
await Process.run(adbPath , ['shell' ,'pm', 'grant', 'com.example', 'android.permission.CAMERA']);
await Process.run(adbPath , ['shell' ,'pm', 'grant', 'com.example', 'android.permission.WRITE_EXTERNAL_STORAGE']);
await integrationDriver();
}
此更改是必需的,因为 FlutterDriver
在您初始化并连接后建立连接,但新的集成测试流程已经有一个连接,因此我们需要在连接发生之前对其进行初始化。
对于 运行 代码,在终端上使用以下命令,如您所见,为了获得更好的结果,我创建了两个文件夹,
test_driver:包含上面提到的驱动程序代码。
integration_test: 包含测试文件。
flutter drive --driver=test_driver/test_driver.dart --target=integration_test/my_test.dart