如何在chromedriver中启用地理定位支持?

时间:2011-12-07 07:31:41

标签: selenium geolocation chromium

我需要使用Selenium测试JS地理位置功能,我正在使用chromedriver在最新的Chrome上运行测试。

现在问题是Chrome在测试期间提示我启用Geolocation,而且我不知道如何在运行时点击那个小条,所以我拼命寻找一种方法来启动chromedriver和chrome以及一些选项或触发器默认启用此功能。然而,我所能找到的here是如何完全禁用地理定位的。

我该如何解决这个问题?

7 个答案:

答案 0 :(得分:13)

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)值仅为测试值

答案 1 :(得分:3)

在Firefox中为我工作的方法是首先手动访问该站点,提供这些权限,然后在外面的某处复制firefox配置文件,并使用该配置文件创建selenium firefox实例。

所以:

  1. cp -r~ / Library / Application \ Support / Firefox / Profiles / tp3khne7.default /tmp/ff.profile

  2. 创建FF实例:

    FirefoxProfile firefoxProfile = new FirefoxProfile(new File("/tmp/ff.profile"));
    FirefoxDriver driver = new FirefoxDriver(firefoxProfile);
    
  3. 我很确定类似的内容应适用于Chrome。虽然配置文件加载的api有点不同。您可以在此处查看:http://code.google.com/p/selenium/wiki/ChromeDriver

答案 2 :(得分:3)

以下是我如何使用水豚进行黄瓜测试

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 :(得分:1)

关于你的初步问题:

您应该手动启动Firefox一次 - 并选择您用于Selenium的配置文件。

在地址栏输入about:permissions;找到您的主机名称 - 然后选择share location : "allow"

这就是全部。现在你的Selenium测试用例将看不到那个不在DOM中的可怕浏览器对话框。

答案 4 :(得分:0)

设置geoLocation最简单的方法就是在该URL上进行导航,然后点击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");

答案 5 :(得分:0)

我们刚刚发现了一种不同的方法,允许我们在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;
}

答案 6 :(得分:0)

我接受了您的方法,但是无法使用。我在Chrome的“偏好设置”配置中找不到“ BaseUrls.Root.AbsoluteUri”。并使用脚本进行测试

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)