IOError: Permiso denegado: ‘geckodriver.log cuando se ejecuta Python / Selenium

Recibiendo el siguiente error al ejecutar Selenium a través de Flask / Python

browser = webdriver.Firefox() [Wed Mar 07 03:02:27.719608 2018] [:error] [pid 21555] [client 108.162.250.6:36139] File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py", line 151, in __init__ [Wed Mar 07 03:02:27.719611 2018] [:error] [pid 21555] [client 108.162.250.6:36139] log_path=log_path) [Wed Mar 07 03:02:27.719614 2018] [:error] [pid 21555] [client 108.162.250.6:36139] File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/service.py", line 44, in __init__ [Wed Mar 07 03:02:27.719617 2018] [:error] [pid 21555] [client 108.162.250.6:36139] log_file = open(log_path, "a+") if log_path is not None and log_path != "" else None [Wed Mar 07 03:02:27.719620 2018] [:error] [pid 21555] [client 108.162.250.6:36139] IOError: [Errno 13] Permission denied: 'geckodriver.log' 

La funcion es

 def get_index(api_key): if str(api_key)!=the_api_key: return 401 base_url = 'www.google.com' browser = webdriver.Firefox() browser.get(base_url) html = browser.page_source return html 

Si voy directamente al directorio de la aplicación y ejecuto el script ( python run.py ), no obtengo el error.

Según esto, parece que el archivo de registro no se puede escribir cuando se ejecuta a través de Flask, pero ¿dónde debería ubicarse el archivo?

geckdriver ejecutable de geckdriver está instalado en /usr/local/bin/

Los errores nos dan una pista sobre qué es lo que sucede de la siguiente manera:

 [Wed Mar 07 03:02:27.719608 2018] [:error] [pid 21555] [client 108.162.250.6:36139] File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py", line 151, in __init__ [Wed Mar 07 03:02:27.719611 2018] [:error] [pid 21555] [client 108.162.250.6:36139] log_path=log_path) 

Según el código fuente, el GeckoDriver se inicia con dos argumentos predeterminados executable_path y log_path=log_path siguiente manera:

  if capabilities.get("marionette"): capabilities.pop("marionette") self.service = Service(executable_path, log_path=log_path) self.service.start() 

Los errores de su progtwig aquí como el valor log_path (el log_file ) correspondiente a Key log_path no es editable (agregable) que finalmente falla en:

 [Wed Mar 07 03:02:27.719617 2018] [:error] [pid 21555] [client 108.162.250.6:36139] log_file = open(log_path, "a+") if log_path is not None and log_path != "" else None [Wed Mar 07 03:02:27.719620 2018] [:error] [pid 21555] [client 108.162.250.6:36139] IOError: [Errno 13] Permission denied: 'geckodriver.log' 

Según el código fuente, el servicio GeckoDriver se inicia de manera predeterminada de la siguiente manera:

Servicio de clase (service.Service): “” “Objeto que administra el inicio y la detención de GeckoDriver.” “”

 def __init__(self, executable_path, port=0, service_args=None, log_path="geckodriver.log", env=None): """Creates a new instance of the GeckoDriver remote service proxy. GeckoDriver provides a HTTP interface speaking the W3C WebDriver protocol to Marionette. :param log_path: Optional path for the GeckoDriver to log to. Defaults to _geckodriver.log_ in the current working directory. """ log_file = open(log_path, "a+") if log_path is not None and log_path != "" else None 

Lo que implica que si no pasa la ubicación de geckodriver.log explícitamente a través de su progtwig, GeckoDriver tiende a crear un archivo por su cuenta en el directorio de trabajo actual y, en ausencia del permiso requerido, se produce un error con el mensaje Permiso denegado: ‘ geckodriver.log ‘

Solución

El primer y principal punto será verificar la compatibilidad entre los binarios que está utilizando.

  • Asegúrese de que está utilizando Selenium-Python Client v3.10.0 , GeckoDriver v0.19.1 y Firefox Quantum v58.0.2

Una solución sería:

  • Inicialice el GeckoDriver con los argumentos executable_path y log_path con los valores efectivos (chmod 777 geckodriver.log ) de la siguiente manera:

     def get_index(api_key): if str(api_key)!=the_api_key: return 401 base_url = 'www.google.com' browser = webdriver.Firefox(executable_path="/usr/local/bin/geckodriver", log_path="/path/to/geckodriver.log") browser.get(base_url) html = browser.page_source return html 
  • Si pretende crear geckodriver.log dentro del área de trabajo del proyecto, asegúrese de obtener el permiso requerido (chmod 777 Project Workspace ) de la siguiente manera:

     def get_index(api_key): if str(api_key)!=the_api_key: return 401 base_url = 'www.google.com' browser = webdriver.Firefox(executable_path='/usr/local/bin/geckodriver') browser.get(base_url) html = browser.page_source return html 

Estoy en una computadora con Windows 10 Cuando eliminé mi archivo geckodriver.log, solucioné mi problema.