如何使用 Appium 启用/禁用应用程序权限?

Posted

技术标签:

【中文标题】如何使用 Appium 启用/禁用应用程序权限?【英文标题】:How to enable/disable app permission using Appium? 【发布时间】:2019-02-11 06:58:17 【问题描述】:

我的应用需要多应用权限。我需要通过允许或拒绝不同的权限来检查我的应用程序的行为。如何从 appium 启用/禁用应用程序权限以创建多个场景?

例如,假设我的应用需要权限:permission1permission2

scenario 1 = allow permission1 allow permission2

scenario 2 = allow permission1 deny permission2

scenario 3 = deny permission1 allow permission2

scenario 4 = deny permission1 deny permission2

【问题讨论】:

我认为您可以通过打开“设置”应用来授予或允许权限... 有没有办法使用appium做到这一点? 据我了解,appium 没有直接验证权限的方法,您能否详细说明您必须测试什么样的权限意味着 2-3 个权限示例? 我需要为应用授予相机和位置权限 如果你想运行 adb 命令,你可以使用 adb shell pm grant android.permission.CAMERA adb shell pm grant android.permission.ACCESS_FINE_LOCATION 权限可以在这里找到androiddoc.qiniudn.com/preview/features/… 【参考方案1】:

以上答案并没有解决我的问题。我通过使用“autoGrantPermissions”的上限解决了这个问题。

设置:

desired_caps['autoGrantPermissions'] = True

您必须将 noReset 上限禁用为 False,否则它将不起作用。 请参阅此处的参考: http://appium.io/docs/en/writing-running-appium/caps/

【讨论】:

设置autoGrantPermissions=true 将始终授予权限,我需要检查不授予权限的条件,即拒绝权限检查应用程序行为 我做了这个但仍然显示弹出窗口,即使我交叉检查了 noReset 设置为 False 。我在这里错过了什么?【参考方案2】:

在启动/初始化 appium 驱动程序之前,只需通过如下 adb 命令为相应的应用程序授予所有必需的权限,这样就不会显示 ALLOW 弹出窗口:

        adb -s yourDeviceSerialNumber shell pm grant your.app.packagename android.permission.READ_EXTERNAL_STORAGE
        adb -s yourDeviceSerialNumber shell pm grant your.app.packagename android.permission.WRITE_EXTERNAL_STORAGE
        adb -s yourDeviceSerialNumber shell pm grant your.app.packagename android.permission.ACCESS_FINE_LOCATION
        adb -s yourDeviceSerialNumber shell pm grant your.app.packagename android.permission.CAMERA
        adb -s yourDeviceSerialNumber shell pm grant your.app.packagename android.permission.READ_CONTACTS

您可以通过 android 的自动化代码调用这些

appium 有授予权限的功能:autoGrantPermissions Appium 会自动确定您的应用程序需要哪些权限,并在安装时将它们授予应用程序。默认为假。如果 noReset 为 true,则此功能不起作用。

http://appium.io/docs/en/writing-running-appium/caps/

【讨论】:

【参考方案3】:

一种解决方案是转到“设置”应用并在其中自动化场景。您可以通过提供捆绑 ID 转到设置应用程序(实际上是任何 ios 系统应用程序)。对于设置应用,它是 com.apple.Preferences

我正在使用 ruby​​,但其他客户的想法可能类似。

def launch_settings_app
    @driver.execute_script('mobile: launchApp', 'bundleId': "com.apple.Preferences");
end

您可以在此处找到其他捆绑包 ID https://emm.how/t/ios-11-list-of-default-apps-and-bundle-id-s/465 或使用命令行 - 这将返回设备上所有已安装应用程序的捆绑包 ID: ideviceinstaller -u device_udid -l

【讨论】:

【参考方案4】:

根据您的需要,您无法从capabilities 控制权限对话框,因此您应该使用:

//for allow button
driver.findElement(By.id("com.android.packageinstaller:id/permission_allow_button")).click();
//or
driver.findElement(By.xpath("//*[@text='ALLOW']")).click();

