我正在用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设置路径,但我不确定如何,所以我该如何做到这一点?


当前回答

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

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

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

On Unix systems you can do the following to append it to your system’s search path, if you’re using a Bash-compatible shell: export PATH=$PATH:/path/to/directory/of/executable/downloaded/in/previous/step On Windows you will need to update the Path system variable to add the full directory path to the executable geckodriver manually or command line** (don't forget to restart your system after adding executable geckodriver into system PATH to take effect)**. The principle is the same as on 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

其他回答

我看到讨论仍然在讨论通过下载二进制文件和手动配置路径来设置geckodriver的旧方法。

这可以使用webdriver-manager自动完成

pip install webdriver-manager

现在问题中的上面代码将简单地与下面的更改一起工作,

from selenium import webdriver
from webdriver_manager.firefox import GeckoDriverManager

driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())

考虑安装一个容器化的Firefox:

docker pull selenium/standalone-firefox
docker run --rm -d -p 5555:4444 --shm-size=2g selenium/standalone-firefox

使用webdriver连接。远程:

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

一些额外的输入/澄清:

下面是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 % 3 / / localhost % 3 a8000 / Firefox和c = UTF-8&f = regular&d = % 20可以% E2 % 80% 9

最简单的方法为Windows!

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

默认不安装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