No se puede llamar a Firefox desde Selenium en Python en la máquina de AWS

Estoy tratando de usar selenium de python para raspar algunas páginas dinámicas con javascript. Sin embargo, no puedo llamar a Firefox después de seguir las instrucciones de selenium en la página pypi (http://pypi.python.org/pypi/selenium). Instalé Firefox en AWS ubuntu 12.04. El mensaje de error que recibí es:

In [1]: from selenium import webdriver In [2]: br = webdriver.Firefox() --------------------------------------------------------------------------- WebDriverException Traceback (most recent call last) /home/ubuntu/ in () ----> 1 br = webdriver.Firefox() /usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.pyc in __init__(self, firefox_profile, firefox_binary, timeout) 49 RemoteWebDriver.__init__(self, 50 command_executor=ExtensionConnection("127.0.0.1", self.profile, ---> 51 self.binary, timeout), 52 desired_capabilities=DesiredCapabilities.FIREFOX) 53 /usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/extension_connection.pyc in __init__(self, host, firefox_profile, firefox_binary, timeout) 45 self.profile.add_extension() 46 ---> 47 self.binary.launch_browser(self.profile) 48 _URL = "http://%s:%d/hub" % (HOST, PORT) 49 RemoteConnection.__init__( /usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.pyc in launch_browser(self, profile) 42 43 self._start_from_profile_path(self.profile.path) ---> 44 self._wait_until_connectable() 45 46 def kill(self): /usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.pyc in _wait_until_connectable(self) 79 raise WebDriverException("The browser appears to have exited " 80 "before we could connect. The output was: %s" % ---> 81 self._get_firefox_output()) 82 if count == 30: 83 self.kill() WebDriverException: Message: 'The browser appears to have exited before we could connect. The output was: Error: no display specified\n' 

Hice una búsqueda en la web y descubrí que este problema ocurrió con otras personas (https://groups.google.com/forum/?fromgroups=#!topic/selenium-users/21sJrOJULZY). Pero no entiendo la solución, si es.

¿Alguien puede ayudarme por favor? ¡Gracias!

El problema es que Firefox requiere una pantalla. He usado pyvirtualdisplay en mi ejemplo para simular una pantalla. La solucion es:

 from pyvirtualdisplay import Display from selenium import webdriver display = Display(visible=0, size=(1024, 768)) display.start() driver= webdriver.Firefox() driver.get("http://www.somewebsite.com/") <---some code---> #driver.close() # Close the current window. driver.quit() # Quit the driver and close every associated window. display.stop() 

Tenga en cuenta que pyvirtualdisplay requiere uno de los siguientes back-ends: Xvfb, Xephyr, Xvnc.

Esto debería resolver su problema.

Yo también había enfrentado el mismo problema. Estaba en Firefox 47 y Selenium 2.53. Entonces, lo que hice fue rebajar Firefox a 45. Esto funcionó.

1) Elimina primero Firefox 47:

sudo apt-get purge firefox

2) Compruebe las versiones disponibles:

apt-cache show firefox | grep Version

Mostrará las versiones disponibles de Firefox como:

Version: 47.0+build3-0ubuntu0.16.04.1

Version: 45.0.2+build1-0ubuntu1

3) Indica qué comstackción para descargar

sudo apt-get install firefox=45.0.2+build1-0ubuntu1

4) A continuación, no debe volver a actualizar a la versión más nueva.

sudo apt-mark hold firefox

5) Si quieres actualizar mas tarde

sudo apt-mark unhold firefox sudo apt-get upgrade

Espero que esto ayude.

Esto ya está en el comentario de la pregunta de OP, pero para exponerlo como una respuesta. Puede hacer que Selenium se ejecute en segundo plano sin abrir una ventana de navegador real.

Por ejemplo, si usa Chrome, configure estas opciones:

 from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.set_headless(headless=False) 

Luego, cuando llama a su controlador web, su configuración se convierte en un parámetro:

 browser = webdriver.Chrome(chrome_options=chrome_options)