//For deny button
driver.findElement(By.id("com.android.packageinstaller:id/permission_deny_button")).click();
//or
driver.findElement(By.xpath("//*[@text='DENY']")).click();

【讨论】:

这不是解决方案,因为一旦您接受权限,该权限将不可见。我找到了使用 adb shell 命令的解决方案。【参考方案5】:

您应该正确调用应用程序包和应用程序功能......所以当您使用您的应用程序时,然后将包和活动设置为您的应用程序,当android活动来时,调用原生android的包和活动。 ..还请务必在完成权限后将包和活动设置为您的应用程序...请在下面找到代码:

public static void main(String[] args) throws MalformedURLException 
    // TODO Auto-generated method stub

    File f=new File("src");
    File fs=new File(f,"app-debug.apk");

    DesiredCapabilities cap=new DesiredCapabilities();
    cap.setCapability(MobileCapabilityType.DEVICE_NAME, "emulator-5554");
    cap.setCapability(MobileCapabilityType.APP, fs.getAbsolutePath());

    cap.setCapability("appPackage", "yourAppPackageName");
    cap.setCapability("appActivity", "yourAppActivityName");

    AndroidDriver<AndroidElement> driver=new AndroidDriver<AndroidElement>(new URL("http://127.0.0.1:4723/wd/hub"),cap);
    cap.setCapability("appPackage", "com.google.android.packageinstaller");
    cap.setCapability("appActivity", "com.android.packageinstaller.permission.ui.GrantPermissionsActivity");
    driver.findElementById("com.android.packageinstaller:id/permission_allow_button").click();

【讨论】:

【参考方案6】:

我使用 adb shell 命令找到了适用于 android 的解决方案。

 String packageName= ((AndroidDriver) driver).getCurrentPackage();
 String grantCameraPermission= "adb shell pm grant " + packageName +" android.permission.CAMERA";
 String grantLocationPermission= "adb shell pm grant " + packageName +" android.permission.ACCESS_FINE_LOCATION";
 String revokeCameraPermission= "adb shell pm revoke " + packageName +" android.permission.CAMERA";
 String revokeLocationPermission= "adb shell pm revoke " + packageName +" android.permission.ACCESS_FINE_LOCATION";
        try 
            Runtime.getRuntime().exec(grantCameraPermission);
            Runtime.getRuntime().exec(revokeLocationPermission);

         catch (IOException e) 
            e.printStackTrace();
        

这里是Android Permission的列表

【讨论】:

应该认为:String revokeCameraPermission="adb shell pm revoke" + packageName +" android.permission.CAMERA"; String revokeLocationPermission= "adb shell pm revoke" + packageName +" android.permission.ACCESS_FINE_LOCATION";【参考方案7】:

对于那些刚开始使用 appium 和 python,并且想知道如何添加此功能的人,我的 conftest.py 文件如下所示:

我的版本:Python 3.9 Appium:1.21.0 pytest:6.2.4

capabilities = 
  "platformName": "Android",
  "platformVersion": "11.0",
  "deviceName": "emulator-5554",
  "automationName": "Appium",
  "app": r"C:\Project\app-universal-release.apk",
  **'autoGrantPermissions':'true'**

这对我有用,而我正在开发一个积极的场景测试。这不适用于负面测试。为此,能力必须不具备上述条件。

结果:

所有弹窗要求(权限)都已经给出。

常见的有:位置、文件夹、相机等

【讨论】:

以上是关于如何使用 Appium 启用/禁用应用程序权限?的主要内容,如果未能解决你的问题,请参考以下文章

如何用脚本实时启用、禁用网卡

如何设置文档库的权限以启用文件-> 仅在 sharepoint 2013 中的新选项

如何在 Appium 中为 iOS 自动化启用和使用 WebView

安卓appium无线调试

如何在源代码中禁用/启用 android 接收器?

用于禁用/启用触发所有的 Postgresql 权限