如何使用 Appium enable/disable 应用权限?
How to enable/disable app permission using Appium?
我的应用需要多应用权限。我需要通过允许或拒绝不同的权限来检查我的应用程序的行为方式。我如何 enable/disable appium 的应用程序权限来创建多个场景?
例如,假设我的应用需要权限:permission1
和 permission2
。
scenario 1 = allow permission1 allow permission2
scenario 2 = allow permission1 deny permission2
scenario 3 = deny permission1 allow permission2
scenario 4 = deny permission1 deny permission2
一种解决方案是转到“设置”应用并自动执行其中的场景。您可以通过提供捆绑包 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
或者使用命令行 - 这将为您设备上所有已安装的应用程序提供 return 捆绑 ID:
ideviceinstaller -u device_udid -l
根据您的需要,您无法从 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();
您应该正确调用应用程序包和应用程序功能...因此,当您使用您的应用程序时,请将程序包和 activity 设置为您的应用程序,当 android activity 来了,为原生 android 调用包和 activity...在完成权限后,还要确保将包和 activity 设置到您的应用程序...请在下面找到代码:
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();
I found the solution for android using adb shell command.
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();
}
的列表
在你 launch/initialise 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 为真,则此功能不起作用。
以上回答没有解决我的问题。我通过使用“autoGrantPermissions”的大写字母解决了这个问题。
设置:
desired_caps['autoGrantPermissions'] = 真
您必须将 noReset 上限禁用为 False,否则它将不起作用。
请参阅此处的参考资料:
http://appium.io/docs/en/writing-running-appium/caps/
对于那些刚开始使用 appium 和 python 并且想知道如何添加此功能的人,这是我的 conftest.py 文件的样子:
我的版本:Python 3.9
Appium:1.21.0
测试:6.2.4
capabilities = {
"platformName": "Android",
"platformVersion": "11.0",
"deviceName": "emulator-5554",
"automationName": "Appium",
"app": r"C:\Project\app-universal-release.apk",
**'autoGrantPermissions':'true'**
}
当我正在开发一个积极的场景测试时,这对我有用。这不是用于负面测试。为此,能力不能有以上。
结果:
所有弹出窗口要求(权限)都已提供。
常见的有:位置、文件夹、相机等
我的应用需要多应用权限。我需要通过允许或拒绝不同的权限来检查我的应用程序的行为方式。我如何 enable/disable appium 的应用程序权限来创建多个场景?
例如,假设我的应用需要权限:permission1
和 permission2
。
scenario 1 = allow permission1 allow permission2
scenario 2 = allow permission1 deny permission2
scenario 3 = deny permission1 allow permission2
scenario 4 = deny permission1 deny permission2
一种解决方案是转到“设置”应用并自动执行其中的场景。您可以通过提供捆绑包 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 或者使用命令行 - 这将为您设备上所有已安装的应用程序提供 return 捆绑 ID: ideviceinstaller -u device_udid -l
根据您的需要,您无法从 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();
您应该正确调用应用程序包和应用程序功能...因此,当您使用您的应用程序时,请将程序包和 activity 设置为您的应用程序,当 android activity 来了,为原生 android 调用包和 activity...在完成权限后,还要确保将包和 activity 设置到您的应用程序...请在下面找到代码:
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();
I found the solution for android using adb shell command.
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();
}
的列表
在你 launch/initialise 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 为真,则此功能不起作用。
以上回答没有解决我的问题。我通过使用“autoGrantPermissions”的大写字母解决了这个问题。
设置:
desired_caps['autoGrantPermissions'] = 真
您必须将 noReset 上限禁用为 False,否则它将不起作用。 请参阅此处的参考资料: http://appium.io/docs/en/writing-running-appium/caps/
对于那些刚开始使用 appium 和 python 并且想知道如何添加此功能的人,这是我的 conftest.py 文件的样子:
我的版本:Python 3.9 Appium:1.21.0 测试:6.2.4
capabilities = {
"platformName": "Android",
"platformVersion": "11.0",
"deviceName": "emulator-5554",
"automationName": "Appium",
"app": r"C:\Project\app-universal-release.apk",
**'autoGrantPermissions':'true'**
}
当我正在开发一个积极的场景测试时,这对我有用。这不是用于负面测试。为此,能力不能有以上。
结果:
所有弹出窗口要求(权限)都已提供。
常见的有:位置、文件夹、相机等