web-dev-qa-db-fra.com

Firefox Build ne fonctionne pas avec Selenium

pour mes recherches, j'ai fait quelques modifications de code source dans Firefox et je l'ai construit moi-même. Afin d'automatiser les tests, j'ai choisi d'utiliser Selenium mais malheureusement, mon nouveau Firefox semble ne pas prendre en charge Selenium.

J'ai fait ce qui suit:

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

Le Firefox s'ouvre et est réactif (je peux entrer un site Web dans la barre de recherche). Mais après un certain temps, le script python se bloque avec le message d'erreur suivant:

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.

J'ai fait google ce message d'erreur et la plupart des solutions suggérées, que je devrais mettre à jour Selenium car il ne prend pas en charge la version Firefox utilisée. Malheureusement, j'ai installé la dernière version de Selenium (2.44.0) et j'ai même utilisé une ancienne version de firefox (version 33) pour écarter ce point.

J'ai également veillé à ce que mes modifications de code ne soient pas la cause de ce plantage en construisant un firefox propre et non modifié. Selenium ne fonctionne pas non plus avec ce firefox.

Si je ne spécifie pas de binaire firefox et que je laisse Selenium utiliser le Firefox installé, tout fonctionne bien. Donc, je suppose que quelque chose ne va pas avec la construction de Firefox, ce que j'ai fait exactement comme mentionné dans la documentation en ligne (par exemple, la construction ./mach).

Quelqu'un at-il une idée, quelle pourrait être mon erreur? Toute aide est grandement appréciée!

Quelques informations de configuration:

  • Firefox 33
  • Sélénium 2.44.0
  • Python 3.4 (également essayé 2.7, ne fonctionne pas non plus)
  • Construire Firefox avec Ubuntu 14.04
29
Thomas Müller

Ubuntu 14.04, firefox 36.0, Selenium 2.44.0. Le même problème a été résolu par:

Sudo pip install -U Selenium

Le sélénium 2.45.0 est OK avec FF36.

mise à jour: Selenium 2.53+ est compatible avec FF45

Vous pouvez obtenir des versions FF plus anciennes ici

38
zesaver

J'ai passé beaucoup de temps à déboguer cela et j'ai finalement renoncé à essayer de faire fonctionner des versions incompatibles de Selenium/firefox. Je n'ai tout simplement pas l'expertise de Firefox pour aller plus loin. Ma recommandation est de télécharger des versions stables à partir de https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/ et continuez d'essayer des combinaisons de firefox/Selenium qui fonctionnent pour votre environnement. Pour moi, c'est:

firefox == 32.0.3 Sélénium == 2.43.0

Je fais référence au journal des modifications ici: http://Selenium.googlecode.com/git/Java/CHANGELOG pour voir quelles versions sont censées être compatibles.

Fondamentalement, ce qui se passe, c'est que le pilote Web interroge son port jusqu'à ce qu'il puisse établir une connexion 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

Et puis s'il y a une erreur de socket, continuez. Donc ce que vous voyez probablement (du moins ce que je suis) est le navigateur suspendu pendant 30 secondes.

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. Bon, eh bien j'ai finalement décidé de stocker la version spécifique que je veux et de passer à la version compatible Selenium.

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)

Je recommande également fortement d'ajouter un fichier journal au binaire firefox et de le vérifier. Votre problème peut être unique et toute erreur bizarre y sera enregistrée:

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)
11
Justin

J'ai passé une heure sur ce même problème. Pour Python3, n'oubliez pas de pip3, sinon il ne mettra à niveau Selenium que sur Python2, et vous vous demanderez pourquoi cela ne fonctionne toujours pas.

Sudo pip3 install -U Selenium

4
MisterRios

Pour El-Capitan, les points suivants ont été corrigés:

brew install python

puis

Sudo pip install --upgrade Selenium

2
Mesut GÜNEŞ