提问人:tadm123 提问时间:10/24/2016 最后编辑:starballtadm123 更新时间:6/29/2023 访问量:954960
使用 Python 的 Selenium - Geckodriver 可执行文件需要在 PATH 中
Selenium using Python - Geckodriver executable needs to be in PATH
问:
我正在回顾 Sweigart 的 Automate the Boring Stuff with Python 文本。我正在使用 IDLE,并且已经安装了 Selenium 模块和 Firefox 浏览器。
每当我尝试运行 webdriver 函数时,我都会得到以下信息:
from selenium import webdriver
browser = webdriver.Firefox()
例外:
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
在处理上述异常的过程中,又发生了一次异常:
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.
我想我需要为 设置路径,但我不确定如何,那么我该怎么做呢?geckodriver
答:
selenium.common.exceptions.WebDriverException:消息:“geckodriver”可执行文件需要位于 PATH 中。
首先,您需要从这里下载最新的可执行 geckodriver 以使用 Selenium 运行最新的 Firefox
实际上,Selenium客户端绑定尝试从系统中找到可执行文件。您需要将包含可执行文件的目录添加到系统路径中。geckodriver
PATH
在 Unix 系统上,如果您使用的是兼容 Bash 的 shell,则可以执行以下操作将其附加到系统的搜索路径中:
export PATH=$PATH:/path/to/directory/of/executable/downloaded/in/previous/step
在 Windows 上,您需要更新 Path 系统变量,以手动或命令行将完整目录路径添加到可执行 geckodriver**(在将可执行 geckodriver 添加到系统 PATH 后,不要忘记重新启动系统以使其生效)**。原理与Unix相同。
现在,您可以像下面一样运行代码:-
from selenium import webdriver
browser = webdriver.Firefox()
selenium.common.exceptions.WebDriverException:消息:预期的浏览器二进制文件位置,但在默认位置找不到二进制文件,未提供“moz:firefoxOptions.binary”功能,并且未在命令行上设置二进制标志
异常清楚地表明您已经将 Firefox 安装在其他位置,而 Selenium 正在尝试查找 Firefox 并从默认位置启动,但它找不到它。您需要明确提供Firefox安装的二进制位置才能启动Firefox,如下所示:-
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)
评论
geckodriver.exe
C:\Python\Python35\selenium
PATH
os.environ["PATH"] += os.pathsep + 'path/to/dir/containing/geckodriver/'
mv geckodriver /usr/local/bin
这一步在 Ubuntu 和 Firefox 50 上为我解决了这个问题。
下载 geckodriver
将 geckodriver 复制到文件夹
/usr/local/bin
您无需添加:
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
firefox_capabilities['binary'] = '/usr/bin/firefox'
browser = webdriver.Firefox(capabilities=firefox_capabilities)
评论
非常可悲的是,没有一本关于 Selenium/Python 的书籍以及通过 Google 发布的关于这个问题的大多数评论都没有清楚地解释在 Mac 上设置它的路径逻辑(一切都是 Windows!YouTube 视频都是在你获得路径设置的“之后”拾取的(在我看来,这是便宜的出路!因此,对于出色的 Mac 用户,请使用以下内容来编辑您的 Bash 路径文件:
touch ~/.bash_profile; open ~/.bash_profile*
然后添加一个路径,如下所示......
# 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*
这对我有用。
saurabh 的答案解决了这个问题,但它没有解释为什么 Automate the Boring Stuff with Python 不包括这些步骤。
这是由于本书基于 Selenium 2.x,并且该系列的 Firefox 驱动程序不需要 Gecko 驱动程序。在开发 Selenium 时,用于驱动浏览器的 Gecko 接口不可用。
Selenium 2.x 系列中的最新版本是 2.53.6(例如,请参阅这些答案,以便更轻松地查看版本)。
2.53.6 版本页面根本没有提到 Gecko。但是从版本 3.0.2 开始,文档明确指出您需要安装 Gecko 驱动程序。
如果在升级(或安装在新系统上)后,您之前(或在旧系统上)运行良好的软件不再工作并且您很着急,请通过以下方式将 Selenium 版本固定在您的 virtualenv 中
pip install selenium==2.53.6
但当然,开发的长期解决方案是使用最新版本的 Selenium 设置一个新的 virtualenv,安装 Gecko 驱动程序并测试一切是否仍按预期工作。
但是主要版本的颠簸可能会引入您的书中未涵盖的其他 API 更改,因此您可能希望坚持使用较旧的 Selenium,直到您有足够的信心可以自己修复 Selenium 2 和 Selenium 3 API 之间的任何差异。
我实际上发现您可以使用最新的 geckodriver,而无需将其放入系统路径中。目前我正在使用
https://github.com/mozilla/geckodriver/releases/download/v0.12.0/geckodriver-v0.12.0-win64.zip
火狐浏览器 50.1.0
Python 3.5.2 中文文档
硒 3.0.2
视窗 10
我正在运行一个 VirtualEnv(我使用 PyCharm 管理它,我假设它使用 Pip 来安装所有内容)。
在下面的代码中,我可以使用 executable_path 参数为 geckodriver 使用特定路径(我通过查看发现这一点 Lib\site-packages\selenium\webdriver\firefox\webdriver.py )。请注意,我怀疑调用 webdriver 时参数参数的顺序很重要,这就是为什么executable_path在我的代码中排在最后(倒数第二行在最右边)。
您可能还注意到,我使用自定义的Firefox配置文件来解决sec_error_unknown_issuer问题,如果您正在测试的站点具有不受信任的证书,您将遇到该问题。请参阅如何使用 Selenium 禁用 Firefox 的不受信任的连接警告?
经过调查,发现 Marionette 驱动程序不完整且仍在进行中,并且用于关闭或设置证书的各种功能或配置文件选项设置得再多也无法正常工作。因此,使用自定义配置文件更容易。
无论如何,这是关于我如何让 geckodriver 在不进入路径的情况下工作的代码:
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')
评论
这为我解决了。
from selenium import webdriver
driver = webdriver.Firefox(executable_path=r'your\path\geckodriver.exe')
driver.get('http://inventwithpython.com')
评论
export PATH=$PATH:geckodriver
适用于 Mac 的步骤
简单的解决方案是下载 GeckoDriver 并将其添加到您的系统 PATH 中。您可以使用以下两种方法之一:
短方法
下载并解压缩 Geckodriver。
在启动驱动程序时提及路径:
driver = webdriver.Firefox(executable_path='/your/path/to/geckodriver')
Long 方法
下载并解压缩 Geckodriver。
打开。如果您尚未创建它,可以使用以下命令进行创建: 。然后使用以下命令打开它:
.bash_profile
touch ~/.bash_profile
open ~/.bash_profile
考虑到 GeckoDriver 文件存在于您的下载文件夹中,您可以将以下行添加到该文件中:
.bash_profile
PATH="/Users/<your-name>/Downloads/geckodriver:$PATH" export PATH
这样,您就将 GeckoDriver 的路径附加到您的系统路径中。这会告诉系统在执行 Selenium 脚本时 GeckoDriver 所在的位置。
- 保存并强制执行。这将立即加载值,而无需重新启动。为此,您可以运行以下命令:
.bash_profile
source ~/.bash_profile
- 就是这样。大功告成!您现在可以运行 Python 脚本。
评论
geckodriver
brew install geckodriver
driver = webdriver.Firefox(executable_path="/usr/local/bin/geckodriver")
在 macOS v10.12.1 (Sierra) 和 Python 2.7.10 上,这对我有用:
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
在 Raspberry Pi 上,我必须从 ARM 驱动程序创建它,并在文件 webdriver.py 中设置 geckodriver 和日志路径:
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"):
评论
Selenium在他们的DESCRIPTION.rst文件中回答了这个问题:
司机
=======Selenium 需要驱动程序才能与所选浏览器进行交互。火狐浏览器, 例如,requires _,需要先安装它,然后才能运行以下示例。确保它在您的 中,例如,将其放在 或 中。
geckodriver <https://github.com/mozilla/geckodriver/releases>
PATH
/usr/bin
/usr/local/bin
未能遵守此步骤将给出错误“selenium.common.exceptions.WebDriverException:消息:”geckodriver“可执行文件需要在 PATH 中。
基本上只需下载 geckodriver,解压缩并将可执行文件移动到 /usr/bin 文件夹即可。
评论
我正在使用 Windows 10,这对我有用:
- 从这里下载 geckodriver。为您正在使用的计算机下载正确的版本。
- 解压缩您刚刚下载的文件并剪切/复制其中包含的“.exe”文件
- 导航到 C:{your python root folder}。我的是 C:\Python27。将 geckodriver.exe 文件粘贴到此文件夹中。
- 重新启动开发环境。
- 请尝试再次运行代码。它现在应该可以工作了。
要为 Selenium Python 设置 geckodriver:
它需要使用 FirefoxDriver 设置 geckodriver 路径,如下代码所示:
self.driver = webdriver.Firefox(executable_path = 'D:\Selenium_RiponAlWasim\geckodriver-v0.18.0-win64\geckodriver.exe')
下载适合您的操作系统的 geckodriver(来自 https://github.com/mozilla/geckodriver/releases) → 将其解压缩到您选择的文件夹中 → 如上所述正确设置路径。
我在 Windows 3.6.2 上使用 Python 3.4.3 和 Selenium WebDriver 10。
设置 geckodriver 的另一种方法:
i) 只需将 geckodriver.exe 粘贴到 /Python/Scripts/ 下(在我的情况下,文件夹是: )
ii) 现在编写如下简单的代码:C:\Python36\Scripts
self.driver = webdriver.Firefox()
在已安装 Homebrew 的 macOS 上,您只需运行终端命令:
brew install geckodriver
因为 Homebrew 已经扩展了 所以不需要修改任何启动脚本。PATH
评论
适用于 Windows 的最简单方法!
从这里下载最新版本。将 geckodriver.exe 文件添加到 Python 目录(或已在 .这应该可以解决问题(已在 Windows 10 上进行了测试)。geckodriver
PATH
评论
一些额外的输入/说明:
以下足以作为 Windows 7、Python 3.6 和 Selenium 3.11 的解决方案:
dsalaj 对 Unix 的另一个答案的注释也适用于 Windows;可以避免在 Windows 级别修改 PATH 环境变量并重新启动 Windows 系统。
(1) 下载 geckodriver(如本线程前面所述)并将(解压缩的)geckdriver.exe放在 X:\Folder\of\your\choice
(2) 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
笔记:
(1) 上述代码可能需要大约 10 秒才能打开指定 URL 的 Firefox 浏览器。
(2) 如果指定 URL 上没有服务器运行或提供标题包含字符串“Django”的页面,则 Python 控制台将显示以下错误:
selenium.common.exceptions.WebDriverException:消息:已到达错误页面:about:neterror?e=connectionFailure&u=http%3A//localhost%3A8000/&c=UTF-8&f=regular&d=Firefox%20can%E2%80%9
如果您使用的是 Anaconda,您所要做的就是激活您的虚拟环境,然后使用以下命令安装 geckodriver:
conda install -c conda-forge geckodriver
评论
对于Windows用户
使用原始代码,因为它:
from selenium import webdriver
browser = webdriver.Firefox()
driver.get("https://www.google.com")
然后从以下位置下载驱动程序:mozilla/geckodriver
将其放置在固定路径中(永久)...举个例子,我把它放进去:
C:\Python35
然后转到系统的环境变量。在“系统变量”网格中查找 Path 变量并添加:
;C:\Python35\geckodriver
GeckoDriver,而不是 GeckoDriver.exe。
评论
Ubuntu 18.04+ 和最新版本的 geckodriver
这也应该适用于其他类 Unix 变体。
export GV=v0.30.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/
对于Mac,请更新为:
geckodriver-$GV-macos.tar.gz
from webdriverdownloader import GeckoDriverDownloader # vs ChromeDriverDownloader vs OperaChromiumDriverDownloader
gdd = GeckoDriverDownloader()
gdd.download_and_install()
#gdd.download_and_install("v0.19.0")
这将为您提供在Windows上获得gekodriver.exe的路径。
from selenium import webdriver
driver = webdriver.Firefox(executable_path=r'C:\\Users\\username\\\bin\\geckodriver.exe')
driver.get('https://www.amazon.com/')
我看到讨论仍然在谈论通过下载二进制文件并手动配置路径来设置 geckodriver 的旧方法。
这可以使用 webdriver-manager 自动完成
pip install webdriver-manager
现在,问题中的上述代码将简单地与以下更改一起使用,
from selenium import webdriver
from webdriver_manager.firefox import GeckoDriverManager
driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
评论
pip3
如果您使用虚拟环境和 Windows 10(也许其他系统也是如此),您只需要将 geckodriver.exe 放入虚拟环境目录中的以下文件夹中:
...\my_virtual_env_directory\Scripts\geckodriver.exe
评论
考虑安装容器化的 Firefox:
docker pull selenium/standalone-firefox
docker run --rm -d -p 5555:4444 --shm-size=2g selenium/standalone-firefox
使用以下方式连接:webdriver.Remote
driver = webdriver.Remote('http://localhost:5555/wd/hub', DesiredCapabilities.FIREFOX)
driver.set_window_size(1280, 1024)
driver.get('https://toolbox.googleapps.com/apps/browserinfo/')
driver.save_screenshot('info.png')
对我来说,只需在相同的环境中安装就足够了:geckodriver
brew install geckodriver
并且代码没有更改:
from selenium import webdriver
browser = webdriver.Firefox()
如果您使用的是 Linux,则可以使用简单的命令来解决此问题
首先,下载(https://github.com/mozilla/geckodriver/releases)并解压缩ZIP文件
打开解压缩的文件夹
从文件夹(解压后文件所在的位置)打开终端
geckodriver
现在在终端上运行这个简单的命令,将 geckodriver 复制到正确的文件夹中:
sudo cp geckodriver /usr/local/bin
geckodriver
默认情况下未安装。
geckodriver
输出:
Command 'geckodriver' not found, but it can be installed with:
sudo apt install firefox-geckodriver
以下命令不仅安装它,而且还将其放入可执行文件中。PATH
sudo apt install firefox-geckodriver
只需一步即可解决问题。我遇到了与您完全相同的错误,并且一安装它就消失了。来吧,试一试。
which geckodriver
输出:
/usr/bin/geckodriver
geckodriver
输出:
1337 geckodriver INFO Listening on 127.0.0.1:4444
^C
评论
对于 Ubuntu 16.04 (Xenial Xerus) 及更高版本,您可以执行以下操作:
对于 Firefox:
sudo apt-get install firefox-geckodriver
对于 Chrome:
sudo apt-get install chromium-chromedriver
评论
对于MacBook用户:
步骤1:
打开此链接并复制该 Homebrew 路径,将其粘贴到终端中并安装它。
步骤2:
brew install geckodriver
步骤3:
pip install webdriver-manager
避免该错误的一种新方法是使用 Conda 环境。
使用,您不必向路径添加任何内容或编辑代码!conda install -c conda-forge geckodriver
评论
的主要变化意味着,如果您升级版本,您将不再看到 Geckodriver 错误消息。 有一个内置的驱动程序管理器(现在完全退出测试版),如果您的系统上找不到它,它将自动为您下载。甚至方法 arg 也已从 中删除,如下所示:selenium
4.10.0
selenium
selenium
geckodriver
PATH
executable_path
webdriver.Firefox()
https://github.com/SeleniumHQ/selenium/commit/9f5801c82fb3be3d5850707c46c3f8176e3ccd8e
现在,这就是启动Firefox所需的全部内容,即使它不在您的系统路径上:
from selenium import webdriver
driver = webdriver.Firefox()
# ...
driver.quit()
要自定义 Firefox,请使用 和 参数:options
service
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
service = Service()
options = webdriver.FirefoxOptions()
driver = webdriver.Firefox(service=service, options=options)
# ...
driver.quit()
(和以前一样,如果您的系统上找不到它,将自动下载。geckodriver
PATH
我在 Linux 桌面上开发了一个脚本,用于部署在我的无头服务器上。我需要更新在 Windows 上运行的更新,但由于以下几个原因出现了同样的错误:
“selenium.common.exceptions.sessionnotcreatedexception:消息:预期的浏览器二进制位置,但无法在默认位置找到二进制文件,未提供'moz:firefoxoptions.binary'功能,并且未在命令行上设置二进制标志”
这是 Windows;我需要安装 Firefox,我可能搞砸了,因为它滞后了,而且我有一段时间有两个安装进度。
安装Firefox后,我发现了一个确认的解决方案(例如 https://stackoverflow.com/a/42122284),指示我使用:executable_path
from selenium import webdriver
driver = webdriver.Firefox(executable_path=r'your\path\geckodriver.exe')
自几年前以来,该参数就未被识别。相反,我需要一个实例。我将其添加到我的选项旁边,这是必需的,因为仍然找不到 Firefox(我不耐烦的双重安装可能归咎于此):Service
from selenium import webdriver
from selenium.webdriver import FirefoxOptions
from selenium.webdriver.firefox.service import Service
opts.binary_location = r"C:\Program Files\Mozilla Firefox\firefox.exe"
service = Service(r"C:\Users\pythonista\PycharmProjects\world_eater\geckodriver.exe")
driver = webdriver.Firefox(service=service, options=opts)
这是我目前唯一的硒项目,它可以管理自己的壁虎驱动程序。
评论
brew install geckodriver
chromedriver