Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Set Allow location [Chrome browser] by default

location
geolocation
chrome
webdriver
options
Теги: #<Tag:0x00007f7b64961d88> #<Tag:0x00007f7b64961ba8> #<Tag:0x00007f7b64961900> #<Tag:0x00007f7b64961360> #<Tag:0x00007f7b649611a8>

(Slim Bim) #1

Добрый день.
Подскажите пожалуйста, кто как решал проблемы с Chrome browser > Allow location.
Как по дефолту разрешить локейшен для всех сайтов?
Какая проперти?
Заранее спасибо :wink:


GeoLocation popup как работать с таким попапом в тесте для основных браузеров
(Jane Tymoschuk) #2

Мне, почему-то, кажется, что та же самая, что и для разрешения диалога для скачивания файла:
profile.default_content_settings.popups со значением 0


(Stan) #3

Нет, profile.default_content_settings.geolocation

enum ErrorCode {
  ERROR_CODE_NONE = 0,               // Chrome addition
  ERROR_CODE_PERMISSION_DENIED = 1,
  ERROR_CODE_POSITION_UNAVAILABLE = 2,
  ERROR_CODE_TIMEOUT = 3,
};

(Slim Bim) #4

Спасибо, если можно, было бы неплохо посмотерть реализацию, как вы добавляете это в преференсы :wink:


(Stan) #5

Лично я с джавой не много работаю, в основном питон-нода-пхп. Но исходя из https://sites.google.com/a/chromium.org/chromedriver/capabilities должно быть:

ChromeOptions options = new ChromeOptions();
Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("profile.default_content_settings.geolocation", 2); // нужное значение
options.setExperimentalOption("prefs", prefs);

(Slim Bim) #6

Спасибо, но не помогло. Может ещё какие варианты решений?
У Вас это работает?


(Stan) #7

Я же говорю, что не пользуюсь. А какое значение вы ставите? Что вам нужно достичь? Судя по https://bugs.chromium.org/p/chromedriver/issues/detail?id=138 это работает.

У меня оно работает в моих фреймворках, но думаю вам бесполезно будет что-то из ноды:

client = webdriver.remote({
    desiredCapabilities: {
        // chrome | firefox | phantomjs
        browserName: 'chrome',
        'chromeOptions': {
            'args': ['--test-type', '--window-size=768,1024'],
             // chrome geolocation settings
            'prefs': {'profile.default_content_settings.geolocation': 2 }
        }
    },
    // silent | verbose | command | data | result
    logLevel: 'silent'
});

(Борис Осипов) #8

Для java как-то так:

ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", new JSONObject().put("profile.default_content_settings.geolocation", 1));

(Stan) #9

ну так, а выше тоже самое только через Map<String, Object>


(Борис Осипов) #10

Ага, сорри, не читал весь топик.


(Slim Bim) #11

Спасибо большое всем, поптыаюсь ещё раз обяснить всё подробнее что мне нужно в конечном результате:

  1. Пользователь нажимает на кнопку “Добавить мой локейшен”
  2. На клик кнопки вызывается нативная реализация браузера, у хрома это такой поп-ап.
  3. Пользователь кликает allow, данные льправляются на сервер.

Мне нужно, что бы клике на кнопку “Добавить мой локейшен” не появлялся попап.

Я посмотрел файл Preferences для своего хрома, так вот как там это реализовано.
Он просто в добавляет в этот json новый обеькт и исключение с url и настройками для геолокации - 1 это разрешить, 2 - запретить.
При использовании prefs.put(“profile.default_content_settings.geolocation”, 1); поп-ап с локейшеном появляется.


(Stan) #12

Пробовали 0-1-2? результат один? Значит вы как-то не так создаете драйвер и оно туда не передается. Покажите код?


(Slim Bim) #13

Пробовал все значения.
Все остальные значения подсавляются, а это нет.
У Вас поп-апа нет и локейшен разрешается?


#14

Для хрома можно через такой костыль -
getDriver().navigate().to("chrome://settings/content"); getDriver().switchTo().frame("settings"); WebElement location = getDriver().findElement(By.xpath("//*[@name='location' and @value='allow']")); ((JavascriptExecutor) getDriver()).executeScript("arguments[0].click();", location); getDriver().findElement(By.xpath("//*[@id='content-settings-overlay-confirm']")).click();


(Ser M) #15

Сейчас работает так:

Map<String, Object> prefs = new HashMap<>();
prefs.put("profile.default_content_setting_values.geolocation", 2);
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setExperimentalOption("prefs", prefs);
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
new ChromeDriver(capabilities);

(Ольга Люцко) #16

а есть нечто подобное еще для Firefox?


(Dmitry Astanin) #17

Для твоего кейса в хроме должно работать как то так

ChromeOptions options = new ChromeOptions();
options.addArguments("chrome.switches","--disable-extensions");
options.addArguments("chrome.switches","--disable-geolocation");

Ну и опции в драйвер передать