使用Python的Selenium-Geckodriver可执行文件需要在路径中

使用Python的Selenium-Geckodriver可执行文件需要在路径中,python,selenium,firefox,selenium-firefoxdriver,geckodriver,Python,Selenium,Firefox,Selenium Firefoxdriver,Geckodriver,我是编程新手,大约两个月前开始学习Python,现在我将复习斯维加特的《用Python文本自动化无聊的东西》。我正在使用并且已经安装了Selenium模块和Firefox浏览器 每当我尝试运行webdriver函数时,我都会得到以下结果: from selenium import webdriver browser = webdriver.Firefox() 例外情况: Exception ignored in: <bound method Service.__del__ of <

我是编程新手,大约两个月前开始学习Python,现在我将复习斯维加特的《用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

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.
中忽略的异常:
回溯(最近一次呼叫最后一次):
文件“C:\Python\Python35\lib\site packages\selenium\webdriver\common\service.py”,第163行,在__
self.stop()
文件“C:\Python\Python35\lib\site packages\selenium\webdriver\common\service.py”,第135行,在stop中
如果self.process为无:
AttributeError:“服务”对象没有属性“进程”
在中忽略异常:
回溯(最近一次呼叫最后一次):
文件“C:\Python\Python35\lib\site packages\selenium\webdriver\common\service.py”,第163行,在__
self.stop()
文件“C:\Python\Python35\lib\site packages\selenium\webdriver\common\service.py”,第135行,在stop中
如果self.process为无:
AttributeError:“服务”对象没有属性“进程”
回溯(最近一次呼叫最后一次):
文件“C:\Python\Python35\lib\site packages\selenium\webdriver\common\service.py”,第64行,在开始处
stdout=self.log\u文件,stderr=self.log\u文件)
文件“C:\Python\Python35\lib\subprocess.py”,第947行,在\uuu init中__
恢复信号,启动新会话)
文件“C:\Python\Python35\lib\subprocess.py”,第1224行,在执行子进程中
startupinfo)
FileNotFoundError:[WinError 2]系统找不到指定的文件
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
browser=webdriver.Firefox()
文件“C:\Python\Python35\lib\site packages\selenium\webdriver\firefox\webdriver.py”,第135行,在\uuu init中__
self.service.start()
文件“C:\Python\Python35\lib\site packages\selenium\webdriver\common\service.py”,第71行,在开始处
os.path.basename(self.path)、self.start\u错误消息)
selenium.common.exceptions.WebDriverException:消息:“geckodriver”可执行文件需要位于路径中。
我想我需要为
geckodriver
设置路径,但我不确定如何设置,所以我该如何设置

selenium.common.exceptions.WebDriverException:消息:“geckodriver”可执行文件需要位于路径中

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

  • 在Unix系统上,如果使用的是与Bash兼容的shell,则可以执行以下操作将其附加到系统的搜索路径:

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

现在,您可以按如下操作运行代码:-

from selenium import webdriver

browser = webdriver.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)
selenium.common.exceptions.WebDriverException:消息:预期的浏览器二进制位置,但在默认位置找不到二进制,未提供“moz:firefoxOptions.binary”功能,并且在命令行上未设置二进制标志

例外情况清楚地表明,当Selenium试图查找Firefox并从默认位置启动时,您已经在其他位置安装了Firefox,但它找不到它。您需要明确提供Firefox安装的二进制位置以启动Firefox,如下所示:-

from selenium import webdriver

browser = webdriver.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)

对于Windows:

从GitHub下载该文件,将其解压缩并粘贴到Python文件中。这对我有用

对我来说,我的道路是:

