Selenium使用Python - Geckodriver可执行文件需要在PATH中

我是编程新手,大约两个月前开始学习Python,现在正在浏览Sweigart的用Python自动化无聊的事情文本。我使用的是闲置,并且已经安装了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设置路径,但我不确定如何,所以我怎么做呢?

907097 次浏览

“geckodriver”可执行文件需要在PATH中。

首先,您需要从这里下载最新的可执行geckodriver以使用Selenium运行最新的Firefox

实际上,Selenium客户端绑定试图从系统PATH中定位geckodriver可执行文件。您需要将包含可执行文件的目录添加到系统路径中。

  • 在Unix系统上,如果你使用bash兼容的shell,你可以执行以下操作将其追加到系统的搜索路径:

      export PATH=$PATH:/path/to/directory/of/executable/downloaded/in/previous/step
    
  • 在Windows上,您需要更新Path系统变量,为可执行文件geckodriver添加完整的目录路径 手动命令行**(不要忘记在将可执行geckodriver添加到system PATH后重新启动系统才能生效)**。原理与Unix相同。

现在你可以像下面这样运行你的代码:-

from selenium import webdriver


browser = webdriver.Firefox()

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)

https://github.com/mozilla/geckodriver/releases

Windows:

从GitHub下载文件,提取它,并粘贴到Python文件。这对我很管用。

https://github.com/mozilla/geckodriver/releases

对我来说,我的路径是:

C:\Users\MYUSERNAME\AppData\Local\Programs\Python\Python39

这步骤解决了它为我在Ubuntu和Firefox 50。

  1. < p > # EYZ0下载

  2. 复制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的书籍以及通过谷歌发表的关于这个问题的大多数评论都没有清楚地解释在Mac上设置这个的路径逻辑(一切都是Windows!)YouTube上的视频都是在“after"你已经有了路径设置(在我看来,这是最便宜的出路!)所以,对于你优秀的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回答解决了这个问题,但它没有解释为什么用Python自动化无聊的事情不包括这些步骤。

这是因为本书是基于Selenium 2的。该系列的Firefox驱动程序不需要Gecko驱动程序。在开发Selenium时,驱动浏览器的Gecko界面是不可用的。

最新版本在硒2。x系列是2.53.6(参见例如这些答案,以获得更简单的版本视图)。

2.53.6版本页面完全没有提到壁虎。但是从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

Firefox 50.1.0

Python 3.5.2

硒3.0.2

Windows 10

我正在运行一个VirtualEnv(我使用PyCharm管理它,我假设它使用Pip来安装所有东西)。

在下面的代码中,我可以使用executable_path参数为geckodriver使用特定的路径(我通过查看中发现了这一点) Lib \网站\ firefox硒\ webdriver \ \ webdriver.py)。注意,我怀疑在调用webdriver时参数参数的顺序很重要,这就是为什么executable_path在我的代码中是最后的(最右边的倒数第二行)

您可能还注意到,我使用了一个自定义Firefox配置文件来解决sec_error_unknown_issuer问题,如果您正在测试的站点有一个不受信任的证书,您就会遇到这个问题。看到# EYZ0

经过调查发现,木偶驱动程序是不完整的,仍在进行中,并且没有设置各种功能或配置文件选项来取消或设置证书将会工作。所以使用自定义配置文件更容易。

不管怎样,这里是关于我如何让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')

Mac的步骤

简单的解决方案是下载GeckoDriver并将其添加到您的系统PATH中。你可以使用以下两种方法中的任何一种:

短的方法

  1. 下载并解压Geckodriver

  2. 在启动驱动程序时提到路径:

     driver = webdriver.Firefox(executable_path='/your/path/to/geckodriver')
    

长方法

  1. 下载并解压Geckodriver

  2. < p > # EYZ0开放。如果您还没有创建它,您可以使用命令:touch ~/.bash_profile。然后使用open ~/.bash_profile打开它

  3. 考虑到GeckoDriver文件存在于你的Downloads文件夹中,你可以在.bash_profile文件中添加以下一行:

     PATH="/Users/<your-name>/Downloads/geckodriver:$PATH"
    export PATH
    

