我正在用Python文本阅读Sweigart的《自动化无聊的东西》。我正在使用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设置路径,但我不确定如何,所以我该如何做到这一点?


当前回答

对于Ubuntu 16.04 (Xenial Xerus)及更高版本,您可以这样做:

Firefox: Sudo apt-get install firefox-geckodriver

铬: 安装chromium-chromedriver

其他回答

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/')

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

这是因为本书是基于Selenium 2的。该系列的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之间的任何差异。

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

右键单击“这台PC”图标,选择“属性” 点击“高级系统设置” 点击屏幕底部的“环境变量” 在“用户变量”部分选中“路径”,然后点击“编辑” 通过点击“New”,输入你要添加的驱动程序的路径,然后按回车键,来添加变量的路径。 输入路径后,点击“确定” 继续点击“确定”,直到关闭所有屏幕

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

此错误消息…

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

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

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

... 这意味着你的程序在启动/生成一个新的浏览上下文(即Firefox浏览器会话)的过程中无法定位GeckoDriver。


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

from selenium import webdriver

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

如果firefox没有安装在默认位置(即安装在一个自定义位置),另外你需要通过属性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/')