如何在 Android 设备上处理允许/关闭地理位置弹出窗口

Posted

技术标签:

【中文标题】如何在 Android 设备上处理允许/关闭地理位置弹出窗口【英文标题】:How to handle allow/dismiss geo location popup on Android devices 【发布时间】:2021-11-25 22:31:52 【问题描述】:

我想知道如何处理 android 设备上的地理位置弹出窗口

以下是一些高级细节

    我正在使用 Saucelabs 云来运行我的脚本 我使用的是 Chrome 浏览器 Android 模拟器:三星 Galaxy S8 Plus 高清 GoogleAPI 模拟器 Android-真实设备:Samsung_Galaxy_S10_POC173 测试环境:Selenium、Java、testNg

我已经尝试了所有可能的方法来处理这个问题,附上我尝试过的代码sn-ps

最初我认为这是一个警报,并试图通过切换到警报来处理

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();

但我无法将 AndriodDriver 类型转换为 RemoteWebDriver,对此有任何建议

或者如果有任何其他可能的方式来实现这一点,请告诉我。

【问题讨论】:

【参考方案1】:

您可以通过创建 Appium 会话来驱动 Mobile Chrome,而不是 Selenium。这应该允许您像在 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();

【讨论】:

以上是关于如何在 Android 设备上处理允许/关闭地理位置弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

如何允许远程访问我的移动(Android)WAMP服务器[关闭]

移动设备的地理位置

如何在 HTML 中存储地理位置? [关闭]

Cordova 地理定位插件在 android 设备上不起作用

Android:如何在用户关闭位置设置时获取地理围栏事件?

Chrome javascript地理位置未显示允许/阻止弹出窗口