这样你就把GeckoDriver的路径附加到系统路径中了。这将告诉系统在执行Selenium脚本时GeckoDriver的位置。

  1. 保存.bash_profile并强制执行。这会立即加载值,而不必重新启动。您可以执行以下命令:

# EYZ0

  1. 就是这样。你是完成!现在可以运行Python脚本了。

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

在树莓派上,我必须从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文件中回答了这个问题:

< p >司机
= = = = = = = < / p >

Selenium需要一个驱动程序来与所选的浏览器交互。Firefox, 例如,需要geckodriver <https://github.com/mozilla/geckodriver/releases>_,在运行下面的示例之前需要安装它。确保它在你的PATH,例如,把它放在/usr/bin/usr/local/bin

如果没有注意到这一步,将会出现一个错误:selenium.common.exceptions.WebDriverException: Message: 'geckodriver'可执行文件需要在PATH中。

基本上只需要下载geckodriver,解包并将可执行文件移动到工作文件夹。

我用的是Windows 10,这对我来说很管用:

  1. 在这里下载geckodriver。为您使用的计算机下载正确的版本。
  2. 解压缩你刚刚下载的文件,并剪切/复制"它包含的文件
  3. 导航到C:{你的python根文件夹}。我的是C:\Python27。将geckodriver.exe文件粘贴到此文件夹中。
  4. 重新启动开发环境。
  5. 尝试再次运行代码。现在应该可以了。

为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 10上使用的是Python 3.6.2和Selenium WebDriver 3.4.3。

设置geckodriver的另一种方法:

简单地粘贴geckodriver.exe在/Python/Scripts/(在我的情况下,文件夹是:C:\Python36\Scripts)
ii)现在编写如下简单代码:

self.driver = webdriver.Firefox()

访问壁虎的司机并从下载部分获得Gecko驱动程序的URL。

克隆这个存储库:https://github.com/jackton1/script_install.git

# EYZ0

运行

./installer --gecko-driver https://github.com/mozilla/geckodriver/releases/download/v0.18.0/geckodriver-v0.25.0-linux64.tar.gz

在已经安装了家酿的macOS上,你可以简单地运行Terminal命令:

brew install geckodriver

因为Homebrew已经扩展了PATH,所以不需要修改任何启动脚本。

最简单的方法为Windows!

在这里下载最新版本的geckodriver。将< >强geckodriver.exe < / >强文件添加到Python目录(或已经在PATH中的任何其他目录)。这应该能解决问题(在Windows 10上进行了测试)。

我使用的是Windows 10和水蟒 2。我尝试设置系统路径变量,但它没有工作。然后我简单地将geckodriver.exe文件添加到Anaconda 2/Scripts文件夹中,现在一切都很好了。

对我来说,这条路是:

C:\Users\Bhavya\Anaconda2\Scripts

一些额外的输入/澄清:

下面是Windows 7、Python 3.6和Selenium 3.11的分辨率:

dsalaj注作为Unix的另一个答案也适用于Windows;可以避免在Windows级别上修补PATH环境变量和重新启动Windows系统。

(1)下载geckdriver(如本线程前面所述),并将(解压)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)上述代码打开指定URL的Firefox浏览器可能需要大约10秒的时间。

(2)如果没有服务器在指定的URL上运行,或者没有包含字符串'Django'的页面,Python控制台将显示以下错误:

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 . webdriverexception

如果你正在使用水蟒,你所要做的就是激活你的虚拟环境,然后使用下面的命令安装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

然后进入系统的环境变量。在“系统变量”的网格中;寻找路径变量并添加:

C: \ Python35 \ geckodriver

geckodriver # EYZ0。

如果要在Windows 10系统下添加驱动程序路径:

  1. 右键点击“This pc”;图标,选择“;属性”;

    Enter image description here

  2. 点击“高级系统设置”

  3. 点击屏幕底部的“环境变量”

  4. 在“用户变量”部分选中“路径”并单击“编辑”

  5. 通过点击“New”,输入你要添加的驱动程序的路径并按enter键,为你的变量添加路径。

  6. 一旦你完成了路径的输入,点击“确定”

  7. 继续点击“确定”,直到关闭所有屏幕

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())
  1. 确保您有正确的驱动程序版本(geckodriver), x86或64。
  2. 确保您正在检查正确的环境。例如,作业在Docker容器中运行,而环境在主机操作系统上检查。

