集成测试的颤动位置权限不起作用

flutter location permission from integration test not working

我正在尝试为我的位置应用编写 integration_test。我需要获得 integration_test.

的位置许可

我在 windows 环境变量中设置了 ANDROID_SDK_ROOT。我已经从命令提示符和 Android Studio 终端进行了测试,两者都显示正常。 https://i.ibb.co/4gDPs3Z/echo-android-sdk-root.jpg

不幸的是,我从 Platform.environment 得到 ANDROID_SDK_ROOTnull。我附上了屏幕截图 https://i.ibb.co/t2Y3fBc/android-sdk-root-not-found.jpg

如果我将 envVars 硬编码到我的 windows 机器的 android 位置 C:/Users/User/AppData/Local/Android/Sdk/platform-tools/adb.exe,那么它会抛出错误

No such file or directory Command: C:/Users/User/AppData/Local/Android/Sdk/platform-tools/adb.exe shell pm grant com.dealerapp.mlink android.permission.ACCESS_COARSE_LOCATION

下面是我的源代码

Future<void> grantLocationPermission() async{

    final Map<String, String> envVars = Platform.environment;
    print('evnVars = $envVars');
    print('ANDROID_SDK_ROOT = ${envVars['ANDROID_SDK_ROOT']}');
    final String adbPath = envVars['ANDROID_SDK_ROOT']! + '/platform-tools/adb.exe';
    
    await Process.run(adbPath, [
      'shell',
      'pm',
      'grant',
      'com.abcd.efgh', //my app package
      'android.permission.ACCESS_COARSE_LOCATION'
    ]);
    await Process.run(adbPath, [
      'shell',
      'pm',
      'grant',
      'com.abcd.efgh', //my app package
      'android.permission.ACCESS_FINE_LOCATION'
    ]);
    await integrationDriver();
}

我们将不胜感激任何建议。提前致谢。

这是行不通的,因为 envVars 会给你执行它的系统的环境变量。由于您是在模拟器中执行,因此平台是 Android [print(Platform.isAndroid) 并查看] 此外,如果您调试,您将看到未设置环境变量。

您可能已经想到,集成测试无法与本机弹出窗口交互。因此,以下是我找到的解决此问题的唯一方法

  1. 有试驾者:我只能按照以下步骤解决问题
  • 创建文件夹“test_driver”
  • 添加文件“integration_test_driver.dart”
  • 在文件中添加以下内容
Future<void> main() async {
  await Process.run(
   'adb',
   [
     'shell',
     'pm',
     'grant',
     'com.example.<your app name>', // TODO: Update this
     'android.permission.ACCESS_COARSE_LOCATION'
   ],
 );
 // TODO: Add more permissions as required
 await integrationDriver();
}
  • 创建文件夹“integration_test”
  • 添加文件“app_test.dart”并在此处添加测试
  • 运行 使用命令
    进行测试 flutter drive --driver=test_driver/integration_test_driver.dart --target=integration_test/app_test.dart
  • 你只需要这样做一次,之后 运行 直接从测试资源管理器进行的测试将不会显示 pop
  • 要再次显示对话框,请在终端中使用以下命令撤销权限
    adb shell pm revoke com.example.aries_fe android.permission.ACCESS_COARSE_LOCATION
  1. 粗暴的方式(不建议)
    1. 找到可以在弹出窗口中看到要单击的选项的 x,y 坐标
    2. 在测试中调用 tester.tapAt(const Offset(x,y))

备注:

  • 下面几行的脚本不起作用。我想知道为什么这不起作用。将对此进行进一步调查。
adb shell pm grant com.example.<your app name> android.permission.ACCESS_COARSE_LOCATION 
flutter test integration_test/login_test.dart
  • setUpApp()也不行。