Как включить поддержку геолокации в chromedriver? - PullRequest
11 голосов
/ 07 декабря 2011

Мне нужно протестировать функциональность JS для определения географического местоположения с помощью Selenium, и я использую chromedriver для запуска теста на последнем Chrome.

Проблема заключается в том, что Chrome предлагает мне включить Geolocation во время теста, и яЯ не знаю, как нажимать эту маленькую полоску во время выполнения, поэтому я отчаянно ищу способ запустить chromedriver и chrome с какой-либо опцией или триггером, чтобы включить это по умолчанию.Все, что я смог найти здесь , было, однако, как вообще отключить геолокацию.

Как мне решить эту проблему?

Ответы [ 7 ]

14 голосов
/ 03 апреля 2012

В разделе известных проблем в chromedriver wiki они сказали, что вы Невозможно указать пользовательский профиль

Вот почему мне кажется, что ответ @Sotomajorиспользование профиля в Chrome, как в случае с Firefox, не сработает.

В одном из моих интеграционных тестов я столкнулся с той же проблемой.Но поскольку я не беспокоился о реальных значениях геолокации, все, что мне нужно было сделать, - это смоделировать window.navigator.gelocation

В вашем тестовом коде Java добавлен этот обходной путь, чтобы избежать информационной панели разрешения Chrome geoloc.

chromeDriver.executeScript("window.navigator.geolocation.getCurrentPosition = 
    function(success){
         var position = {"coords" : {
                                       "latitude": "555", 
                                       "longitude": "999"
                                     }
                         }; 
         success(position);}");

значения широты (555) и долготы (999) здесь являются просто тестовыми значениями

3 голосов
/ 05 января 2012

Вот как я это сделал с капибарой для тестов на огурец

Capybara.register_driver :selenium2 do |app|      
  profile = Selenium::WebDriver::Chrome::Profile.new
  profile['geolocation.default_content_setting'] = 1

  config = { :browser => :chrome, :profile => profile }    
  Capybara::Selenium::Driver.new(app, config)
end

И есть ссылка на другие полезные настройки профиля: pref_names.cc

Взятьпосмотрите "Настройки профиля настройки" в RubyBindings

3 голосов
/ 22 декабря 2011

Подход, который работал для меня в Firefox, заключался в том, чтобы сначала посетить этот сайт вручную, дать эти разрешения, а затем скопировать профиль firefox где-то снаружи и создать экземпляр selenium firefox с этим профилем.

Итак:

  1. cp -r ~ / Библиотека / Приложение \ Поддержка / Firefox / Профили / tp3khne7.default /tmp/ff.profile

  2. Создание экземпляра FF:

    FirefoxProfile firefoxProfile = new FirefoxProfile(new File("/tmp/ff.profile"));
    FirefoxDriver driver = new FirefoxDriver(firefoxProfile);
    

Я почти уверен, что нечто подобное должно быть применимо к Chrome. Хотя API загрузки профиля немного другой. Вы можете проверить это здесь: http://code.google.com/p/selenium/wiki/ChromeDriver

1 голос
/ 09 апреля 2013

Что касается вашего первоначального вопроса:

Вы должны запустить Firefox один раз вручную и выбрать профиль, который вы используете для Selenium.

Введите about:permissions в адресной строке; найдите имя вашего хоста - и выберите share location : "allow".

Вот и все. Теперь ваши тесты Selenium не увидят того ужасного диалогового окна браузера, которого нет в DOM.

0 голосов
/ 29 мая 2019

Я взял ваш метод, но он не может работать. Я не нашел "BaseUrls.Root.AbsoluteUri" в настройках Chrome. И использовать скрипт для теста

chromeOptions = webdriver.ChromeOptions()
    chromeOptions.add_argument("proxy-server=http://127.0.0.1:1087")
    prefs = {
        'profile.default_content_setting_values':
            {
                'notifications': 1,
                'geolocation': 1
            },
        'devtools.preferences': {
            'emulation.geolocationOverride': "\"11.111698@-122.222954:\"",
        },
        'profile.content_settings.exceptions.geolocation':{
            'BaseUrls.Root.AbsoluteUri': {
                'last_modified': '13160237885099795',
                'setting': '1'
            }
        },
        'profile.geolocation.default_content_setting': 1

    }

    chromeOptions.add_experimental_option('prefs', prefs)
    chromedriver_path = os.path.join(BASE_PATH, 'utils/driver/chromedriver')
    log_path = os.path.join(BASE_PATH, 'utils/driver/test.log')
    self.driver = webdriver.Chrome(executable_path=chromedriver_path, chrome_options=chromeOptions, service_log_path=log_path)
0 голосов
/ 05 апреля 2018

Мы только что нашли другой подход, который позволяет нам включать геолокацию в chrome (в настоящее время 65.0.3325.181 (Build officiel) (64 бита)) без насмешек над собственной функцией javascript.

Идея состоит в том, чтобы разрешить текущему сайту (представленному BaseUrls.Root.AbsoluteUri) доступ к информации о геолокации.

public static void UseChromeDriver(string lang = null)
{
    var options = new ChromeOptions();
    options.AddArguments(
       "--disable-plugins",   
       "--no-experiments", 
       "--disk-cache-dir=null");

    var geolocationPref = new JObject(
        new JProperty(
            BaseUrls.Root.AbsoluteUri,
            new JObject(
                new JProperty("last_modified", "13160237885099795"),
                new JProperty("setting", "1")
            )
        )
     );

  options.AddUserProfilePreference(
      "content_settings.exceptions.geolocation", 
       geolocationPref);

    WebDriver = UseDriver<ChromeDriver>(options);
}

private static TWebDriver UseDriver<TWebDriver>(DriverOptions aDriverOptions)
    where TWebDriver : RemoteWebDriver
{
    Guard.RequiresNotNull(aDriverOptions, nameof(UITestsContext), nameof(aDriverOptions));

    var webDriver = (TWebDriver)Activator.CreateInstance(typeof(TWebDriver), aDriverOptions);
    Guard.EnsuresNotNull(webDriver, nameof(UITestsContext), nameof(WebDriver));

    webDriver.Manage().Window.Maximize();
    webDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
    webDriver.NavigateToHome();

    return webDriver;
}
0 голосов
/ 11 марта 2016

Самым простым для установки geoLocation является просто навигация по этому URL и щелчок по разрешению местоположения по селену.Вот код для ссылки

 driver.navigate().to("chrome://settings/content");
    driver.switchTo().frame("settings");
    WebElement location= driver.findElement(By.xpath("//*[@name='location' and @value='allow']"));
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    ((JavascriptExecutor) driver).executeScript("arguments[0].click();", location);
     WebElement done= driver.findElement(By.xpath(""));

    driver.findElement(By.xpath("//*[@id='content-settings-overlay-confirm']")).click();

    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    driver.navigate().to("url");
...