问题
I\'m new to programming and started with Python
about 2 months ago and am going over Sweigart\'s Automate the Boring Stuff with Python text. I\'m using IDLE and already installed the selenium module and the Firefox browser.
Whenever I tried to run the webdriver function, I get this:
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:\\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.
I think I need to set the path for geckodriver
but not sure how, so can anyone tell me how would I do this?
回答1:
selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.
First of all you will need to download latest executable geckodriver from here to run latest firefox using selenium
Actually The Selenium client bindings tries to locate the geckodriver
executable from the system PATH
. You will need to add the directory containing the executable to the system path.
On Unix systems you can do the following to append it to your system’s search path, if you’re using a bash-compatible shell:
export PATH=$PATH:/path/to/directory/of/executable/downloaded/in/previous/step
On Windows you will need to update the Path system variable to add the full directory path to the executable geckodriver manually or command line(don't forget to restart your system after adding executable geckodriver into system PATH to take effect). The principle is the same as on Unix.
Now you can run your code same as you're doing as below :-
from selenium import webdriver
browser = webdriver.Firefox()
selenium.common.exceptions.WebDriverException: Message: Expected browser binary location, but unable to find binary in default location, no 'moz:firefoxOptions.binary' capability provided, and no binary flag set on the command line
Exception clearly states you have installed firefox some other location while Selenium is trying to find firefox and launch from default location but it couldn't find. You need to provide explicitly firefox installed binary location to launch firefox as below :-
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)
回答2:
This solved it for me.
from selenium import webdriver
driver = webdriver.Firefox(executable_path=r'your\path\geckodriver.exe')
driver.get('http://inventwithpython.com')
回答3:
this steps SOLVED for me on ubuntu firefox 50.
Download geckodriver
Copy geckodriver in /usr/local/bin
You do NOT need to add
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
firefox_capabilities['binary'] = '/usr/bin/firefox'
browser = webdriver.Firefox(capabilities=firefox_capabilities)
回答4:
The answer by @saurabh solves the issue, but doesn't explain why Automate the Boring Stuff with Python doesn't include those steps.
This is caused by the book being based on selenium 2.x and the Firefox driver for that series does not need the gecko driver. The Gecko interface to drive the browser was not available when selenium was being developed.
The latest version in the selenium 2.x series is 2.53.6 (see e.g this answers, for an easier view of the versions).
The 2.53.6 version page doesn't mention gecko at all. But since version 3.0.2 the documentation explicitly states you need to install the gecko driver.
If after an upgrade (or install on a new system), your software that worked fine before (or on your old system) doesn't work anymore and you are in a hurry, pin the selenium version in your virtualenv by doing
pip install selenium==2.53.6
but of course the long term solution for development is to setup a new virtualenv with the latest version of selenium, install the gecko driver and test if everything still works as expected. But the major version bump might introduce other API changes that are not covered by your book, so you might want to stick with the older selenium, until you are confident enough that you can fix any discrepancies between the selenium2 and selenium3 API yourself.
回答5:
On macOS with Homebrew already installed you can simply run the Terminal command
$ brew install geckodriver
Because homebrew already did extend the PATH
there's no need to modify any startup scripts.
回答6:
To set up geckodriver for Selenium Python:
It needs to set geckodriver path with FirefoxDriver as below code:
self.driver = webdriver.Firefox(executable_path = 'D:\Selenium_RiponAlWasim\geckodriver-v0.18.0-win64\geckodriver.exe')
Download geckodriver for your suitable OS (from https://github.com/mozilla/geckodriver/releases) -> Extract it in a folder of your choice -> Set the path correctly as mentioned above
I'm using Python 3.6.2 and Selenium WebDriver 3.4.3 in Windows 10.
Another way to set up geckodriver:
i) Simply paste the geckodriver.exe under /Python/Scripts/ (In my case the folder was: C:\Python36\Scripts)
ii) Now write the simple code as below:
self.driver = webdriver.Firefox()
回答7:
Steps for MAC:
The simple solution is to download GeckoDriver and add it to your system PATH. You can use either of the two approaches:
Short Method:
1) Download and unzip Geckodriver.
2) Mention the path while initiating the driver:
driver = webdriver.Firefox(executable_path='/your/path/to/geckodriver')
Long Method:
1) Download and unzip Geckodriver.
2) Open .bash_profile
. If you haven't created it yet, you can do so using the command: touch ~/.bash_profile
. Then open it using: open ~/.bash_profile
3) Considering GeckoDriver file is present in your Downloads folder, you can add the following line(s) to the .bash_profile
file:
PATH="/Users/<your-name>/Downloads/geckodriver:$PATH"
export PATH
By this you are appending the path to GeckoDriver to your System PATH. This tells the system where GeckoDriver is located when executing your Selenium scripts.
4) Save the .bash_profile
and force it to execute. This loads the values immediately without having to reboot. To do this you can run the following command:
source ~/.bash_profile
5) That's it. You are DONE!. You can run the Python script now.
回答8:
If you are using Anaconda, all you have to do is activate your virtual environment and then install geckodriver using the following command:
conda install -c conda-forge geckodriver
回答9:
Ubuntu 18.04+ and Newest release of geckodriver
This should also work for other *nix varieties as well.
export GV=v0.26.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/
For mac update to:
geckodriver-$GV-macos.tar.gz
回答10:
The easiest way for windows!
Download the latest version of geckodriver
from here. Add the geckodriver.exe file to the python directory (or any other directory which already in PATH
). This should solve the problem (Tested on Windows 10)
回答11:
Some additional input/clarification for future readers of this thread:
The following suffices as a resolution for Windows 7, Python 3.6, selenium 3.11:
@dsalaj's note in this thread earlier for Unix is applicable to Windows as well; tinkering with the PATH env. variable at the Windows level and restart of the Windows system can be avoided.
(1) Download geckodriver (as described in this thread earlier) and place the (unzipped) geckdriver.exe at X:\Folder\of\your\choice
(2) Python code sample:
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) It may take about 10 seconds for the above code to open up the Firefox browser for the specified url.
(2) The python console would show the following error if there's no server already running at the specified url or serving a page with the title containing the string 'Django':
selenium.common.exceptions.WebDriverException: Message: Reached error page: about:neterror?e=connectionFailure&u=http%3A//localhost%3A8000/&c=UTF-8&f=regular&d=Firefox%20can%E2%80%9
回答12:
I've actually discovered you can use the latest geckodriver with out putting it in the system path. Currently I'm using
https://github.com/mozilla/geckodriver/releases/download/v0.12.0/geckodriver-v0.12.0-win64.zip
Firefox 50.1.0
Python 3.5.2
Selenium 3.0.2
Windows 10
I'm running a VirtualEnv (which I manage using PyCharm, I assume it uses Pip to install everything)
In the following code I can use a specific path for the geckodriver using the executable_path paramater (I discoverd this by having a look in Lib\site-packages\selenium\webdriver\firefox\webdriver.py ). Note I have a suspicion that the order of parameter arguments when calling the webdriver is important, which is why the executable_path is last in my code (2nd last line off to the far right)
You may also notice I use a custom firefox Profile to get around the sec_error_unknown_issuer problem that you will run into if the site you're testing has an untrusted certificate. see How to disable Firefox's untrusted connection warning using Selenium?
AFter investigation it was found that the Marionette driver is incomplete and still in progress, and no amount of setting various capabilities or profile options for dismissing or setting certifcates was going to work. So it was just easier to use a custom profile.
Anyway here's the code on how I got the geckodriver to work without being in the path:
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')
回答13:
I'm using Windows 10 and this worked for me:
- Download geckodriver from here . Download the right version for the computer you are using
- Unzip the file you just downloaded and cut/copy the ".exe" file it contains
- Navigate to C:{your python root folder}. Mine was C:\Python27. Paste the geckodriver.exe file in this folder.
- Restart your development environment.
- Try running the code again, it should work now.
回答14:
It's really rather sad that none of the books published on Selenium/Python and most of the comments on this issue via Google do not clearly explain the pathing logic to set this up on Mac (everything is Windows!!!!). The youtubes all pickup at the "after" you've got the pathing setup (in my mind, the cheap way out!). So, for you wonderful Mac users, use the following to edit your bash path files:
>$touch ~/.bash_profile; open ~/.bash_profile
Then add a path something like this.... *# Setting PATH for geckodriver PATH=“/usr/bin/geckodriver:${PATH}” export PATH
Setting PATH for Selenium firefox
PATH=“~/Users/yourNamePATH/VEnvPythonInterpreter/lib/python2.7/site-packages/selenium/webdriver/firefox/:${PATH}” export PATH
Setting PATH for executable on firefox driver
PATH=“/Users/yournamePATH/VEnvPythonInterpreter/lib/python2.7/site-packages/selenium/webdriver/common/service.py:${PATH}” export PATH*
This worked for me. My concern is when will the Selenium Windows community start playing the real game and include us Mac users into their arrogant club membership.
回答15:
Selenium answers this question in their 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.
Basically just download the geckodriver, unpack it and move the executable to your /usr/bin folder
回答16:
For windows users
use the original code as it's:
from selenium import webdriver
browser = webdriver.Firefox()
driver.get("https://www.google.com")
then download the driver from: mozilla/geckodriver
Place it in a fixed path (permanently).. as an example, I put it in:
C:\Python35
Then go to the environment variables of the system, in the grid of "System variables" look for Path variable and add:
;C:\Python35\geckodriver
geckodriver, not geckodriver.exe.
回答17:
On Raspberry Pi I had to create from ARM driver and set the geckodriver and log path 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"):
回答18:
Visit Gecko Driver get the url for the gecko driver from the Downloads section.
Clone this repo https://github.com/jackton1/script_install.git
cd script_install
Run
./installer --gecko-driver https://github.com/mozilla/geckodriver/releases/download/v0.18.0/geckodriver-v0.25.0-linux64.tar.gz
回答19:
I see the discussions still talk about the old way of setting up geckodriver by downloading the binary and configuring the path manually.
This can be done automatically using webdriver-manager
pip install webdriver-manager
Now the above code in the question will work simply with below change,
from selenium import webdriver
from webdriver_manager.firefox import GeckoDriverManager
driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
回答20:
Mac 10.12.1 python 2.7.10 this work for me :)
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
回答21:
I am using Windows 10 and Anaconda2. I tried setting system path variable but didn't worked out. Then I simply added geckodriver.exe file to Anaconda2/Scripts folder and everything works great now. For me the path was:-
C:\Users\Bhavya\Anaconda2\Scripts
回答22:
If you want to add the driver paths on windows 10:
Right click on the "This PC" icon and select "Properties"
Click on “Advanced System Settings”
- Click on “Environment Variables” at the bottom of the screen
- In the “User Variables” section highlight “Path” and click “Edit”
- Add the paths to your variables by clicking “New” and typing in the path for the driver you are adding and hitting enter.
- Once you done entering in the path, click “OK”
- Keep clicking “OK” until you have closed out all the screens
回答23:
from webdriverdownloader import GeckoDriverDownloader # vs ChromeDriverDownloader vs OperaChromiumDriverDownloader
gdd = GeckoDriverDownloader()
gdd.download_and_install()
#gdd.download_and_install("v0.19.0")
回答24:
- ensure you have the correct version of driver (geckodriver), x86 or 64.
- ensure you are checking the right environment, for example the job is running in a Docker, whereas the environmnet is checked is the host OS
来源:https://stackoverflow.com/questions/40208051/selenium-using-python-geckodriver-executable-needs-to-be-in-path