如何在 Android 设备上关闭/接受设备位置弹出窗口 - Selenium 与浏览器堆栈

问题描述

过去几天我一直被这个问题困扰。任何人都可以提供帮助或提供一些关于如何实现的想法。

我在做什么/在哪里表演:

  1. 浏览器:Chrome
  2. 设备:三星 galaxy S20
  3. 远程:浏览器堆栈
  4. 测试:Selenium 与 Java 连接浏览器堆栈

我尝试了多种方法来消除导航到 URL 后出现的位置弹出窗口,但每次 Selenium 测试甚至都不会消除或识别该警报。下面是我在导航时收到的设备位置弹出窗口的图片

enter image description here

我尝试过的代码

能力:

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

我在很多地方看到添加“Autograntpermissions”。也试过了,没用

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 > 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

解决方法

警报由网页上的 JS 触发,但显示在 NATIVE_APP 上下文中。任何不属于网页的警报通常会显示在 NATIVE 上下文中。

此警报需要通过 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)