Как отклонить/принять всплывающее окно местоположения устройства на устройствах Android — Selenium со стеком браузера

#java #android #selenium #browserstack

Вопрос:

Я застрял с этой проблемой в последние несколько дней. Может ли кто-нибудь, пожалуйста, помочь или дать некоторое представление о том, как этого можно достичь.

Что/где я выступаю:

  1. Браузер: Chrome
  2. Устройство: Samsung Galaxy S20
  3. Удаленный: Стек браузера
  4. Тест: Selenium с подключением Java к стеку браузера

Я перепробовал множество способов отключить всплывающее окно «Местоположение», появляющееся при переходе по URL-адресу, но каждый раз Selenium tests даже не отклоняет и не распознает это предупреждение. Ниже приведено изображение всплывающего окна с указанием местоположения устройства, которое я получаю при навигации:

введите описание изображения здесь

Код, который я пробовал:

Возможности:

     caps.setCapability("os_version", "10.0");
    caps.setCapability("device", "Samsung Galaxy S20");
    caps.setCapability("realMobile", "true");
    caps.setCapability("browser", "Chrome");
    caps.setCapability("browserstack.debug", "true");
    caps.setCapability("browserstack.console", "errors");
    caps.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.ACCEPT);
    caps.setCapability("name", scenario);
 

Я видел во многих местах добавление «Автогрантий». Пробовал и это, но ничего не вышло

 caps.setCapability("autoGrantPermissions", "true");
 

Я пробовал обычное переключение на предупреждение и отклонение его или принятие, но это тоже не работает. Выдает «Такого Предупреждения Нет».

 driver.switchTo().alert().dismiss(); 
 

Я подумал, может быть, это может сработать, если добавить профиль, но он, похоже, тоже не обнаруживается, и всплывающее окно всегда остается

 ChromeOptions options = new ChromeOptions();
Map < String, Object > prefs = new HashMap < String, Object > ();
Map < String, Object > profile = new HashMap < String, Object > ();
Map < String, Object > contentSettings = new HashMap < String, Object > ();

contentSettings.put("geolocation", 1);
profile.put("managed_default_content_settings", contentSettings);
prefs.put("profile", profile);
options.setExperimentalOption("prefs", prefs);

caps.setCapability(ChromeOptions.CAPABILITY, options);
//... other capabilities
 

Ответ №1:

Предупреждение запускается JS на веб-странице, но отображается в NATIVE_APP контексте. Любое предупреждение, которое не является частью веб-страницы, обычно отображается в СОБСТВЕННОМ контексте.

Это предупреждение должно обрабатываться через Appium, как указано здесь:

https://www.browserstack.com/docs/automate/selenium/handle-permission-pop-ups#handle-know-your-location-pop-up

 driver.switch_to.context('NATIVE_APP')
driver.find_element_by_xpath(".//android.widget.Button[@text='Allow']").click()
time.sleep(2)
 

Комментарии:

1. Привет, Шон, спасибо. Я попытался использовать «driver.switchTo().context ()», но, похоже, «context()» отсутствует в Java для switchTo(). Не могли бы вы, пожалуйста, дать некоторое представление о том, как этого можно достичь? Это «AndroidDriver» или «Удаленная река» ?

2. Я понял. Спасибо, Шон. Принял ваш ответ