Как обрабатывать всплывающее окно разрешить/отклонить геолокацию на устройствах Android

#java #selenium-webdriver #appium #saucelabs

Вопрос:

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

Я хотел знать, как обрабатывать всплывающее окно с географическим местоположением на устройствах Android

ниже приведены некоторые детали высокого уровня

  1. Я использую облако Saucelabs для запуска своих сценариев
  2. Я использую браузер Chrome
  3. Android-эмулятор : Samsung Galaxy S8 Plus HD Эмулятор GoogleAPI Android — реальное устройство : Samsung_Galaxy_S10_POC173
  4. Среда тестирования : Selenium, Java, TestNG

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

Сначала я подумал, что это предупреждение, и попытался справиться с переключением на предупреждение

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

Затем я попробовал с профилем, но он отлично работает для Windows, но не для Android

 ChromeOptions options = new ChromeOptions();
DesiredCapabilities caps = DesiredCapabilities.android();
HashMap<String, Object> contentSettings = new HashMap<String, Object>();
HashMap<String, Object> profile = new HashMap<String, Object>();
HashMap<String, Object> prefs = new HashMap<String, Object>();
System.out.println("setting chrome options");
contentSettings.put("geolocation", 1);
profile.put("managed_default_content_settings", contentSettings);
prefs.put("profile", profile);
options.setExperimentalOption("prefs", prefs);*/
caps.setCapability(ChromeOptions.CAPABILITY, options);
driver = new RemoteWebDriver(new URL(pcUrl), caps);
 

Затем я попытался, указав некоторые параметры, которые также не могут обрабатывать всплывающее окно

 options.addArguments("start-maximized");
options.addArguments("test-type");
options.addArguments("enable-strict-powerful-feature-restrictions");
options.addArguments("disable-geolocation");
caps.setCapability(ChromeOptions.CAPABILITY, options);
caps = caps.merge(DesiredCapabilities.chrome());
 

Я хотел попробовать ниже
https://www.browserstack.com/docs/automate/selenium/handle-permission-pop-ups#handle-know-your-location-pop-up

 driver.context("NATIVE_APP");
driver.findElement(By.xpath(".//android.widget.Button[@text='Allow']")).click();
 

Но я не могу ввести cast AndriodDriver в RemoteWebDriver, какие-либо предложения по этому поводу

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

Ответ №1:

Вы можете сделать это, создав сеанс Appium для управления мобильным Chrome вместо Selenium. Это должно позволить вам взаимодействовать с элементами, как в тесте на Селен, но также изменять NATIVE_APP контекст, чтобы выполнять такие действия, как удаление всплывающих окон.

Вам нужно внести пару изменений:

  1. Создайте экземпляр AndroidOptions вместо ChromeOptions , а затем установите browserName возможность в Chrome
  2. Создайте AppiumDriver тип WebElement вместо RemoteWebDriver

Я смог запустить сеанс и закрыть всплывающее окно следующим образом:

     AndroidOptions options = new AndroidOptions();
    options.setCapability("deviceName","Google Pixel 3a GoogleAPI Emulator" );
    options.setCapability("platformVersion", "11.0");
    options.setCapability("automationName", "UIAutomator2");
    options.setCapability("browserName", "Chrome");

    Map<String, Object> sauceOptions = new HashMap<>();
    sauceOptions.put("name", "WW");
    sauceOptions.put("appiumVersion", "1.20.2");
    options.setCapability("sauce:options", sauceOptions);

    AppiumDriver<WebElement> driver = new AppiumDriver<WebElement>(new URL(address),options);
 
     driver.context("NATIVE_APP");
    driver.findElement(By.xpath(".//android.widget.Button[@text='Allow']")).click();
 

Возможно, вам также придется удалить второе всплывающее окно из самого Android:

    driver.findElement(By.xpath(".//android.widget.Button[@text='While using the app']")).click();