Sélénium en utilisant l'exécutable Python-Geckodriver doit être dans le chemin
je suis nouveau dans la programmation et j'ai commencé avec Python
il y a environ 2 mois et je vais sur le de Sweigart automatiser les trucs ennuyeux avec le texte de Python . J'utilise IDLE et j'ai déjà installé le module sélénium et le navigateur Firefox.
Chaque fois que j'ai essayé d'exécuter la fonction webdriver, je reçois ceci:
from selenium import webdriver
browser = webdriver.Firefox()
Exception: -
Exception ignored in: <bound method Service.__del__ of <selenium.webdriver.firefox.service.Service object at 0x00000249C0DA1080>>
Traceback (most recent call last):
File "C:PythonPython35libsite-packagesseleniumwebdrivercommonservice.py", line 163, in __del__
self.stop()
File "C:PythonPython35libsite-packagesseleniumwebdrivercommonservice.py", line 135, in stop
if self.process is None:
AttributeError: 'Service' object has no attribute 'process'
Exception ignored in: <bound method Service.__del__ of <selenium.webdriver.firefox.service.Service object at 0x00000249C0E08128>>
Traceback (most recent call last):
File "C:PythonPython35libsite-packagesseleniumwebdrivercommonservice.py", line 163, in __del__
self.stop()
File "C:PythonPython35libsite-packagesseleniumwebdrivercommonservice.py", line 135, in stop
if self.process is None:
AttributeError: 'Service' object has no attribute 'process'
Traceback (most recent call last):
File "C:PythonPython35libsite-packagesseleniumwebdrivercommonservice.py", line 64, in start
stdout=self.log_file, stderr=self.log_file)
File "C:PythonPython35libsubprocess.py", line 947, in __init__
restore_signals, start_new_session)
File "C:PythonPython35libsubprocess.py", line 1224, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
browser = webdriver.Firefox()
File "C:PythonPython35libsite-packagesseleniumwebdriverfirefoxwebdriver.py", line 135, in __init__
self.service.start()
File "C:PythonPython35libsite-packagesseleniumwebdrivercommonservice.py", line 71, in start
os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.
je pense que j'ai besoin de définir le chemin pour geckodriver
mais pas sûr comment, donc quelqu'un peut me dire comment faire?
18 réponses
de sélénium.commun.exception.WebDriverException: Message: l'exécutable 'geckodriver' doit être dans le chemin.
en fait, le client Selenium essaie de localiser l'exécutable geckodriver
du système PATH
. Vous devrez ajouter le répertoire contenant l'exécutable vers le chemin du système.
-
sur les systèmes Unix, vous pouvez faire ce qui suit pour l'ajouter au chemin de recherche de votre système, Si vous utilisez un shell compatible bash:
export PATH=$PATH:/path/to/directory/of/executable/downloaded/in/previous/step
-
sous Windows, vous devrez mettre à jour la variable de système de chemin pour ajouter le chemin de répertoire complet à l'exécutable geckodriver manuellement ou ligne de commande (n'oubliez pas de redémarrer votre système après avoir ajouté l'exécutable geckodriver dans le chemin du système pour prendre effet) . Le principe est le même que sur Unix.
Maintenant vous pouvez exécuter votre code comme vous le faites ci-dessous: -
from selenium import webdriver
browser = webdriver.Firefox()
de sélénium.commun.exception.WebDriverException: Message: emplacement binaire attendu du navigateur, mais incapable de trouver binaire par défaut l'emplacement, pas de " moz:firefoxOptions.capacité binaire ' fournie, et aucun drapeau binaire fixé sur la ligne de commande
Exception indique clairement que vous avez installé firefox un autre emplacement pendant que Selenium essaie de trouver firefox et de lancer à partir de l'emplacement par défaut, mais il n'a pas pu trouver. Vous devez fournir explicitement l'emplacement binaire installé par firefox pour lancer firefox comme suit : -
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
binary = FirefoxBinary('path/to/installed firefox binary')
browser = webdriver.Firefox(firefox_binary=binary)
cette étape résolue pour moi sur ubuntu firefox 50.
-
télécharger geckodriver
-
Copie geckodriver dans /usr/local/bin
vous N'avez pas besoin d'ajouter
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
firefox_capabilities['binary'] = '/usr/bin/firefox'
browser = webdriver.Firefox(capabilities=firefox_capabilities)
ça m'a résolu le problème.
from selenium import webdriver
driver = webdriver.Firefox(executable_path=r'your\path\geckodriver.exe')
driver.get('http://inventwithpython.com')
la réponse de @saurabh résout le problème, mais n'explique pas pourquoi automatise les trucs ennuyeux avec Python n'inclut pas ces étapes.
Ceci est causé par le livre étant basé sur le sélénium 2.x et le pilote Firefox pour cette série n'a pas besoin du pilote gecko. L'interface Gecko pour piloter le navigateur n'était pas disponible au moment du développement de selenium.
la dernière version dans le le sélénium 2.la série x est 2.53.6 (voir e.g cela répond , pour une meilleure visibilité sur les versions).
Le 2.53.6 page de la version ne parle pas de gecko. Mais depuis la version 3.0.2 la documentation indique explicitement vous devez installer le pilote gecko.
si après une mise à niveau (ou une installation sur un nouveau système), votre logiciel qui a fonctionné correctement avant (ou sur votre ancien système) ne travailler plus et vous êtes pressé, épingler la version sélénium dans votre virtualenv en faisant
pip install selenium==2.53.6
mais bien sûr la solution à long terme pour le développement est de configurer un nouveau virtualenv avec la dernière version de sélénium, installer le pilote gecko et tester si tout fonctionne toujours comme prévu. Mais le bump de version majeure pourrait introduire d'autres changements D'API qui ne sont pas couverts par votre livre, donc vous pourriez vouloir s'en tenir à l'ancien sélénium, jusqu'à ce que vous êtes sûr assez pour que vous puissiez corriger vous-même toute divergence entre l'API selenium2 et selenium3.
pour configurer geckodriver pour le python de sélénium:
il doit définir geckodriver path avec FirefoxDriver comme code ci-dessous:
self.driver = webdriver.Firefox(executable_path = 'D:\Selenium_RiponAlWasim\geckodriver-v0.18.0-win64\geckodriver.exe')
télécharger geckodriver pour votre système d'exploitation approprié (à partir de https://github.com/mozilla/geckodriver/releases ) - > L'extraire dans un dossier de votre choix -> définir le chemin correctement comme indiqué ci-dessus
j'utilise Python 3.6.2 et Selenium WebDriver 3.4.3 sous Windows 10.
une autre façon de configurer geckodriver:
I) simplement coller le geckodriver.exe under/Python/ Scripts / (dans mon cas, le dossier était: C:\Python36\Scripts)
ii) écrivez maintenant le code simple comme suit:
self.driver = webdriver.Firefox()
Étapes pour MAC:
la solution simple est de télécharger GeckoDriver et de l'ajouter à votre chemin système. Vous pouvez utiliser l'un des deux approches:
Méthode Courte:
1) Téléchargez et décompressez Geckodriver .
2) mentionner le chemin en initialisant le pilote:
driver = webdriver.Firefox(executable_path='/your/path/to/geckodriver')
Méthode Longue:
1) Télécharger et décompresser Geckodriver .
2) Ouvert .bash_profile
. Si vous n'avez pas encore créé, vous pouvez le faire en utilisant la commande: touch ~/.bash_profile
. Puis ouvrez-le en utilisant: open ~/.bash_profile
3) considérant que le fichier GeckoDriver est présent dans votre dossier Téléchargements, vous pouvez ajouter la(Les) ligne (s) suivante (s) au fichier .bash_profile
:
PATH="/Users/<your-name>/Downloads/geckodriver:$PATH"
export PATH
par ceci vous ajoutez le chemin vers GeckoDriver à votre chemin système. Ceci dit l' système où GeckoDriver est situé lors de l'exécution de vos scripts de sélénium.
4) sauvegardez le .bash_profile
et forcez-le à s'exécuter. Cette charge les valeurs immédiatement sans avoir à redémarrer. Pour ce faire, vous pouvez exécuter la commande suivante:
source ~/.bash_profile
5) C'est ça. Vous avez TERMINÉ!. Vous pouvez lancer le script Python maintenant.
j'ai découvert que vous pouvez utiliser le dernier geckodriver sans le mettre dans le chemin du système. Actuellement j'utilise
https://github.com/mozilla/geckodriver/releases/download/v0.12.0/geckodriver-v0.12.0-win64.zip
Firefox 50.1.0
Python 3.5.2
sélénium 3.0.2
Windows 10
je suis à court d'un VirtualEnv (que je gère en utilisant PyCharm, je suppose Qu'il utilise Pip pour tout installer)
dans le code suivant, je peux utiliser un chemin spécifique pour le geckodriver en utilisant le paramateur_path exécutable (Je l'ai découvert en regardant dans Lib\site-packages\selenium\webdriver\firefox\webdriver.py ). Notez que je soupçonne que l'ordre des arguments des paramètres lors de l'appel du webdriver est important, c'est pourquoi l'exécutable_path est dernier dans mon code (2ème dernière ligne à l'extrême droite))
vous pouvez aussi remarquer que j'utilise un profil firefox personnalisé pour contourner le problème sec_error_unknown_issuer que vous rencontrerez si le site que vous testez possède un certificat non fiable. voir comment désactiver L'avertissement de connexion non fiable de Firefox en utilisant du sélénium?
après enquête, il a été constaté que le conducteur de la marionnette est incomplet et toujours en cours, et aucune quantité de réglage de diverses capacités ou de profil les options pour congédier ou établir des certificats allaient fonctionner. Donc, c'était juste plus facile d'utiliser un profil personnalisé.
en tout cas voici le code sur la façon dont j'ai fait fonctionner le geckodriver sans être dans le chemin:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
#you probably don't need the next 3 lines they don't seem to work anyway
firefox_capabilities['handleAlerts'] = True
firefox_capabilities['acceptSslCerts'] = True
firefox_capabilities['acceptInsecureCerts'] = True
#In the next line I'm using a specific FireFox profile because
# I wanted to get around the sec_error_unknown_issuer problems with the new Firefox and Marionette driver
# I create a FireFox profile where I had already made an exception for the site I'm testing
# see https://support.mozilla.org/en-US/kb/profile-manager-create-and-remove-firefox-profiles#w_starting-the-profile-manager
ffProfilePath = 'D:\Work\PyTestFramework\FirefoxSeleniumProfile'
profile = webdriver.FirefoxProfile(profile_directory=ffProfilePath)
geckoPath = 'D:\Work\PyTestFramework\geckodriver.exe'
browser = webdriver.Firefox(firefox_profile=profile, capabilities=firefox_capabilities, executable_path=geckoPath)
browser.get('http://stackoverflow.com')
J'utilise Windows 10 et cela a fonctionné pour moi:
- télécharger geckodriver de ici . Téléchargez la bonne version pour l'ordinateur que vous utilisez
- décompressez le fichier que vous venez de télécharger et découpez/Copiez le".exe "fichier qu'il contient
- naviguez vers C: {votre dossier racine de python}. Le mien était C:\Python27. Coller le geckodriver.fichier exe dans ce dossier.
- redémarrez votre environnement de développement.
- essayez d'exécuter le code à nouveau, il devrait fonctionner maintenant.
quelques commentaires/clarifications supplémentaires pour les futurs lecteurs de ce fil:
la résolution suivante suffit pour Windows 7, Python 3.6, sélénium 3.11:
la note de @dsalaj dans ce thread ci-dessus pour Unix s'applique aussi à Windows; bricolage avec le chemin env. variable au niveau des fenêtres et le redémarrage du système de fenêtres peut être évité.
(1) Télécharger geckodriver (comme décrit dans ce fil plus tôt) et de placer le geckdriver (unzipped).exe at X:\Folder\of\your\choice
(2) Exemple de code Python:
import os;
os.environ["PATH"] += os.pathsep + r'X:\Folder\of\your\choice';
from selenium import webdriver;
browser = webdriver.Firefox();
browser.get('http://localhost:8000')
assert 'Django' in browser.title
Notes:
(1) cela peut prendre environ 10 secondes pour que le code ci-dessus ouvre le navigateur Firefox pour l'url spécifiée.
(2) la console python affichera l'erreur suivante s'il n'y a pas de serveur déjà tournant à l'url spécifiée ou servant une page avec le titre contenant la chaîne de caractères 'Django':
nium.commun.exception.WebDriverException: Message: Atteint page d'erreur: sujet:neterror?e=connexion & u = http%3A/ / localhost%3A8000/ & c=UTF-8&f=regular&d=Firefox%20can%E2 % 80% 9
si vous utilisez Anaconda , tout ce que vous avez à faire est d'activer votre environnement virtuel et ensuite installer geckodriver en utilisant la commande :
conda install -c conda-forge geckodriver
il est vraiment assez triste qu'aucun des livres publiés sur Selenium/Python et la plupart des commentaires sur cette question via Google n'expliquent pas clairement la logique de mise en place de ce système sur Mac (tout est Windows!!!!). La ses youtubes tous ramassage à "l'après" vous avez le cheminement de l'installation (dans mon esprit, le bon moyen de sortir!). Ainsi, pour les merveilleux utilisateurs de Mac, utilisez ce qui suit pour éditer vos fichiers de chemin de bash:
>$touch ~/.bash_profile; ouvrir ~ / .bash_profile
puis Ajouter un chemin quelque chose comme ça.... * # Définir le chemin pour geckodriver PATH= " / usr / bin/geckodriver: $ {PATH}" export PATH
Réglage de CHEMIN pour le Sélénium firefox
PATH="~/Users/yourNamePATH/VEnvPythonInterpreter/lib/python2.7/site-packages/selenium/webdriver/firefox/:${PATH}" export PATH
chemin de paramétrage pour l'exécutable sur le pilote firefox
PATH="/Users/yournamePATH/VEnvPythonInterpreter/lib/python2.7/site-packages/selenium/webdriver/common/service.py:${PATH}" voie d'exportation *
ça a marché pour moi. Ma préoccupation est de savoir quand la communauté Selenium Windows commencera à jouer le vrai jeu et à inclure les utilisateurs Mac dans leur club arrogant.
sélénium répond à cette question dans leur DESCRIPTION.rst
Drivers
=======
Selenium requires a driver to interface with the chosen browser. Firefox,
for example, requires `geckodriver <https://github.com/mozilla/geckodriver/releases>`_, which needs to be installed before the below examples can be run. Make sure it's in your `PATH`, e. g., place it in `/usr/bin` or `/usr/local/bin`.
Failure to observe this step will give you an error `selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.
il suffit simplement de télécharger le geckodriver, de le déballer et de déplacer l'exécutable dans votre dossier / usr / bin
Mac 10.12.1 python 2.7.10 ce travail pour moi :)
def download(url):
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
browser = webdriver.Firefox(capabilities=firefox_capabilities,
executable_path=r'/Users/Do01/Documents/crawler-env/geckodriver')
browser.get(url)
return browser.page_source
sur Raspberry Pi j'ai dû créer à partir du pilote ARM et régler le geckodriver et le chemin de log in:
sudo nano /usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py
def __init__(self, firefox_profile=None, firefox_binary=None,
timeout=30, capabilities=None, proxy=None,
executable_path="/PATH/gecko/geckodriver",
firefox_options=None,
log_path="/PATH/geckodriver.log"):
Visit Gecko Driver obtenir l'url pour le pilote gecko à partir de la section Téléchargements.
Clone ce repo https://github.com/jackton1/script_install.git
cd script_install
Exécuter
./installer --gecko-driver url_to_gecko_driver
J'utilise Windows 10 et Anaconda2. J'ai essayé de définir la variable de chemin du système mais ça n'a pas marché. Puis j'ai simplement ajouté geckodriver.le fichier exe vers le dossier Anaconda2 / Scripts et tout fonctionne très bien maintenant. Pour moi le chemin était: -
C:\Users\Bhavya\Anaconda2\Scripts