Моему приложению требуется разрешение на несколько приложений. Мне нужно проверить, как мое приложение ведет себя, разрешая или запрещая другое разрешение. Как я могу включить / отключить разрешение приложения из 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
Есть ли способ сделать это с помощью appium?
Насколько я понимаю, у appium нет прямого метода проверки разрешений, можете ли вы подробнее рассказать, какое разрешение у вас есть для тестирования, означает 2-3 примера разрешений?
Мне нужно предоставить приложению разрешение на камеру и местоположение
@Amit есть ли способ открыть определенную настройку приложения с помощью appium?
Если вы перейдете в Настройки> Приложение> Приложение в разделе Тест (например, Калькулятор)> Информация о приложении> Разрешение - здесь будут перечислены все разрешения приложения, отсюда вы можете предоставить или отозвать любое разрешение, специфичное для приложения.
Позвольте нам продолжить обсуждение в чате.
Если вы хотите запустить команду adb, вы можете использовать adb shell pm grant <appPackageName> android.permission.CAMERA adb shell pm grant <appPackageName> android.permission.ACCESS_FINE_LOCATION Разрешения можно найти здесь androiddoc.qiniudn.com/preview/features/…
Спасибо @Amit, попробую.
Одним из решений было бы перейти в приложение «Настройки» и автоматизировать сценарий внутри него. Вы можете перейти в приложение «Настройки» (фактически, в любое системное приложение iOS), указав идентификатор пакета. Для приложения настроек это com.apple.Preferences
Я использую рубин, но идея может быть аналогичной для других клиентов.
def launch_settings_app
@driver.execute_script('mobile: launchApp', {'bundleId': "com.apple.Preferences"});
end
Вы можете найти другие идентификаторы пакетов здесь https://emm.how/t/ios-11-list-of-default-apps-and-bundle-id-s/465 Или с помощью командной строки - это вернет идентификаторы пакетов для всех установленных приложений на вашем устройстве: 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();
Это не решение, поскольку разрешение не будет отображаться, как только вы его примете. Я нашел решение сделать это с помощью команды оболочки adb.
Вы должны правильно вызвать пакет приложения и возможности приложения ... Итак, когда вы работаете со своим приложением, затем установите пакет и действие для своего приложения, когда появится активность 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();
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();
}
Вот список Разрешение Android
Следует подумать: String revokeCameraPermission = "adb shell pm revoke" + packageName + "android.permission.CAMERA"; Строка revokeLocationPermission = "adb shell pm revoke" + packageName + "android.permission.ACCESS_FINE_LOCATION";
Перед запуском / инициализацией драйвера 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 автоматически определяет, какие разрешения требуются вашему приложению, и предоставляет их приложению при установке. По умолчанию false. Если noReset истинно, эта возможность не работает.
Приведенные выше ответы не решили мою проблему. Я решил эту проблему, используя колпачки «autoGrantPermissions».
Настраивать:
желаемый_caps ['autoGrantPermissions'] = Истина
Вам придется отключить колпачки noReset на False, иначе это не сработает. См. Ссылку здесь: http://appium.io/docs/en/writing-running-appium/caps/
настройка autoGrantPermissions=true
всегда будет предоставлять разрешение, мне нужно проверить условие отказа от предоставления разрешения, т.е. отклонить поведение приложения проверки разрешений
Я сделал это, но всплывающее окно все равно отображается, даже если я проверил, что noReset имеет значение только False. Что мне здесь не хватает?
Для тех, кто только начал работать с 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'**
}
У меня это работает, пока я разрабатываю тест по положительному сценарию. Это не для отрицательного тестирования. Для этого в возможностях не должно быть перечисленных выше.
Результат:
Все требования (разрешения) для всплывающих окон уже будут предоставлены.
Общие из них: местоположение, папка, камера и т. д.
Я думаю, вы можете предоставить или разрешить разрешение, открыв приложение "Настройки" ...