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:
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
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)
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
Pour El-Capitan, les points suivants ont été corrigés:
brew install python
puis
Sudo pip install --upgrade Selenium