27

Sto provando a utilizzare il selenio da Python per scansionare alcune pagine dinamiche con javascript. Tuttavia, non posso chiamare firefox dopo aver seguito le istruzioni del selenio sulla pagina pypi (http://pypi.python.org/pypi/selenium). Ho installato Firefox su AWS ubuntu 12.04. Il messaggio di errore ho ottenuto è:Impossibile chiamare firefox dal selenio in python sul computer AWS

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' 

ho fatto ricerca sul web e ho trovato che questo problema è accaduto con altre persone (https://groups.google.com/forum/?fromgroups=#!topic/selenium : agli utenti/21sJrOJULZY). Ma non capisco la soluzione, se lo è.

Qualcuno può aiutarmi per favore? Grazie!

+4

'Errore: nessun display specificato' significa che il browser non ha uno schermo per visualizzare la finestra principale su. Dovrai trovare un modo per eseguire Firefox headless: http://stackoverflow.com/questions/10060417/python-firefox-headless. Questa risposta in particolare sembra utile: http://stackoverflow.com/a/6300672/464744 – Blender

+0

@Blender Grazie mille. Il secondo link ha risolto il mio problema. A volte non riesco a trovare la soluzione da google se non ho la parola chiave giusta nella mia mente. – David

+0

@Blender: come hai ottenuto un'ancora nel tuo URL per una risposta in una pagina?Non vedo link come questo nelle pagine. –

risposta

51

Il problema è che Firefox richiede un display. Nel mio esempio ho usato pyvirtualdisplay per simulare un display. La soluzione è:

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

prega di notare che pyvirtualdisplay richiede uno dei seguenti back-end: Xvfb, Xephyr, Xvnc.

Questo dovrebbe risolvere il problema.

+0

Grazie. Una domanda veloce: qual è la differenza tra driver.close() e driver.quite()? – David

+1

per aiutare le persone in futuro che si imbattono in questo .. ti preghiamo di notare che il commento che differenzia la chiusura/chiusura da @ That1Guy è semplicemente sbagliato. Si noti inoltre che il codice nella sua risposta non spegne mai correttamente il driver sottostante e potrebbe perdere processi o descrittori di file. 'driver.close()' semplicemente chiude la finestra corrente. Lascia le altre finestre aperte e il driver attivo. 'driver.quit()' chiude effettivamente il driver e chiude tutte le finestre associate. Se desideri maggiori dettagli sulla differenza, leggi il codice sorgente del selenio web del selenio. –

+1

Una nota per i futuri lettori: il commento a @CoreyGoldberg si riferisce a era in realtà errato. Avevo confuso non solo i metodi che ho menzionato riferendosi al Selenio, ma anche con un altro progetto al quale stavo lavorando in quel momento. Fare riferimento alla documentazione di ['driver.quit()'] (http://selenium-python.readthedocs.org/api.html?highlight=driver.quit#selenium.webdriver.firefox.webdriver.WebDriver.quit) e ['drver.close()'] (http://selenium-python.readthedocs.org/api.html?highlight=driver.close#selenium.webdriver.remote.webdriver.WebDriver.close). – That1Guy

4

Anch'io avevo affrontato lo stesso problema. Ero su Firefox 47 e Selenium 2.53. Quindi quello che ho fatto è stato il downgrade di Firefox a 45. Questo ha funzionato.

1) Rimuovere Firefox 47 prima:

sudo apt-get purge firefox

2) Verificare la presenza di versioni disponibili:

apt-cache show firefox | grep Version

Mostrerà disponibili versioni di Firefox come:

Version: 47.0+build3-0ubuntu0.16.04.1

Version: 45.0.2+build1-0ubuntu1

3) Dillo che costruiscono scaricare

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

4) Poi si deve non eseguire l'aggiornamento alla versione più recente di nuovo.

sudo apt-mark hold firefox

5) Se si desidera aggiornare in seguito

sudo apt-mark unhold firefox sudo apt-get upgrade

Spero che questo aiuti.

Problemi correlati