Как включить поддержку геолокации в chromedriver для Selenium?
Мне нужно проверить функциональность геолокации JS с Selenium, и я использую chromedriver для запуска теста на последнем Chrome.
Проблема теперь в том, что Chrome предлагает мне включить геолокацию во время теста, и что я не знаю, как нажать эту маленькую панель во время выполнения, поэтому я Отчаянно ищу способ запустить chromedriver и chrome с какой-то опцией или триггером, чтобы включить это по умолчанию. Все, что я мог найти здесь, было, однако, как я могу отключить геолокацию в целом.
Как я могу решить эту проблему?
6 ответов:
В разделе известные проблемы ChromeDriver wiki они сказали, что вы не можете указать пользовательский профиль
Вот почему мне кажется, что ответ @Sotomajor об использовании профиля с Chrome, как вы сделали бы с firefox, не будет работать.
В одном из моих интеграционных тестов я столкнулся с той же проблемой. Но поскольку я не беспокоился о реальных значениях геолокации, все, что мне нужно было сделать, - это имитировать окно.навигатор.гелокация
В ваш тестовый код java положите это обходной путь, чтобы избежать панели сведений о разрешении Chrome geoloc.
chromeDriver.executeScript("window.navigator.geolocation.getCurrentPosition = function(success){ var position = {"coords" : { "latitude": "555", "longitude": "999" } }; success(position);}");Значения широты (555) и долготы (999) здесь просто тестовое значение
Подход, который работал для меня в Firefox, состоял в том, чтобы сначала посетить этот сайт вручную, дать эти разрешения, а затем скопировать профиль firefox где-то снаружи и создать экземпляр selenium firefox с этим профилем.
Итак:
Cp-r ~ / библиотека / приложение\ поддержка / Firefox / профили / tp3khne7.default /tmp/ff.профиль
Создание экземпляра 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
Вот как я сделал это с капибарой для огуречных тестов
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
Что касается вашего первоначального вопроса:
Вы должны запустить Firefox вручную один раз - и выбрать профиль, который вы используете для Selenium.
Введите
about:permissionsв адресной строке; найдите имя вашего хоста - и выберитеshare location : "allow".Вот и все. Теперь ваши тестовые случаи Selenium не увидят тот страшный диалог браузера, которого нет в DOM.
Самый простой способ установить геолокацию - это просто naviaget на этом url и нажать allow location by selenium. Вот код для рефренса
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");
Мы только что нашли другой подход, который позволяет нам включить геолокацию в 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; }
Comments