wake-up-neo.com

firefox kann nicht von Selenium in Python auf AWS-Maschine aufgerufen werden

Ich versuche, Selenium aus Python zu verwenden, um einige dynamische Seiten mit Javascript zu kratzen. Ich kann Firefox jedoch nicht anrufen, nachdem ich den Anweisungen von Selenium auf der Pypi-Seite (http://pypi.python.org/pypi/Selenium) gefolgt bin. Ich habe Firefox auf AWS Ubuntu 12.04 installiert. Die Fehlermeldung, die ich bekam, ist:

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'

Ich habe im Web gesucht und festgestellt, dass dieses Problem bei anderen Personen aufgetreten ist (https://groups.google.com/forum/?fromgroups=#!topic/Selenium-users/21sJrOJULZY). Aber ich verstehe die Lösung nicht, wenn es so ist. 

Kann mir jemand bitte helfen? Vielen Dank!

28
David

Das Problem ist, dass Firefox eine Anzeige benötigt. In meinem Beispiel habe ich pyvirtualdisplay verwendet, um eine Anzeige zu simulieren. Die Lösung ist:

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

Bitte beachten Sie, dass pyvirtualdisplay eines der folgenden Backends benötigt: Xvfb, Xephyr, Xvnc.

Dies sollte Ihr Problem beheben.

52
That1Guy

Ich hatte auch das gleiche Problem. Ich war auf Firefox 47 und Selenium 2.53. Also habe ich Firefox auf 45 herabgestuft. Das hat funktioniert.

1) Entfernen Sie zuerst Firefox 47:

Sudo apt-get purge firefox

2) Überprüfen Sie die verfügbaren Versionen:

apt-cache show firefox | grep Version

Es werden verfügbare Firefox-Versionen angezeigt:

Version: 47.0+build3-0ubuntu0.16.04.1

Version: 45.0.2+build1-0ubuntu1

3) Geben Sie an, welcher Build heruntergeladen werden soll

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

4) Als nächstes müssen Sie nicht erneut auf die neuere Version aktualisieren.

Sudo apt-mark hold firefox

5) Wenn Sie später ein Upgrade durchführen möchten

Sudo apt-mark unhold firefoxSudo apt-get upgrade

Hoffe das hilft.

4
Amogh Joshi

Dies ist bereits in der Bemerkung von OPs Frage, aber als Antwort darzulegen. Sie können Selen im Hintergrund laufen lassen, ohne ein aktuelles Browserfenster zu öffnen.

Wenn Sie beispielsweise Chrome verwenden, legen Sie folgende Optionen fest:

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

Wenn Sie dann Ihren Webtreiber aufrufen, werden Ihre Einstellungen zu einem Parameter:

browser = webdriver.Chrome(chrome_options=chrome_options)
0