Ich bin neu im Programmieren und habe vor etwa 2 Monaten mit Python
angefangen und gehe über Sweigarts Automate the Boring Stuff mit Python text. Ich benutze IDLE und habe bereits das Selenium-Modul und den Firefox-Browser installiert ... Wenn ich versucht habe, die Webtreiber-Funktion auszuführen, bekomme ich Folgendes:
from Selenium import webdriver
browser = webdriver.Firefox()
Ausnahme: -
Exception ignored in: <bound method Service.__del__ of <Selenium.webdriver.firefox.service.Service object at 0x00000249C0DA1080>>
Traceback (most recent call last):
File "C:\Python\Python35\lib\site-packages\Selenium\webdriver\common\service.py", line 163, in __del__
self.stop()
File "C:\Python\Python35\lib\site-packages\Selenium\webdriver\common\service.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:\Python\Python35\lib\site-packages\Selenium\webdriver\common\service.py", line 163, in __del__
self.stop()
File "C:\Python\Python35\lib\site-packages\Selenium\webdriver\common\service.py", line 135, in stop
if self.process is None:
AttributeError: 'Service' object has no attribute 'process'
Traceback (most recent call last):
File "C:\Python\Python35\lib\site-packages\Selenium\webdriver\common\service.py", line 64, in start
stdout=self.log_file, stderr=self.log_file)
File "C:\Python\Python35\lib\subprocess.py", line 947, in __init__
restore_signals, start_new_session)
File "C:\Python\Python35\lib\subprocess.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:\Python\Python35\lib\site-packages\Selenium\webdriver\firefox\webdriver.py", line 135, in __init__
self.service.start()
File "C:\Python\Python35\lib\site-packages\Selenium\webdriver\common\service.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.
Ich denke, ich muss den Pfad für geckodriver
setzen, aber nicht sicher wie, also kann mir jemand sagen, wie ich das machen würde?
Selenium.common.exceptions.WebDriverException: Nachricht: Die 'geckodriver' - ausführbare Datei muss sich in PATH befinden.
Tatsächlich Die Selenium-Clientbindungen versuchen, die ausführbare Datei geckodriver
im System PATH
zu finden. Sie müssen das Verzeichnis mit der ausführbaren Datei zum Systempfad hinzufügen.
Auf Unix-Systemen können Sie Folgendes tun, um es an den Suchpfad Ihres Systems anzufügen, wenn Sie eine bash-kompatible Shell verwenden:
export PATH=$PATH:/path/to/directory/of/executable/downloaded/in/previous/step
Unter Windows müssen Sie die Systemvariable Path aktualisieren, um den vollständigen Verzeichnispfad zur ausführbaren Datei geckodriver _ manuell oder Befehlszeilehinzuzufügen System nach dem Hinzufügen eines ausführbaren Gecko-Treibers in das System PATH, um wirksam zu werden). Das Prinzip ist das gleiche wie bei Unix.
Jetzt können Sie Ihren Code wie folgt ausführen: -
from Selenium import webdriver
browser = webdriver.Firefox()
Selenium.common.exceptions.WebDriverException: Nachricht: Erwarteter binärer Speicherort des Browsers, aber binärer Speicherort kann nicht am Standardspeicherort gefunden werden. Keine 'moz: firefoxOptions.binary'-Funktion und kein binäres Flag in der Befehlszeile gesetzt
Eine Ausnahme gibt eindeutig an, dass Sie Firefox an einem anderen Speicherort installiert haben, während Selenium versucht, Firefox zu finden und vom Standardspeicherort aus zu starten. Sie müssen explizit firefox installierte binäre Position angeben, um Firefox wie folgt zu starten: -
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)
Das hat es für mich gelöst.
from Selenium import webdriver
driver = webdriver.Firefox(executable_path=r'your\path\geckodriver.exe')
driver.get('http://inventwithpython.com')
diese Schritte haben sich für mich auf Ubuntu Firefox 50 gelöst.
Kopieren Sie den Geckodriver nach/usr/local/bin
Sie müssen NICHT hinzufügen
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
firefox_capabilities['binary'] = '/usr/bin/firefox'
browser = webdriver.Firefox(capabilities=firefox_capabilities)
Die Antwort von @saurabh löst das Problem, erklärt jedoch nicht, warum Automate the Boring Stuff mit Python diese Schritte nicht enthält.
Dies ist darauf zurückzuführen, dass das Buch auf Selenium 2.x basiert und der Firefox-Treiber für diese Serie keinen Geckotreiber benötigt. Die Gecko-Oberfläche zum Steuern des Browsers war bei der Entwicklung von Selenium nicht verfügbar.
Die neueste Version in der Selenium 2.x-Serie ist 2.53.6 (siehe diese Antworten , um die Versionen einfacher zu sehen).
Die 2.53.6-Versionsseite erwähnt Gecko überhaupt nicht. Aber seit Version 3.0.2 muss in der Dokumentation explizit angegeben der Geckotreiber installiert werden.
Wenn nach einem Upgrade (oder einer Installation auf einem neuen System) Ihre Software, die vor (oder auf Ihrem alten System) einwandfrei funktioniert hat, nicht mehr funktioniert und Sie es eilig haben, setzen Sie die Selenium-Version in Ihre Virtualenv ein, indem Sie dies tun
pip install Selenium==2.53.6
die langfristige Lösung für die Entwicklung besteht jedoch darin, eine neue virtualenv mit der neuesten Version von Selenium einzurichten, den Geckotreiber zu installieren und zu testen, ob alles noch wie erwartet funktioniert. Der Major-Version-Bump führt jedoch möglicherweise zu anderen API-Änderungen, die nicht in Ihrem Buch enthalten sind. Daher sollten Sie bei dem älteren Selenium bleiben, bis Sie sicher genug sind, dass Sie Abweichungen zwischen der Selenium2- und Selenium3-API selbst beheben können.
Auf macOS mit bereits installiertem Homebrew können Sie einfach den Terminal-Befehl ausführen
$ brew install geckodriver
Da Homebrew die PATH
bereits erweitert hat, müssen keine Startskripts geändert werden.
Geckodriver für Selenium Python einrichten:
Es muss der Geckodriver-Pfad mit FirefoxDriver wie folgt eingestellt werden:
self.driver = webdriver.Firefox(executable_path = 'D:\Selenium_RiponAlWasim\geckodriver-v0.18.0-win64\geckodriver.exe')
Laden Sie geckodriver für Ihr passendes Betriebssystem herunter (von https://github.com/mozilla/geckodriver/releases ) -> Entpacken Sie es in einen Ordner Ihrer Wahl -> Legen Sie den Pfad wie oben erwähnt richtig fest
Ich verwende Python 3.6.2 und Selenium WebDriver 3.4.3 unter Windows 10.
Eine andere Methode zum Einrichten von Geckodriver:
i) Fügen Sie die geckodriver.exe einfach unter/Python/Scripts/ein (in meinem Fall lautete der Ordner: C:\Python36\Scripts)
ii) Schreiben Sie nun den einfachen Code wie folgt:
self.driver = webdriver.Firefox()
Die einfache Lösung ist, GeckoDriver herunterzuladen und zu Ihrem Systempfad hinzuzufügen. Sie können einen der beiden Ansätze verwenden:
1) Laden Sie herunter und entpacken Sie Geckodriver .
2) Erwähnen Sie den Pfad, während Sie den Treiber einleiten:
driver = webdriver.Firefox(executable_path='/your/path/to/geckodriver')
1) Laden Sie herunter und entpacken Sie Geckodriver .
2) Öffnen Sie .bash_profile
. Wenn Sie es noch nicht erstellt haben, können Sie dies mit folgendem Befehl tun: touch ~/.bash_profile
. Dann öffnen Sie es mit: open ~/.bash_profile
3) Wenn sich die GeckoDriver-Datei in Ihrem Downloads-Ordner befindet, können Sie der .bash_profile
-Datei die folgenden Zeilen hinzufügen:
PATH="/Users/<your-name>/Downloads/geckodriver:$PATH"
export PATH
Damit hängen Sie den Pfad zu GeckoDriver an Ihren Systempfad an. Dadurch wird dem System mitgeteilt, wo sich GeckoDriver befindet, wenn Sie Ihre Selenium-Skripts ausführen.
4) Speichern Sie den .bash_profile
und erzwingen Sie die Ausführung. Dadurch werden die Werte sofort geladen, ohne dass ein Neustart erforderlich ist. Dazu können Sie den folgenden Befehl ausführen:
source ~/.bash_profile
5) das ist es. Du bist fertig!. Sie können das Python-Skript jetzt ausführen.
Einige zusätzliche Eingaben/Erläuterungen für zukünftige Leser dieses Threads:
Zur Auflösung von Windows 7, Python 3.6, Selenium 3.11 genügt Folgendes:
@ dsalajs Hinweis in diesem Thread für Unix gilt auch für Windows. basteln mit dem PFAD env. Variable auf Windows-Ebene und Neustart des Windows-Systems können vermieden werden.
(1) Laden Sie geckodriver (wie in diesem Thread zuvor beschrieben) herunter, und platzieren Sie die (entpackte) geckdriver.exe unter X:\Folder\of\your\choice
(2) Python-Codebeispiel:
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
Anmerkungen: (1) Es kann ungefähr 10 Sekunden dauern, bis der obige Code den Firefox-Browser für die angegebene URL öffnet.
(2) Die Python-Konsole zeigt den folgenden Fehler an, wenn auf der angegebenen URL kein Server ausgeführt wird oder eine Seite mit dem Titel mit der Zeichenfolge 'Django' angezeigt wird: Selenium.common.exceptions.WebDriverException: Nachricht: Erreichte Fehlerseite: about: neterror? E = Verbindungsfehler & u = http% 3A // localhost% 3A8000/& c = UTF-8 & f = normal & d = Firefox% 20can% E2% 80%
Der einfachste Weg für Fenster!
Ich habe gerade die neueste Version von geckodriver (ich habe win10) von here heruntergeladen und hinzugefügt, dass geckodriver.exe Datei im Python-Verzeichnis C:\Users\my.name
(was sich bereits in PATH befindet) Es hat für mich gearbeitet!
Ich benutze Windows 10 und das hat für mich funktioniert:
Dies sollte auch für Mac oder andere * nix-Varianten funktionieren.
export GV=v0.24.0
wget "https://github.com/mozilla/geckodriver/releases/download/$GV/geckodriver-$GV-linux64.tar.gz"
tar xvzf geckodriver-$GV-linux64.tar.gz
chmod +x geckodriver
Sudo cp geckodriver /usr/local/bin/
Ich habe herausgefunden, dass Sie den neuesten Gecko-Treiber verwenden können, ohne ihn in den Systempfad zu setzen. Momentan benutze ich
https://github.com/mozilla/geckodriver/releases/download/v0.12.0/geckodriver-v0.12.0-win64.Zip
Firefox 50.1.0
Python 3.5.2
Selen 3.0.2
Windows 10
Ich betreibe ein VirtualEnv (das ich mit PyCharm verwalte, ich nehme an, es verwendet Pip, um alles zu installieren)
Im folgenden Code kann ich einen bestimmten Pfad für den Geckodriver verwenden, der den Parameter "executable_path" verwendet (ich habe dies durch einen Blick in Lib\site-packages\Selenium\webdriver\firefox\webdriver.py entdeckt). Hinweis Ich habe den Verdacht, dass die Reihenfolge der Parameterargumente beim Aufruf des Webtreibers wichtig ist. Aus diesem Grund ist der ausführbare_Pfad der letzte in meinem Code (2. Zeile ganz rechts).
Möglicherweise stellen Sie auch fest, dass ich ein benutzerdefiniertes Firefox-Profil verwende, um das Problem sec_error_unknown_issuer zu umgehen, auf das Sie stoßen werden, wenn die von Ihnen getestete Site über ein nicht vertrauenswürdiges Zertifikat verfügt. see Wie deaktiviere ich die Warnung von Firefox für nicht vertrauenswürdige Verbindungen mit Selenium?
Nach einer Untersuchung stellte sich heraus, dass der Marionettentreiber unvollständig ist und sich noch in Bearbeitung befindet, und dass es nicht möglich war, verschiedene Funktionen oder Profiloptionen für das Ablehnen oder Einstellen von Zertifikaten festzulegen. Daher war es einfacher, ein benutzerdefiniertes Profil zu verwenden.
Wie auch immer, hier ist der Code, wie ich den Gecko-Treiber zum Laufen gebracht habe, ohne im Pfad zu sein:
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')
Es ist wirklich ziemlich schade, dass keines der auf Selenium/Python veröffentlichten Bücher und die meisten Kommentare zu diesem Thema über Google die Pfadlogik für das Einrichten auf dem Mac nicht eindeutig erklären (alles ist Windows !!!!). Die Youtubes holen alle am "after" ab und haben die Pfadeinstellung (in meinen Augen der billige Ausweg!). Verwenden Sie für wundervolle Mac-Benutzer die folgenden Schritte, um Ihre Bash-Pfaddateien zu bearbeiten:
> $ touch ~/.bash_profile; Öffnen Sie ~/.bash_profile
Fügen Sie dann einen Pfad in etwa wie folgt hinzu: .... * # PATH für Geckodriver festlegen PATH = "/ usr/bin/geckodriver: $ {PATH}" Export PATH
PATH = “~/Users/yourNamePATH/VEnvPythonInterpreter/lib/python2.7/site-packages/Selenium/webdriver/firefox /: $ {PATH}” Export PATH
PATH = "/ Benutzer/Ihr NamePATH/VEnvPythonInterpreter/lib/python2.7/site-packages/Selenium/webdriver/common/service.py: $ {PATH}" Export PATH *
Das hat bei mir funktioniert. Meine Sorge ist, wann die Selenium Windows Community das echte Spiel spielen wird und uns Mac-Benutzer in ihre arrogante Clubmitgliedschaft aufnehmen wird.
Selen beantwortet diese Frage in ihrer 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.
Laden Sie den Geckodriver einfach herunter, entpacken Sie ihn und verschieben Sie die ausführbare Datei in Ihren Ordner/usr/bin
Besuchen Sie Gecko Driver Holen Sie sich die URL für den Geckotreiber im Downloadbereich.
Klonen Sie dieses Repo https://github.com/jackton1/script_install.git
cd script_install
Lauf
./installer --gecko-driver url_to_gecko_driver
Ich verwende Windows 10 und Anaconda2. Ich habe versucht, die Systempfadvariable einzustellen, habe aber nicht geklappt. Dann fügte ich einfach die Datei geckodriver.exe zum Ordner Anaconda2/Scripts hinzu und alles funktioniert jetzt großartig . Für mich war der Pfad: -
C:\Benutzer\Bhavya\Anaconda2\Scripts
Wenn Sie die Treiberpfade unter Windows 10 hinzufügen möchten:
Klicken Sie mit der rechten Maustaste auf das Symbol "Dieser PC" und wählen Sie "Eigenschaften"
Klicken Sie auf "Erweiterte Systemeinstellungen"
Mac 10.12.1 Python 2.7.10 .__ diese Arbeit für mich :)
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
Auf Raspberry Pi musste ich vom Treiber ARM erstellen und den Geckodriver- und Protokollpfad festlegen:
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"):
Für Windows-Benutzer
verwenden Sie den Originalcode wie folgt:
from Selenium import webdriver
browser = webdriver.Firefox()
driver.get("https://www.google.com")
laden Sie dann den Treiber herunter von: mozilla/geckodriver
Platziere es in einem festen Pfad (permanent). Als Beispiel füge ich es ein:
C:\Python35
Gehen Sie dann zu den Umgebungsvariablen des Systems, suchen Sie im Raster "Systemvariablen" nach Pfadvariable und fügen Sie Folgendes hinzu:
; C:\Python35\geckodriver
geckodriver, nicht geckodriver.exe .