使用 Python 的 Selenium - Geckodriver 可执行文件需要位于 PATH 中
- 2024-11-25 08:49:00
- admin 原创
- 272
问题描述:
我正在阅读 Sweigart 的《用 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: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
在处理上述异常的过程中,又发生了另一个异常:
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
browser = webdriver.Firefox()
File "C:PythonPython35libsite-packagesseleniumwebdriverirefoxwebdriver.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.
我想我需要设置路径geckodriver
,但我不确定如何设置,那么我该怎么做呢?
解决方案 1:
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)
解决方案 2:
这帮我解决了这个问题。
from selenium import webdriver
driver = webdriver.Firefox(executable_path=r'yourpathgeckodriver.exe')
driver.get('http://inventwithpython.com')
解决方案 3:
这些步骤帮我解决了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)
解决方案 4:
我看到讨论仍然在谈论通过下载二进制文件并手动配置路径来设置 geckodriver 的老方法。
这可以使用webdriver-manager自动完成
pip install webdriver-manager
现在问题中的上述代码只需进行以下更改即可运行,
from selenium import webdriver
from webdriver_manager.firefox import GeckoDriverManager
driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
解决方案 5:
在已安装Homebrew的 macOS 上,您只需运行终端命令:
brew install geckodriver
因为 Homebrew 已经扩展了,所以PATH
不需要修改任何启动脚本。
解决方案 6:
saurabh 的回答解决了这个问题,但是并没有解释为什么“使用 Python 自动化无聊的事情”不包含这些步骤。
这是因为本书基于 Selenium 2.x,而该系列的 Firefox 驱动程序不需要 Gecko 驱动程序。在开发 Selenium 时,驱动浏览器的 Gecko 接口尚未可用。
Selenium 2.x 系列的最新版本是2.53.6(例如,请参阅这些答案,以更轻松地查看版本)。
2.53.6 版本页面根本没有提到 Gecko。但从 3.0.2 版本开始,文档明确指出您需要安装 Gecko 驱动程序。
如果在升级(或在新系统上安装)后,你之前运行良好的软件(或在旧系统上)不再工作,并且你很着急,可以通过执行以下操作将 Selenium 版本固定在虚拟环境中
pip install selenium==2.53.6
但当然,开发的长期解决方案是使用最新版本的 selenium 设置一个新的虚拟环境,安装 Gecko 驱动程序并测试一切是否仍按预期工作。
但是主要版本的升级可能会引入书中未涵盖的其他 API 更改,因此您可能需要坚持使用旧版 Selenium,直到您有足够的信心可以自己修复 Selenium 2 和 Selenium 3 API 之间的任何差异。
解决方案 7:
为 Selenium Python 设置 geckodriver:
需要使用 FirefoxDriver 设置 geckodriver 路径,如下代码:
self.driver = webdriver.Firefox(executable_path = 'D:Selenium_RiponAlWasimgeckodriver-v0.18.0-win64geckodriver.exe')
为您的操作系统下载合适的 geckodriver(从https://github.com/mozilla/geckodriver/releases)→将其解压到您选择的文件夹中→按照上面所述正确设置路径。
我在 Windows 10 上使用 Python 3.6.2 和 Selenium WebDriver 3.4.3。
设置 geckodriver 的另一种方法:
i) 只需将 geckodriver.exe 粘贴到 /Python/Scripts/ 下(在我的情况下,该文件夹为:C:Python36Scripts
)
ii) 现在编写如下简单代码:
self.driver = webdriver.Firefox()
解决方案 8:
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
解决方案 9:
如果您使用的是Anaconda,那么您所要做的就是激活您的虚拟环境,然后使用以下命令安装geckodriver:
conda install -c conda-forge geckodriver
解决方案 10:
适用于 Windows 的最简单方法!
geckodriver
从这里下载最新版本。将geckodriver.exe文件添加到 Python 目录(或任何其他已经在的目录PATH
)。这应该可以解决问题(已在 Windows 10 上测试过)。
解决方案 11:
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
解决方案 12:
对于Ubuntu 16.04 (Xenial Xerus) 及更高版本,您可以执行以下操作:
对于 Firefox:
sudo apt-get install firefox-geckodriver
对于 Chrome:
sudo apt-get install chromium-chromedriver
解决方案 13:
Mac 的操作步骤
简单的解决方案是下载 GeckoDriver 并将其添加到系统 PATH。您可以使用以下两种方法之一:
简短方法
下载并解压Geckodriver。
启动驱动程序时提及路径:
driver = webdriver.Firefox(executable_path='/your/path/to/geckodriver')
长方法
下载并解压Geckodriver。
打开
.bash_profile
。如果你还没有创建它,你可以使用以下命令创建它:touch ~/.bash_profile
。然后使用以下命令打开它:open ~/.bash_profile
考虑到 GeckoDriver 文件存在于您的下载文件夹中,您可以将以下行添加到该
.bash_profile
文件中:
PATH="/Users/<your-name>/Downloads/geckodriver:$PATH"
export PATH
这样,您就将 GeckoDriver 的路径附加到系统 PATH。这会告诉系统在执行 Selenium 脚本时 GeckoDriver 的位置。
保存
.bash_profile
并强制执行。这会立即加载值,而无需重新启动。为此,您可以运行以下命令:
source ~/.bash_profile
就这样。你完成了!你现在可以运行 Python 脚本了。
解决方案 14:
一些额外的输入/澄清:
以下内容足以作为 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:Folderofyourchoice';
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
解决方案 15:
我实际上发现你可以使用最新的 geckodriver,而无需将其放入系统路径中。目前我正在使用
https://github.com/mozilla/geckodriver/releases/download/v0.12.0/geckodriver-v0.12.0-win64.zip
Firefox 50.1.0
Python 3.5.2
硒 3.0.2
Windows 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:WorkPyTestFrameworkFirefoxSeleniumProfile'
profile = webdriver.FirefoxProfile(profile_directory=ffProfilePath)
geckoPath = 'D:WorkPyTestFrameworkgeckodriver.exe'
browser = webdriver.Firefox(firefox_profile=profile, capabilities=firefox_capabilities, executable_path=geckoPath)
browser.get('http://stackoverflow.com')
解决方案 16:
避免错误的新方法是使用Conda环境。
使用conda install -c conda-forge geckodriver
时您不必在路径中添加任何内容或编辑代码!
解决方案 17:
如果你使用的是Linux,则可以使用一个简单的命令来解决此问题
首先,下载(https://github.com/mozilla/geckodriver/releases)并解压 ZIP 文件
打开解压的文件夹
geckodriver
从文件夹(解压后文件所在的位置)打开终端
现在在你的终端上运行这个简单的命令将 geckodriver 复制到正确的文件夹中:
sudo cp geckodriver /usr/local/bin
解决方案 18:
考虑安装一个容器化的 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')
解决方案 19:
令人遗憾的是,没有一本关于 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*
这对我有用。
解决方案 20:
我在 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'yourpathgeckodriver.exe')
这个参数几年前就无法识别了。我需要一个Service
实例。我把它添加到我的选项中,这是必需的,因为仍然找不到 Firefox(这可能是我的不耐烦双重安装造成的):
from selenium import webdriver
from selenium.webdriver import FirefoxOptions
from selenium.webdriver.firefox.service import Service
opts.binary_location = r"C:Program FilesMozilla Firefoxirefox.exe"
service = Service(r"C:UserspythonistaPycharmProjectsworld_eatergeckodriver.exe")
driver = webdriver.Firefox(service=service, options=opts)
这是我目前唯一的 selenium 项目,它可以管理自己的 geckodriver。
解决方案 21:
我正在使用 Windows 10,这对我有用:
从这里下载 geckodriver 。下载适合您使用的计算机的正确版本。
解压刚刚下载的文件并剪切/复制其中包含的“.exe”文件
导航到 C:{你的 python 根文件夹}。我的是 C:\Python27。将 geckodriver.exe 文件粘贴到此文件夹中。
重新启动您的开发环境。
尝试再次运行代码。现在应该可以正常工作了。
解决方案 22:
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\\in\\geckodriver.exe')
driver.get('https://www.amazon.com/')
解决方案 23:
对于MacBook 用户:
步骤 1:
打开此链接并复制Homebrew路径,将其粘贴到终端并安装。
第 2 步:
brew install geckodriver
步骤3:
pip install webdriver-manager
解决方案 24:
Selenium 在其DESCRIPTION.rst文件中回答了这个问题:
驱动程序
========
Selenium 需要驱动程序来与所选浏览器交互。例如,Firefox 需要
geckodriver <https://github.com/mozilla/geckodriver/releases>
_,需要先安装它才能运行以下示例。确保它在您的 中PATH
,例如,将其放在/usr/bin
或 中/usr/local/bin
。
未能遵守此步骤将会导致错误“selenium.common.exceptions.WebDriverException:消息:'geckodriver'可执行文件需要在PATH中。
基本上只需下载 geckodriver,解压并将可执行文件移动到/usr/bin文件夹。
解决方案 25:
对于 Windows 用户
使用原始代码如下:
from selenium import webdriver
browser = webdriver.Firefox()
driver.get("https://www.google.com")
然后从以下位置下载驱动程序:mozilla/geckodriver
将其放置在固定路径中(永久)...作为示例,我将其放置在:
目录:\Python35
然后进入系统的环境变量。在“系统变量”网格中查找Path变量并添加:
;C:\Python35\geckodriver
geckodriver,而不是 geckodriver.exe。
解决方案 26:
如果你使用虚拟环境和 Windows 10(其他系统可能也一样),你只需要将 geckodriver.exe 放入虚拟环境目录中的以下文件夹中:
...\我的虚拟环境目录\Scripts\geckodriver.exe
解决方案 27:
的重大变化selenium
4.10.0
意味着,如果您升级版本,您将不再看到 Geckodriver 错误消息selenium
。selenium
有一个内置驱动程序管理器(现在完全脱离测试阶段),geckodriver
如果您的系统上找不到它,它将自动为您下载PATH
。甚至方法 argexecutable_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
。)
解决方案 28:
在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
解决方案 29:
在 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"):
解决方案 30:
geckodriver
对我来说,只需在相同的环境中安装就足够了:
brew install geckodriver
并且代码没有改变:
from selenium import webdriver
browser = webdriver.Firefox()