C:\Users\MYUSERNAME\AppData\Local\Programs\Python\Python39
这些步骤为我在Ubuntu和Firefox50上解决了这个问题

  • 下载

  • 将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*
    

    这对我有用。我担心的是,Selenium Windows社区什么时候开始玩真正的游戏,并将我们Mac用户纳入他们傲慢的俱乐部成员。

    由@saurabh给出的答案解决了这个问题,但它没有解释为什么用Python自动化无聊的东西不包括这些步骤

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

    Selenium 2.x系列中的最新版本是2.53.6(参见示例[这些答案][2],以便更容易地查看版本)

    [2.53.6版本页面][3]根本没有提到壁虎。但是由于3.0.2版的文档[明确声明][4]您需要安装Gecko驱动程序

    如果升级(或安装到新系统上)后,以前运行良好的软件(或旧系统上的)不再运行,并且您很匆忙,请通过执行以下操作将Selenium版本固定到virtualenv中

    pip install selenium==2.53.6
    
    当然,开发的长期解决方案是使用最新版本的selenium安装一个新的virtualenv,安装Gecko驱动程序,并测试一切是否仍按预期工作

    但是主要版本的改动可能会引入您的书中未涉及的其他API更改,因此您可能希望继续使用较旧的Selenium,直到您有足够的信心自己修复Selenium 2和Selenium 3 API之间的任何差异

    [2] :) [3]: [
     driver = webdriver.Firefox(executable_path='/your/path/to/geckodriver')
    
     PATH="/Users/<your-name>/Downloads/geckodriver:$PATH"
     export PATH
    
    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
    
    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"):
    
    self.driver = webdriver.Firefox(executable_path = 'D:\Selenium_RiponAlWasim\geckodriver-v0.18.0-win64\geckodriver.exe')
    
    self.driver = webdriver.Firefox()
    
    ./installer --gecko-driver https://github.com/mozilla/geckodriver/releases/download/v0.18.0/geckodriver-v0.25.0-linux64.tar.gz
    
    $ brew install geckodriver
    
    C:\Users\Bhavya\Anaconda2\Scripts
    
    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
    
        conda install -c conda-forge geckodriver
    
    from selenium import webdriver
    browser = webdriver.Firefox()
    driver.get("https://www.google.com")
    
    export GV=v0.29.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/
    
    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")
    
    from selenium import webdriver
    driver = webdriver.Firefox(executable_path=r'C:\\Users\\username\\\bin\\geckodriver.exe')
    driver.get('https://www.amazon.com/')
    
    pip install webdriver-manager
    
    from selenium import webdriver
    from webdriver_manager.firefox import GeckoDriverManager
    
    driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
    
    docker pull selenium/standalone-firefox
    docker run --rm -d -p 5555:4444 --shm-size=2g selenium/standalone-firefox
    
    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')
    
    $ brew install geckodriver
    
    from selenium import webdriver
    browser = webdriver.Firefox()
    
    wolf@linux:~$ python -m pip install webdriver-manager
    Collecting webdriver-manager
      Using cached https://files.pythonhosted.org/packages/9c/6c/b52517f34e907fef503cebe26c93ecdc590d0190b267d38a251a348431e8/webdriver_manager-3.2.1-py2.py3-none-any.whl
     ... output truncated ...
    Installing collected packages: configparser, colorama, crayons, certifi, chardet, urllib3, idna, requests, webdriver-manager
    Successfully installed certifi-2020.6.20 chardet-3.0.4 colorama-0.4.3 configparser-5.0.0 crayons-0.3.1 idna-2.10 requests-2.24.0 urllib3-1.25.9 webdriver-manager-3.2.1
    wolf@linux:~$
    
    from selenium import webdriver
    from webdriver_manager.firefox import GeckoDriverManager
    
    driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
    
    wolf@linux:~$ python
    Python 3.7.5 (default, Nov  7 2019, 10:50:52)
    [GCC 8.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    >>> from selenium import webdriver
    >>> from webdriver_manager.firefox import GeckoDriverManager
    >>>
    >>> driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
    [WDM] - There is no [linux64] geckodriver for browser  in cache
    [WDM] - Getting latest mozilla release info for v0.26.0
    [WDM] - Trying to download new driver from https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-linux64.tar.gz
    [WDM] - Driver has been saved in cache [/home/wolf/.wdm/drivers/geckodriver/linux64/v0.26.0]
    >>>
    
    cp /home/$(whoami)/.wdm/drivers/geckodriver/linux64/v0.26.0/geckodriver /home/$(whoami)/.local/bin/
    
    from selenium import webdriver
    
    browser = webdriver.Firefox()
    browser.get('http://seleniumhq.org/')
    
     sudo cp geckodriver /usr/local/bin
    
    $ geckodriver
    
    Command 'geckodriver' not found, but it can be installed with:
    
    sudo apt install firefox-geckodriver
    
    $
    
    sudo apt install firefox-geckodriver
    
    $ which geckodriver
    /usr/bin/geckodriver
    $
    $ geckodriver
    1337    geckodriver    INFO    Listening on 127.0.0.1:4444
    ^C