#java #android #selenium #selenium-webdriver #appium
#java #Android #selenium #selenium-webdriver #appium
Вопрос:
Я не могу нажать кнопки Запретить или разрешить в диалоговом окне разрешений в Android с использованием Appium Java. Нужно ли мне добавлять какие-либо возможности, прежде чем нажимать на эти кнопки? Ниже приведен код:
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("deviceName", "ASUS_Z00LD");
capabilities.setCapability("platformVersion", "6.0");
capabilities.setCapability("app","<AppPath>");
capabilities.setCapability("browserName", "");
AndroidDriver<MobileElement> driver = new AndroidDriver<MobileElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
Thread.sleep(10000);
driver.findElement(MobileBy.id("permission_allow_button")).click();
Ниже приведена ошибка в консоли Eclipse:
org.openqa.selenium.NoSuchElementException: An element could not be located on the page using the given search parameters. (WARNING: The server did not provide any stacktrace information)
Ниже приведен журнал Appium:
info: [debug] Responding to client with success: {"status":0,"value":{"platform":"LINUX","browserName":"","platformVersion":"6.0.1","webStorageEnabled":false,"takesScreenshot":true,"javascriptEnabled":true,"databaseEnabled":false,"networkConnectionEnabled":true,"locationContextEnabled":false,"warnings":{},"desired":{"app":"/Users/Shiva/Documents/workspace/AndroidPractice/APK/****_Android.apk","browserName":"","platformName":"Android","deviceName":"ASUS_Z00LD","platformVersion":"6.0"},"app":"/Users/Shiva/Documents/workspace/AndroidPractice/APK/****_Android.apk","platformName":"Android","deviceName":"FAAZCY127084"},"sessionId":"b64fd5af-3de5-4299-a2d4-1948fc8e883e"}
info: <-- GET /wd/hub/session/b64fd5af-3de5-4299-a2d4-1948fc8e883e 200 1.534 ms - 625 {"status":0,"value":{"platform":"LINUX","browserName":"","platformVersion":"6.0.1","webStorageEnabled":false,"takesScreenshot":true,"javascriptEnabled":true,"databaseEnabled":false,"networkConnectionEnabled":true,"locationContextEnabled":false,"warnings":{},"desired":{"app":"/Users/Shiva/Documents/workspace/AndroidPractice/APK/****_Android.apk","browserName":"","platformName":"Android","deviceName":"ASUS_Z00LD","platformVersion":"6.0"},"app":"/Users/Shiva/Documents/workspace/AndroidPractice/APK/****_Android.apk","platformName":"Android","deviceName":"FAAZCY127084"},"sessionId":"b64fd5af-3de5-4299-a2d4-1948fc8e883e"}
info: --> POST /wd/hub/session/b64fd5af-3de5-4299-a2d4-1948fc8e883e/element {"using":"id","value":"permission_allow_button"}
info: [debug] Waiting up to 0ms for condition
info: [debug] Pushing command to appium work queue: ["find",{"strategy":"id","selector":"permission_allow_button","context":"","multiple":false}]
info: [debug] [BOOTSTRAP] [debug] Got data from client: {"cmd":"action","action":"find","params":{"strategy":"id","selector":"permission_allow_button","context":"","multiple":false}}
info: [debug] [BOOTSTRAP] [debug] Got command of type ACTION
info: [debug] [BOOTSTRAP] [debug] Got command action: find
info: [debug] [BOOTSTRAP] [debug] Finding permission_allow_button using ID with the contextId: multiple: false
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[INSTANCE=0, RESOURCE_ID=com.****.****:id/permission_allow_button]
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[INSTANCE=0, RESOURCE_ID=android:id/permission_allow_button]
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[DESCRIPTION=permission_allow_button, INSTANCE=0]
info: [debug] [BOOTSTRAP] [debug] Failed to locate element. Clearing Accessibility cache and retrying.
info: [debug] [BOOTSTRAP] [debug] Finding permission_allow_button using ID with the contextId: multiple: false
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[INSTANCE=0, RESOURCE_ID=com.****.****:id/permission_allow_button]
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[INSTANCE=0, RESOURCE_ID=android:id/permission_allow_button]
info: [debug] [BOOTSTRAP] [debug] Using: UiSelector[DESCRIPTION=permission_allow_button, INSTANCE=0]
info: [debug] [BOOTSTRAP] [debug] Returning result: {"status":7,"value":"No element found"}
info: [debug] Condition unmet after 178ms. Timing out.
info: [debug] Responding to client with error: {"status":7,"value":{"message":"An element could not be located on the page using the given search parameters.","origValue":"No element found"},"sessionId":"b64fd5af-3de5-4299-a2d4-1948fc8e883e"}
info: <-- POST /wd/hub/session/b64fd5af-3de5-4299-a2d4-1948fc8e883e/element 500 181.769 ms - 195
Кто-нибудь поможет преодолеть это, было бы оценено?
Ответ №1:
Используйте полный идентификатор ресурса…У меня это сработало….
приведенная ниже строка сработала для меня …. driver.findElement(MobileBy.id («com.android.packageinstaller: id/ permission_allow_button»)).нажмите ();
Комментарии:
1. Для тех, у кого возникли проблемы с Android Q, идентификатор
com.android.permissioncontroller:id/permission_allow_foreground_only_button
Ответ №2:
С помощью приведенного ниже фрагмента я могу нажать на все кнопки разрешить, чтобы получить разрешения.
while (driver.findElements(MobileBy.xpath("//*[@class='android.widget.Button'][2]")).size()>0) {
driver.findElement(MobileBy.xpath("//*[@class='android.widget.Button'][2]")).click();
}
Ответ №3:
Начиная с appium 1.6.3, вы можете просто добавить:
capabilities.setCapability("autoGrantPermissions", "true");
И вы всегда будете разрешать все разрешения, которые хочет ваше приложение.
Ответ №4:
Appium предоставляет вам API, который определяет активность. В зависимости от вашего устройства вы можете выполнить два действия — имя пакета может быть удалено или нет:
'com.android.packageinstaller.permission.ui.GrantPermissionsActivity',
'.permission.ui.GrantPermissionsActivity'
После обнаружения этого действия вам необходимо найти элемент по локатору (id / xpath):
'com.android.packageinstaller:id/permission_message'
Затем вы можете получить текст этого сообщения, если оно вас интересует. Если вам важно, какое это разрешение, вы можете сопоставить его с ожидаемыми строками или регулярными выражениями. Если нет, вы можете слепо согласиться, найдя и щелкнув элемент по идентификатору:
'com.android.packageinstaller:id/permission_allow_button'
Если вы предпочитаете не нажимать «Разрешить» во всех этих окнах, вы можете использовать adb, чтобы добавить все разрешения сразу перед началом тестирования (но после того, как Appium установит ваше приложение). Если вы знаете все настройки, которые понадобятся вашему приложению, вы можете добавить их с помощью одной команды:
pm grant $app_name $space_delimited_set_of_perms
Или вы можете добавлять все разрешения по одному, что занимает 1,5-2 секунды за попытку.
Ссылка:https://discuss.appium.io/t/android-m-and-permissions/5760/13
Комментарии:
1. Спасибо за быстрый ответ. Я пробовал это раньше, но у меня не получилось. Это причина для публикации вопроса в SO. Но я не пробовал ‘pm grant $ app_name $ space_delimited_set_of_perms’ . Не могли бы вы рассказать, что я должен в ‘$ space_delimited_set_of_perms’. Спасибо
2. Вы можете предоставить разрешение своему приложению с помощью простой команды adb (в кавычках — игнорировать кавычки), «adb shell pm предоставляет com.name.app android.permission. READ_PROFILE», название приложения вы можете ввести идентификатор пакета вашего тестируемого приложения
3. Я добавил следующие строки к своему существующему коду. Но безуспешно. Не могли бы вы взглянуть на это один раз и сообщить мне, если я делаю неправильно. ProcessBuilder builder = новый ProcessBuilder («/bin/bash», «-c», «/ usr / local /bin / adb shell pm предоставляет <МОЙ ПАКЕТ ПРИЛОЖЕНИЙ> android.разрешение. READ_PROFILE»); builder.redirectErrorStream(true); builder.start();
4. 1. Этот код должен работать после установки приложения. 2. Действие с разрешениями, о котором я упоминал, было примером, вы должны использовать разрешение, соответствующее вашей цели, вы можете проверить список действий с разрешениями на этой странице developer.android.com/guide/topics/security/permissions.html
Ответ №5:
Я перепробовал много решений, прежде чем нашел исправление. Я включил функцию Touch ball / quick ball, и значок всегда оставался на экране, чтобы помочь мне ориентироваться.
Это приложение было виновником, у которого была включена функция наложения, и было нелегко понять это, просматривая активные приложения в установленных приложениях.
Примечание: У меня был MIUI 11 с Android 7 для Redmi Note 4.