android - 来自集成测试的 flutter 位置权限不起作用

标签 android flutter integration-testing android-permissions

我正在尝试写 integration_test对于我的位置应用程序。我需要允许来自我的 integration_test 的位置许可。
我设置了ANDROID_SDK_ROOT在我的 Windows 环境变量中。我已经从命令提示符和 Android Studio 终端进行了测试,两者都显示良好。 https://i.ibb.co/4gDPs3Z/echo-android-sdk-root.jpg
不幸的是,我收到了 ANDROID_SDK_ROOT值(value) null来自 Platform.environment .我已附上屏幕截图 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)看看]
此外,如果您调试,您将看到未设置环境变量。
正如您可能已经想到的那样,集成测试无法与原生弹出窗口交互。所以以下是我发现解决这个问题的唯一方法

  • 有一个测试驱动程序:我只能使用
  • 下面的步骤来解决问题
  • 创建文件夹“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
  • 您只需执行一次,之后直接从测试资源管理器运行测试将不会显示弹出
  • 要再次显示对话框,请在终端中使用以下命令撤销权限adb shell pm revoke com.example.aries_fe android.permission.ACCESS_COARSE_LOCATION
  • 粗暴方式(不建议)
  • 找到 x,y 坐标,您可以在其中看到要单击的选项弹出
  • 调用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()也不起作用。
  • 关于android - 来自集成测试的 flutter 位置权限不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71597057/

    相关文章:

    ios - 适用于 iOS 12.1 的 flutter : black screen instead of an app

    firebase - 我如何解决 zsh : command not found: flutterfire in macOS?

    docker - 柑橘框架:如何等待容器健康?

    java - 上下移动圆形 float 操作按钮以避免被 snackbar 阻挡

    class - Dart:基于 JSON 响应创建动态类

    android - 后台服务在 Android Marshmallow 6.0+ 设备上停止

    reactjs - ASP.Net Core React spa 集成测试

    java - 无法在 Controller Spring-boot 中测试需要身份验证的方法

    android - 从 WebView 保存数据

    java - Android File.exists() 始终为 true