web-dev-qa-db-fra.com

impossible d'appeler Firefox depuis Selenium en python sur une machine AWS

J'essaie d'utiliser Selenium à partir de python pour gratter des pages dynamiques avec du javascript. Cependant, je ne peux pas appeler Firefox après avoir suivi les instructions de Selenium sur la page pypi (http://pypi.python.org/pypi/Selenium). J'ai installé Firefox sur AWS Ubuntu 12.04. Le message d'erreur que j'ai reçu est:

In [1]: from Selenium import webdriver

In [2]: br = webdriver.Firefox()
---------------------------------------------------------------------------
WebDriverException                        Traceback (most recent call last)
/home/ubuntu/<ipython-input-2-d6a5d754ea44> in <module>()
----> 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'

J'ai effectué une recherche sur le Web et constaté que ce problème s'était produit avec d'autres personnes (https://groups.google.com/forum/?fromgroups=#!topic/Selenium-users/21sJrOJULZY). Mais je ne comprends pas la solution, si c'est le cas. 

Quelqu'un peut-il m'aider s'il-vous-plaît? Merci!

28
David

Le problème est que Firefox nécessite un affichage. J'ai utilisé pyvirtualdisplay dans mon exemple pour simuler un affichage. La solution est:

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()

Veuillez noter que pyvirtualdisplay requiert l’un des back-end suivants: Xvfb, Xephyr, Xvnc.

Cela devrait résoudre votre problème.

52
That1Guy

Moi aussi j'avais rencontré le même problème. J'étais sur Firefox 47 et Selenium 2.53. Donc, ce que j'ai fait a été rétrogradé Firefox à 45. Cela a fonctionné.

1) Supprimez Firefox 47 en premier:

Sudo apt-get purge firefox

2) Vérifier les versions disponibles:

apt-cache show firefox | grep Version

Il montrera les versions disponibles de Firefox comme:

Version: 47.0+build3-0ubuntu0.16.04.1

Version: 45.0.2+build1-0ubuntu1

3) Indiquez quelle version télécharger

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

4) Ensuite, vous ne devez plus utiliser la nouvelle version.

Sudo apt-mark hold firefox

5) Si vous voulez mettre à jour plus tard

Sudo apt-mark unhold firefoxSudo apt-get upgrade

J'espère que cela t'aides.

4
Amogh Joshi

C'est déjà dans le commentaire de la question d'OP, mais dites-le comme une réponse. Selenium peut être exécuté en arrière-plan sans ouvrir une fenêtre de navigateur réelle.

Par exemple, si vous utilisez Chrome, définissez les options suivantes:

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

Ensuite, lorsque vous appelez votre pilote Web, vos paramètres deviennent un paramètre:

browser = webdriver.Chrome(chrome_options=chrome_options)
0
David Skarbrevik