Как включить поддержку геолокации в chromedriver?
Мне нужно проверить функциональность геолокации JS с помощью Selenium, и я использую chromedriver для запуска теста в последнем Chrome.
Проблема в том, что Chrome предлагает мне включить Geolocation во время теста и что я не знаю, как щелкнуть эту маленькую панель во время выполнения, поэтому я отчаянно ищу способ запустить хромированный ремень и хром с некоторым вариантом или триггер, чтобы включить это по умолчанию. Все, что я мог найти здесь, однако, как я могу полностью отключить геолокацию.
Как я могу решить эту проблему?
Ответы
Ответ 1
В разделе известных проблем wiki-хромированной решетки они сказали, что вы не можете указать настраиваемый профиль
Вот почему мне кажется, что @Sotomajor ответ об использовании профиля с Chrome, как вы это делали бы с firefox, не будет работать.
В одном из моих интеграционных тестов я столкнулся с той же проблемой. Но поскольку я не беспокоился о реальных значениях геолокации, все, что мне нужно было сделать, - это mock 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) здесь являются только тестовым значением
Ответ 2
Подход, который работал у меня в Firefox, заключался в том, чтобы сначала зайти на этот сайт вручную, предоставить эти разрешения и затем скопировать профиль firefox где-то снаружи и создать экземпляр selenium firefox с этим профилем.
Итак:
-
cp -r ~/Library/Приложение\Поддержка/Firefox/Профили/tp3khne7.default/tmp/ff.profile
-
Создание экземпляра 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
Ответ 3
Вот как я сделал это с capybara для тестов огурца
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
Ответ 4
Что касается вашего начального вопроса:
Вы должны запустить Firefox вручную один раз - и выберите профиль, который вы используете для Selenium.
Введите about:permissions
в адресную строку; найдите имя своего хоста - и выберите share location : "allow"
.
Это все. Теперь ваши тестовые примеры Selenium не будут видеть этот ужасный диалог браузера, который отсутствует в DOM.
Ответ 5
Простейшим для установки geoLocation является просто навигация по этому URL-адресу и щелчок по разрешению местоположения по селену. Вот код для refrence
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");
Ответ 6
Мы только что нашли другой подход, который позволяет нам включать геолокацию в 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;
}