2014-12-05 16 views
27

per la mia ricerca, ho apportato alcune modifiche al codice sorgente in firefox e lo ho creato da solo. Per automatizzare i test, ho scelto di utilizzare Selenium, ma sfortunatamente il mio nuovo Firefox sembra non supportare Selenium.Firefox Build non funziona con Selenium

ho fatto la seguente:

from selenium import webdriver 
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary 

binary = FirefoxBinary("/path/to/firefox/binary") 

d = webdriver.Firefox(firefox_binary=binary) 

d.get("http://www.google.de") 

La Firefox viene aperto ed è reattivo (posso entrare in un sito nella barra di ricerca). Ma dopo un po ', lo script python si blocca con il seguente messaggio di errore:

Traceback (most recent call last): 
    File "firefox.py", line 7, in <module> 
    d = webdriver.Firefox(firefox_binary=binary) 
    File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/firefox/webdriver.py", line 59, in __init__ 
    self.binary, timeout), 
    File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/firefox/extension_connection.py", line 47, in __init__ 
    self.binary.launch_browser(self.profile) 
    File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 66, in launch_browser 
    self._wait_until_connectable() 
    File "/usr/local/lib/python3.4/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 109, in _wait_until_connectable 
    raise WebDriverException("Can't load the profile. Profile " 
selenium.common.exceptions.WebDriverException: Message: Can't load the profile. Profile Dir: %s If you specified a log_file in the FirefoxBinary constructor, check it for details. 

ho fatto Google che messaggio di errore e la maggior parte delle soluzioni proposte, che devo aggiornare selenio in quanto non supporta la versione di Firefox utilizzata. Sfortunatamente, ho installato la versione più recente di selenio (2.44.0) e ho persino usato una versione precedente di firefox (versione 33) per escludere quel punto.

Mi sono anche assicurato che le mie modifiche al codice non costituissero il motivo per cui si verificava un arresto anomalo costruendo un firefox pulito e non modificato. Anche il selenio non funziona con questo firefox.

Se non si specifica un file binario di firefox e si consente a Selenium di utilizzare Firefox installato, tutto funziona correttamente. Quindi la mia ipotesi è che qualcosa non funzioni con la build di firefox, cosa che ho fatto esattamente come menzionato nella documentazione online (ad esempio ./mach build).

Qualcuno ha un'idea, quale potrebbe essere il mio errore? Qualsiasi aiuto è molto apprezzato!

Alcune informazioni di configurazione:

  • Firefox 33
  • Selenio 2.44.0
  • Python 3.4 (anche provato 2.7, non funziona neanche)
  • Firefox costruire con Ubuntu 14.04
+0

E 'questo un problema sporadico o costante? Sto vedendo anche questo, ma solo qualche volta (FF34, selenio2.44.0, python2.7, ubuntu12.04). Trovo strano che questo stia succedendo a te a metà sceneggiatura. NOTA che il profilo predefinito viene salvato nella directory/tmp a meno che tu non ne specifichi uno nuovo, quindi assicurati di non avere script o altro che possa eliminare il profilo. – Justin

risposta

11

Ho passato molto tempo a eseguire il debug di questo e alla fine ho rinunciato a provare a rendere versioni incompatibili del lavoro selenio/firefox. Non ho l'esperienza in Firefox per andare oltre. La mia raccomandazione è scaricare versioni stabili da https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/ e continuare a provare combinazioni di firefox/selenio che funzionano per il tuo ambiente. Per me, questo è:

Firefox == 32.0.3 selenio == 2.43.0

mi riferisco al changelog qui: http://selenium.googlecode.com/git/java/CHANGELOG per vedere quali versioni sono presumibilmente compatibili.

In pratica, il webdriver sta eseguendo il polling sulla sua porta fino a quando non è possibile stabilire una connessione socket.

def _wait_until_connectable(self): 
    """Blocks until the extension is connectable in the firefox.""" 
    count = 0 
    while not utils.is_connectable(self.profile.port): 
     if self.process.poll() is not None: 
      # Browser has exited 
      raise WebDriverException("The browser appears to have exited " 
        "before we could connect. If you specified a log_file in " 
        "the FirefoxBinary constructor, check it for details.") 
     if count == 30: 
      self.kill() 
      raise WebDriverException("Can't load the profile. Profile " 
        "Dir: %s If you specified a log_file in the " 
        "FirefoxBinary constructor, check it for details.") 
     count += 1 
     time.sleep(1) 
    return True 

E quindi se c'è un errore di socket, andare avanti. Quindi quello che probabilmente stai vedendo (almeno quello che sono) è il browser sospeso per 30 secondi.

def is_connectable(port): 
    """ 
    Tries to connect to the server at port to see if it is running. 

    :Args: 
    - port: The port to connect. 
    """ 
    try: 
     socket_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     socket_.settimeout(1) 
     socket_.connect(("127.0.0.1", port)) 
     socket_.close() 
     return True 
    except socket.error: 
     return False 

Bleh. Bene, ho finalmente deciso di archiviare la versione specifica che desidero e passare alla versione di selenio compatibile.

bin_dir = os.path.join(const.WEBDRIVER_DIR, 'firefox', 'binary', '32.0.3', 'linux-x86_64', 'firefox') 
binary = FirefoxBinary(firefox_path=bin_dir) 
driver = webdriver.Firefox(firefox_binary=binary) 

Inoltre, consiglio vivamente di aggiungere un file di registro al file binario di firefox e controllarlo. Il tuo problema potrebbe essere unico e gli eventuali errori bizzarri verrà registrato lì:

log_dir = os.path.join(const.LOGS_DIR, 'firefox') 
    try: 
    os.makedirs(directory) 
except OSError, e: 
    if e.errno == errno.EEXIST and os.path.isdir(directory): 
     pass 
log_path = os.path.join(log_dir, '{}.log'.format(datetime.datetime.now().isoformat('_')) 
log_file = open(log_path, 'w') 
binary = FirefoxBinary(firefox_path=bin_dir, log_file=log_file) 
+0

Grazie per il tuo tempo. Durante il debug di questo problema, sono arrivato allo stesso punto di te. Stranamente, le versioni stabili di firefox funzionano come un incantesimo. Sfortunatamente, non posso usare versioni stabili, perché ho apportato alcune modifiche al codice nel codice firefox. Quindi non capisco perché stia funzionando una versione stabile, ma non la mia versione auto-costruita. Tuttavia, grazie per il tuo sforzo! –

-2

ho sofferto lo stesso problema con 36,0 FF.

Si consiglia di aggiornare il pacchetto di selenio all'ultima versione con installazione di pip di cmd -U selenium '.

36

Ubuntu 14.04, firefox 36.0, selenio 2.44.0. Lo stesso problema è stato risolto:

sudo pip install -U selenium 

selenio 2.45.0 è OK con FF36.

aggiornamento: Il selenio 2.53+ è compatibile con FF45

È possibile ottenere più vecchie versioni FF here

+2

Il commento di aggiornamento ha aiutato! Grazie :) –

+0

Questo dovrebbe essere il prossimo passo: http://linuxg.net/how-to-install-firefox-36-on-linux-systems/ ha funzionato per me, grazie – nono

+1

Dopo tanta frustrazione questa è l'unica corrispondenza che ha funzionato per me con Mac OS e Python 3.5 – thecheech

4

trascorso un'ora su questo stesso tema. Per Python3 ricordati di pip3, altrimenti aggiornerà solo il selenio su Python2 e ti verrà chiesto perché non funziona ancora.

sudo pip3 install -U selenium

1

Per El-Capitan, i seguenti fisso:

brew install python

poi

sudo pip install --upgrade selenium