#java #selenium-webdriver #appium #saucelabs
Вопрос:
Я хотел знать, как обрабатывать всплывающее окно с географическим местоположением на устройствах Android
ниже приведены некоторые детали высокого уровня
- Я использую облако Saucelabs для запуска своих сценариев
- Я использую браузер Chrome
- Android-эмулятор : Samsung Galaxy S8 Plus HD Эмулятор GoogleAPI Android — реальное устройство : Samsung_Galaxy_S10_POC173
- Среда тестирования : 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
контекст, чтобы выполнять такие действия, как удаление всплывающих окон.
Вам нужно внести пару изменений:
- Создайте экземпляр
AndroidOptions
вместоChromeOptions
, а затем установитеbrowserName
возможность вChrome
- Создайте
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();