Permitir siempre la geolocalización en Firefox utilizando Selenium

Estoy creando algunas pruebas de extremo a extremo para una aplicación web que utiliza Selenium .

Estoy trabajando en Python y usando el controlador de Firefox

driver = webdriver.Firefox()

El problema es que mi aplicación web utiliza geolocalización HTML5, y parece que cada vez que ejecuto mis pruebas, tengo que hacer clic en la ventana emergente “Permitir ubicación” en Firefox, lo que hace que mis pruebas sean menos automatizadas.

¿Hay alguna manera de forzar que el controlador de Selenium Firefox siempre permita la geolocalización sin preguntar?

Related of "Permitir siempre la geolocalización en Firefox utilizando Selenium"

Creo que lo predeterminado es lanzar Firefox con un nuevo perfil anónimo. Puedes lanzar selenium con -Dwebdriver.firefox.profile = lo que sea, donde “lo que sea” es el nombre de un perfil cuando inicias firefox -P.

Para asegurarse de que no haya ninguna rareza con los inicios de sesión persistentes y otras cookies:

  • Ejecuta Firefox con “firefox -P”
  • Elige el perfil con el que lanzarás las pruebas.
  • Editar -> Preferencias -> Privacidad, seleccione Usar configuraciones personalizadas para el historial
  • Dile a Firefox que mantenga las cookies hasta que “cierre Firefox”

Puede forzar que el navegador devuelva alguna ubicación predefinida sin solicitudes de permiso.

Simplemente ejecuta el siguiente código JavaScript:

 "navigator.geolocation.getCurrentPosition = function(success) { success({coords: {latitude: 50.455755, longitude: 30.511565}}); }" 

Probado en Firefox y Chrome.

Porque llegué al mismo problema casi 3 años después de que me hicieron esta pregunta y ninguna de las respuestas anteriores fue satisfactoria para mí. Me gusta mostrar la solución que uso.

Así que la respuesta que encontré en este blog .

Y utilízalo en mi código de python de esta manera:

 @classmethod def setUpClass(cls): cls.binary = FirefoxBinary(FF_BINARY_PATH) cls.profile = FirefoxProfile() cls.profile.set_preference("geo.prompt.testing", True) cls.profile.set_preference("geo.prompt.testing.allow", True) cls.profile.set_preference('geo.wifi.uri', GEOLOCATION_PATH) cls.driver = Firefox(firefox_binary=cls.binary, firefox_profile=cls.profile) 

En GEOLOCATION_PATH está mi ruta al archivo JSON :

 { "status": "OK", "accuracy": 10.0, "location": { "lat": 50.850780, "lng": 4.358138, "latitude": 50.850780, "longitude": 4.358138, "accuracy": 10.0 } } 

Me topé con este problema hoy y sabía que debería existir una manera simple y rápida de lidiar con esto. Así es como lo resolví:

  1. Crea un nuevo perfil de Firefox que será utilizado por Selenium. Puede hacerlo escribiendo about:profiles y luego haciendo clic en ‘Crear nuevo perfil’. Una instrucción paso a paso se puede encontrar en los documentos de Mozilla .
  2. Diríjase al sitio que necesita los permisos y espere a que le solicite que los otorgue. Concédelos y marque la casilla “Recordar esta decisión”.
  3. Necesitará saber dónde se almacena su perfil para que Selenium pueda usarlo. Puedes encontrar la ubicación en about:profiles . Aquí creé un “example_profile” y luego copié la ruta del “directorio raíz”: acerca de: perfiles

  4. Luego, puede pasar la ruta como parámetro mientras crea una instancia de un navegador Firefox como este:

     root_directory_path = "/.../Firefox/Profiles/loeiok2p.example_profile" driver = webdriver.Firefox(firefox_profile=root_directory_path) 

Selenium debe usar el perfil con los permisos otorgados y la ventana emergente no debe volver a aparecer.

Aquí está la respuesta más refinada de una de las respuestas anteriores. Esto agrega cierto tiempo de espera antes de realizar la callback con éxito de geolocalización, ya que generalmente JavaScript se escribe de tal manera que no se espera que las coordenadas de geolocalización estén disponibles hasta que haya un ciclo de regreso al ciclo de eventos.

Esto también permite rastrear la falsificación a través de la consola web.

 SPOOF_LOCATION_JS = """ (function() { console.log('Preparing geo spoofing'); navigator.geolocation.getCurrentPosition = function(success) { console.log("getCurrentPosition() called"); setTimeout(function() { console.log("Sending out fake coordinates"); success({coords: {latitude: 50.455755, longitude: 30.511565}}); }, 500); }; console.log("Finished geospoofing")})(); """ browser.evaluate_script(SPOOF_LOCATION_JS.replace("\n", " ")) 

¿Sería suficiente solo permitirlo una vez manualmente y luego permitir que Python haga el trabajo?

Debido a que puede permitirlo fácilmente configurando esto en las propiedades del sitio web en Firefox: introduzca la descripción de la imagen aquí