2011-12-07 37 views
9

Necesito probar una funcionalidad de geolocalización de JS con Selenium y estoy usando chromedriver para ejecutar la prueba en el último Chrome.¿Cómo activo el soporte de geolocalización en cromedriver para Selenium?

El problema ahora es que Chrome me pide que habilite Geolocalización durante la prueba y que no sé cómo hacer clic en esa pequeña barra en tiempo de ejecución, así que estoy buscando desesperadamente una manera de iniciar el cromedriver y Chrome con algunos opción o disparador para habilitar esto de forma predeterminada. Todo lo que pude encontrar here fue, sin embargo, cómo puedo deshabilitar la geolocalización por completo.

¿Cómo puedo resolver este problema?

Respuesta

9

En la sección de problemas conocidos del chromedriver wiki dijeron que No se puede especificar un perfil personalizado

Es por esto que me parece que @Sotomajor respuesta sobre el uso de perfil con Chrome como lo haría con Firefox no funcionará.

En una de mis pruebas de integración me enfrenté al mismo problema. Pero como no me preocupaba por los valores reales de geolocalización, todo lo que tenía que hacer era simular window.navigator.gelocation

En el código de prueba de Java, coloque esta solución para evitar la barra de información de permisos de geoloc de Chrome.

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

latitud (555) y longitud (999) Los valores aquí son solo valor de prueba

+0

Eso es una muy buena idea - ¡aceptado! –

+0

Los valores devueltos deben ser números escalares, no cadenas. – Meglio

3

enfoque que trabajó para mí en Firefox fue a visitar ese sitio manualmente en primer lugar, dar a esos permisos y después copiar el perfil de Firefox en algún lugar fuera y crear selenio ejemplo Firefox con ese perfil.

Así:

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

  2. Creación ejemplo FF:

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

Estoy bastante seguro de que algo similar debería ser aplicable a Chrome. Aunque api de carga de perfil es un poco diferente. Puede comprobar aquí: http://code.google.com/p/selenium/wiki/ChromeDriver

+0

Gracias por el consejo útil, no es exactamente lo que estaba buscando (ya que la parte de host de la dirección URL que cargo en que podría cambiar con el tiempo que tendría que actualizar el perfil cada vez o proporcionar diferentes perfiles), pero mejor que nada a partir de ahora. –

3

Aquí es cómo lo hice con capibara para las pruebas de pepino

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 

y hay un enlace a otras configuraciones de perfil muy útil: pref_names.cc

Ven a ver "Afinando preferencias de perfil "en RubyBindings

0

En cuanto a su pregunta inicial:

Debe iniciar Firefox manualmente una vez - y seleccione el perfil que utiliza para Selenio.

Tipo about:permissions en la línea de dirección; encuentre el nombre de su host - y seleccione share location : "allow".

Eso es todo. Ahora sus casos de prueba de Selenium no verán ese temido diálogo de navegador que no está en el DOM.

0

La ubicación geográfica más simple es simplemente navegar en esa url y hacer clic en permitir ubicación por selenio. Aquí está el código para 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"); 
Cuestiones relacionadas