2014-12-05 17 views
27

dla moich badań, zrobiłem pewne modyfikacje kodu źródłowego w firefoxie i sam go zbudowałem. Aby zautomatyzować testowanie, zdecydowałem się użyć Selenium, ale niestety, mój nowo zbudowany Firefox wydaje się nie obsługiwać Selenium.Firefox Build nie działa z Selenium

Zrobiłem następujące:

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

przeglądarki Firefox nie otwiera i reaguje (mogę wpisać na stronie internetowej w pasku wyszukiwania). Ale po jakimś czasie, skrypt Pythona wywala się z następującym komunikatem o błędzie:

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. 

Zrobiłem Google, że komunikat o błędzie i większość rozwiązań sugeruje, że należy aktualizować selen, ponieważ nie obsługuje wersji Firefoksa używany. Niestety, zainstalowałem najnowszą wersję selenu (2.44.0) i użyłem nawet starszej wersji firefox (wersja 33), aby wykluczyć ten punkt.

Upewniłem się również, że moje modyfikacje kodu nie powodują awarii przez zbudowanie czystego, niezmodyfikowanego Firefoxa. Selen też nie działa z tym firefoxem.

Jeśli nie określę pliku binarnego firefox i niech Selenium używa zainstalowanej przeglądarki Firefox, wszystko działa poprawnie. Zgaduję więc, że coś jest nie tak z budową firefox, co zrobiłem dokładnie tak, jak wspomniano w dokumentacji online (np. ./mach build).

Czy ktoś ma pomysł, jaki może być mój błąd? Każda pomoc jest bardzo cenna!

Niektóre informacje setup:

  • Firefox 33
  • Selen 2.44.0
  • Python 3.4 (również próbował 2,7, nie działa albo)
  • Firefox budować z Ubuntu 14.04
+0

Czy jest to sporadyczny problem lub spójne? Widzę to również, ale tylko czasami (FF34, selenium2.44.0, python2.7, ubuntu12.04). Uważam, że to dziwne, że to się dzieje z twoim scenariuszem. UWAGA: domyślny profil zostanie zapisany w katalogu/tmp, chyba że wybierzesz nowy, więc upewnij się, że nie masz żadnych skryptów ani niczego, co mogłoby usunąć profil. – Justin

Odpowiedz

11

Spędziłem dużo czasu na debugowaniu tego i ostatecznie zrezygnowałem z prób tworzenia niekompatybilnych wersji selen/firefox. Po prostu nie mam doświadczenia w dziedzinie firefox, żeby pójść dalej. Moją rekomendacją jest pobieranie stabilnych wersji z https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/ i kontynuowanie prób łączenia kombinacji firefox/selen, które działają w twoim środowisku. Dla mnie jest to:

firefox == 32.0.3 selen == 2.43.0

mam na myśli changelogu tutaj: http://selenium.googlecode.com/git/java/CHANGELOG aby sprawdzić, które wersje są rzekomo zgodne.

Zasadniczo, co się dzieje, jest to, że webdriver odpytuje swój port, dopóki nie ustanowi połączenia z gniazdem.

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 

A jeśli wystąpi błąd gniazda, kontynuuj. Więc to, co prawdopodobnie widzisz (przynajmniej to, czym jestem) to przeglądarka zawieszona na 30 sekund.

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. W porządku, w końcu zdecydowałem się zapisać konkretną wersję, którą chcę i przejść do kompatybilnej wersji selenowej.

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) 

Bardzo polecam również dodanie pliku dziennika do pliku binarnego Firefoksa i sprawdzenie go. Twój problem może być unikalny i zostaną tam zarejestrowane dziwne błędy:

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

Dziękuję za twój czas. Podczas debugowania tego problemu dotarłem do tego samego punktu co Ty. Dziwne, że stabilne wersje firefox działają jak urok. Niestety nie mogę używać stabilnych wersji, ponieważ dokonałem pewnych modyfikacji kodu w kodzie firefox. Więc nie rozumiem, dlaczego działa stabilna wersja, ale moja wersja nie jest wbudowana. Niemniej jednak za twój wysiłek! –

-2

Ten sam problem wystąpił w przypadku FF 36,0.

Zalecam zaktualizować pakiet selenu do najnowszej wersji za pomocą cmd "pip install -U selenium".

36

Ubuntu 14.04, firefox 36.0, selen 2,44.0. Ten sam problem został rozwiązany przez:

sudo pip install -U selenium 

Selen 2.45.0 jest OK z FF36.

zmiana: Selen 2.53+ jest kompatybilny z FF45

Można dostać starsze wersje FF here

+2

Komentarz do aktualizacji pomógł! Dzięki :) –

+0

To powinien być następny krok: http://linuxg.net/how-to-install-firefox-36-on-linux-systems/ to zadziałało dla mnie, dzięki – nono

+1

Po tak wielu frustracjach jest to jedyny mecz, który pracował dla mnie z Mac OS i Pythonem 3.5 – thecheech

4

spędziłem godzinę w tej samej kwestii. W przypadku Python3 pamiętaj o pip3, w przeciwnym razie tylko ulepszy selen w Python2, a będziesz zastanawiać się, dlaczego wciąż nie działa.

sudo pip3 install -U selenium

1

Dla El-Capitan, Poniższe stałe:

brew install python

następnie

sudo pip install --upgrade selenium

Powiązane problemy