我正在用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和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)

其他回答

MacBook用户:

步骤1:

打开此链接并复制Homebrew路径,粘贴到终端并安装。

步骤2:

brew install geckodriver

步骤3:

pip install webdriver-manager

实际上,我发现你可以使用最新的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问题,如果您正在测试的站点有一个不受信任的证书,您就会遇到这个问题。参见如何使用Selenium禁用Firefox的不受信任连接警告?

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

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

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

Firefox: Sudo apt-get install firefox-geckodriver

铬: 安装chromium-chromedriver

Selenium在他们的描述中回答了这个问题。rst文件:

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

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

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

Mac的步骤

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

短的方法

下载并解压Geckodriver。 在启动驱动程序时提到路径: firefox (executable_path='/your/path/to/geckodriver')

长方法

下载并解压Geckodriver。 . bash_profile开放。如果您还没有创建它,您可以使用命令:touch ~/.bash_profile。然后使用open ~/.bash_profile打开它 考虑到GeckoDriver文件存在于你的Downloads文件夹中,你可以在.bash_profile文件中添加以下代码行: 路径= " /用户/ <你的名字> /下载/ geckodriver:美元路径” 导出路径

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

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

源~ / . bash_profile

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