如果你使用虚拟环境和Windows 10(可能其他系统也一样),你只需要把geckodriver.exe放到虚拟环境目录下的以下文件夹中:

…\ my_virtual_env_directory \ \ 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()

也可以执行echo PATH (Linux),并将geckodriver移动到您喜欢的文件夹。如果目标是系统(而不是虚拟环境)文件夹,则驱动程序将成为全局可访问的。

如果您在Linux上,您可以使用一个简单的命令来解决这个问题

  1. 首先,下载(https://github.com/mozilla/geckodriver/releases)并解压ZIP文件

  2. 打开解压的文件夹

  3. 从文件夹(解压后geckodriver文件所在的文件夹)打开终端

    Enter image description here

  4. 现在在终端上运行这个简单的命令,将geckodriver复制到正确的文件夹中:

     sudo cp geckodriver /usr/local/bin
    

在Windows 10上,我下载geckodriver.exe就可以了。我只是更新了火狐浏览器。

下面是我使用的代码:

from selenium import webdriver
driver = webdriver.Firefox(
executable_path=r'C:\Users\Usuario\Desktop\Automate the boring stuff with python exercises\Web Scraping\geckodriver.exe')
driver.get('http://inventwithpython.com')

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

此错误消息…

FileNotFoundError: [WinError 2] The system cannot find the file specified

...暗示您的程序无法定位指定的文件,并且在处理异常时发生了以下异常:

selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.

... 这意味着你的程序在启动/生成一个新的浏览内容(即火狐浏览器会话)的过程中无法定位GeckoDriver


您可以从mozilla / geckodriver . txt下载最新的GeckoDriver,解压/untar,并将GeckoDriver二进制/可执行文件存储在系统中的任何位置,将GeckoDriver的绝对路径传递到关键 executable_path,如下所示:

from selenium import webdriver


driver = webdriver.Firefox(executable_path='/path/to/geckodriver')
driver.get('http://google.com/')

如果没有安装在默认位置(即安装在一个自定义位置),另外你需要通过属性binary_location传递firefox二进制文件的绝对路径,如下所示:

# An Windows example
from selenium import webdriver
from selenium.webdriver.firefox.options import Options


options = Options()
options.binary_location = r'C:\Program Files\Mozilla Firefox\firefox.exe'
driver = webdriver.Firefox(firefox_options=options, executable_path=r'C:\WebDrivers\geckodriver.exe')
driver.get('http://google.com/')

在Ubuntu上手动安装geckodriver

  • < p > # EYZ0访问

  • 下载最新版本的“geckodriver- vx . xx . x -linux64.tar.gz”;

  • (tar -xvzf geckodriver-vX.XX.X-linux64.tar.gz)

  • 给geckodriver可执行权限(chmod +x geckodriver)

  • 将geckodriver二进制文件移动到/usr/local/bin或系统路径上的任何位置。

Ubuntu上安装geckodriver的脚本:

#!/bin/bash


INSTALL_DIR="/usr/local/bin"


json=$(curl -s https://api.github.com/repos/mozilla/geckodriver/releases/latest)
url=$(echo "$json" | jq -r '.assets[].browser_download_url | select(contains("linux64"))')
curl -s -L "$url" | tar -xz
chmod +x geckodriver
sudo mv geckodriver "$INSTALL_DIR"
echo "installed geckodriver binary in $INSTALL_DIR"

这个答案完全复制自: # EYZ0 < / em > < /子> < / p >

对于版本Ubuntu 16.04 (Xenial Xerus)和以后你可以这样做:

Firefox:
# EYZ0 < / p >

For Chrome:
# EYZ0 < / p >

# EYZ0:

步骤1:

打开这个链接并复制家酿路径,粘贴到终端并安装。

步骤2:

brew install geckodriver

步骤3:

pip install webdriver-manager

避免该错误的新方法是使用Conda环境。

使用conda install -c conda-forge geckodriver,您不必向路径添加任何东西或编辑代码!