我正在用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
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之间的任何差异。
实际上,我发现你可以使用最新的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')
一些额外的输入/澄清:
下面是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
此错误消息…
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/')