尽管驱动程序位于 /usr/local/bin 中,但 Selenium “无法找到一组匹配的功能”
Posted
技术标签:
【中文标题】尽管驱动程序位于 /usr/local/bin 中,但 Selenium “无法找到一组匹配的功能”【英文标题】:Selenium "Unable to find a matching set of capabilities" despite driver being in /usr/local/bin 【发布时间】:2017-09-28 12:49:37 【问题描述】:我正在尝试学习有关 Selenium 的教程,http://selenium-python.readthedocs.io/getting-started.html。我已经下载了最新版本的geckodriver
并将其复制到/usr/local/bin
。但是,当我尝试
from selenium import webdriver
driver = webdriver.Firefox()
我收到以下错误消息:
Traceback (most recent call last):
File "/Users/kurtpeek/Documents/Scratch/selenium_getting_started.py", line 4, in <module>
driver = webdriver.Firefox()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/firefox/webdriver.py", line 152, in __init__
keep_alive=True)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 98, in __init__
self.start_session(desired_capabilities, browser_profile)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 188, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in execute
self.error_handler.check_response(response)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Unable to find a matching set of capabilities
[Finished in 1.2s with exit code 1]
来自https://github.com/SeleniumHQ/selenium/issues/3884,似乎其他用户也遇到了类似的问题,但 Selenium 团队无法重现它。如何让 Selenium 与 Firefox 一起工作? (它确实适用于 chromedriver
和 webdriver.Chrome()
实例,所以我怀疑这可能是 Selenium 中的一个错误)。
【问题讨论】:
希望你把 geckodriver 放到系统 PATH 中。 @Shailendra 如果它不在 PATH 变量中,则会得到不同的错误。 如果你使用服务器,安装firefox,即使你没有UI,也可以在“Headless”模式下运行,Selenium需要它 【参考方案1】:更新 Firefox 和 Selenium 为我解决了这个问题。但是,我不会假装对根本原因有解释。
更新 Firefox 48 → 53 更新到 Selenium 3.4.1我还使用Homebrew
重新安装/更新了Geckodriver
并明确将其用作Selenium WebDriver
的可执行文件,但事实证明没有必要缓解“无法找到匹配集能力” 错误。
【讨论】:
另外,就我而言。 “sudo ln -s /usr/bin/firefox-developer-edition /usr/bin/firefox”修复了一些问题。 ;-) 正如@Ubuntourist 所说:确保Firefox 可执行文件在您的PATH
中。如果您运行的不是通过包管理器安装的夜间版本或开发者版本,这一点尤其重要。【参考方案2】:
我也遇到了同样的问题,这个问题与使用 Firefox ESR(我在 Debian 上)有关。更具体地说,我在 Debian 10 上使用 64 位 Firefox 68.11.0esr、python3.7、selenium 3.141.0 和 geckodriver 0.27.0。
这是我使用的失败的标准示例:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("http://google.com")
按照this answer的建议,我改了:
browser = webdriver.Firefox()
到
browser = webdriver.Firefox(firefox_binary="/usr/bin/firefox-esr")
它成功了。
如果你不知道firefox-esr的路径,你可以在命令行运行sudo find / -name firefox-esr
。应该有几个。
【讨论】:
【参考方案3】:对我来说,升级 FF 就足够了
【讨论】:
更新 Firefox 也为我解决了这个问题。转到帮助>关于 Firefox,它将自动开始更新 Firefox 浏览器。更新完成后重启浏览器。 我正在使用 Firefox 61.0.2 (64-bit) ,windows10 ,python 3.5 ,selenium3.14 但我收到错误 selenium.common.exceptions.SessionNotCreatedException: Message: Unable to find a matching一组能力【参考方案4】:Mac 用户在这里。
我通过确保将 Firefox 命名为“Firefox”并位于“应用程序”文件夹中来解决此问题。我之前称它为“Firefox 58”(我有多个版本)。
【讨论】:
天啊,这么简单的修复花了这么多时间。非常感谢!【参考方案5】:在这里分享我的成功案例
注意:请记住这里的架构很重要,Window 64/32 或 Linux 64/32。确保下载正确的 64/32 位 Selenium Webdriver、64/32 Geckodriver。
我的配置如下:
Linux: Centos 7 64bit, Window 7 64bit
Firefox: 52.0.3
Selenium Webdriver: 3.4.0 (Windows), 3.8.1 (Linux Centos
)
GeckoDriver: v0.16.0 (Windows), v0.17.0 (Linux Centos)
工作代码(无代理设置)
System.setProperty("webdriver.gecko.driver", "/home/seleniumproject/geckodrivers/linux/v0.17/geckodriver");
ProfilesIni ini = new ProfilesIni();
// Change the profile name to your own. The profile name can
// be found under .mozilla folder ~/.mozilla/firefox/profile.
// See you profile.ini for the default profile name
FirefoxProfile profile = ini.getProfile("default");
DesiredCapabilities cap = new DesiredCapabilities();
cap.setAcceptInsecureCerts(true);
FirefoxBinary firefoxBinary = new FirefoxBinary();
GeckoDriverService service =new GeckoDriverService.Builder(firefoxBinary)
.usingDriverExecutable(new File("/home/seleniumproject/geckodrivers/linux/v0.17/geckodriver"))
.usingAnyFreePort()
.build();
try
service.start();
catch (IOException e)
e.printStackTrace();
FirefoxOptions options = new FirefoxOptions().setBinary(firefoxBinary).setProfile(profile).addCapabilities(cap);
driver = new FirefoxDriver(options);
driver.get("https://www.google.com");
System.out.println("Life Title -> " + driver.getTitle());
driver.close();
工作代码(带代理设置)
System.setProperty("webdriver.gecko.driver", "/home/seleniumproject/geckodrivers/linux/v0.17/geckodriver");
String PROXY = "my-proxy.co.jp";
int PORT = 8301;
ProfilesIni ini = new ProfilesIni();
// Change the profile name to your own. The profile name can
// be found under .mozilla folder ~/.mozilla/firefox/profile.
// See you profile.ini for the default profile name
FirefoxProfile profile = ini.getProfile("default");
com.google.gson.JsonObject json = new com.google.gson.JsonObject();
json.addProperty("proxyType", "manual");
json.addProperty("httpProxy", PROXY);
json.addProperty("httpProxyPort", PORT);
json.addProperty("sslProxy", PROXY);
json.addProperty("sslProxyPort", PORT);
DesiredCapabilities cap = new DesiredCapabilities();
cap.setAcceptInsecureCerts(true);
cap.setCapability("proxy", json);
FirefoxBinary firefoxBinary = new FirefoxBinary();
GeckoDriverService service =new GeckoDriverService.Builder(firefoxBinary)
.usingDriverExecutable(new File("/home/seleniumproject/geckodrivers/linux/v0.17/geckodriver"))
.usingAnyFreePort()
.usingAnyFreePort()
.build();
try
service.start();
catch (IOException e)
e.printStackTrace();
FirefoxOptions options = new FirefoxOptions().setBinary(firefoxBinary).setProfile(profile).addCapabilities(cap);
driver = new FirefoxDriver(options);
driver.get("https://www.google.com");
System.out.println("Life Title -> " + driver.getTitle());
driver.close();
【讨论】:
你能帮帮我吗???我正在努力在我刚购买的 VPS 中设置 selenium,以便我可以准确地做到这一点。 first tried with chrome, but still running into an issue after hours of troubleshooting. 所以现在决定尝试 firefox,但得到一个不同的错误:selenium.common.exceptions.SessionNotCreatedException: Message: Unable to find a matching set of capabilities
似乎 Firefox 和 GeckoDriver 不匹配。可以给我关于 Firefox 版本、Geckodriver 和 Selenium 版本的详细信息吗?
我搞定了!!不知道为什么会抛出那个错误
很高兴知道! 7:)【参考方案6】:
就我而言,我只有 Firefox 开发者版,但仍然抛出同样的错误。
安装一个标准的火狐版本后,就解决了。
【讨论】:
问题不在于 Firefox 开发者版本身,而在于它的名称。如果您将该版本从Firefox Developer Edition
重命名为 Firefox
应该没问题。【参考方案7】:
我有同样的问题。我的 geckodriver 是 32 位的,而 fireFox 是 64 位的。通过将 geckodriver 更新为 64 位来解决。
【讨论】:
【参考方案8】:我在使用 selenium firefox() 时遇到了完全相同的问题
>> webdriver.Firefox()
它不起作用:抛出类似 “无法找到匹配的功能集”之类的错误
然后我安装了 geckodriver.exe 并将那个 .exe 文件放在两个目录中
C:\Users\<USER-NAME>\AppData\Local\Programs\Python\Python36\Scripts
和
C:\Users\<USER-NAME>\AppData\Local\Programs\Python\Python36\
并在环境设置
中设置这两条路径然后它开始工作了
【讨论】:
【参考方案9】:这是为我解决它的解决方案。不要忽视这一点:确保您使用的是正确的 32/64 位版本的二进制文件 - 它应该是统一的 - 例如如果 Firefox 是 64 位的,那么 geckodriver 也必须如此。
【讨论】:
【参考方案10】:在 DigitalOcean - FireFox 未安装的液滴上遇到相同的错误。错误的堆栈跟踪如下所示 -
exception_class
<class 'selenium.common.exceptions.SessionNotCreatedException'>
json
<module 'json' from '/usr/lib/python3.5/json/__init__.py'>
message
'Unable to find a matching set of capabilities'
response
'status': 500,
'value': '"value":"error":"session not created","message":"Unable to find a '
'matching set of capabilities","stacktrace":""'
screen
None
self
<selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7f428e3f10f0>
stacktrace
None
status
'session not created'
value
'error': 'session not created',
'message': 'Unable to find a matching set of capabilities',
'stacktrace': ''
value_json
('"value":"error":"session not created","message":"Unable to find a matching '
'set of capabilities","stacktrace":""')
【讨论】:
【参考方案11】:似乎不同的解决方法似乎可以使错误消失。在确保您已下载并安装 Firefox 和 geckodriver.exe 的 64 位版本后,使用 geckodriver.exe 的位置更新 PATH。 在运行脚本之前,启动 geckodriver.exe 会打开类似 cmd 的窗口。现在如果你运行 py 脚本,你应该不会遇到下面的错误:
selenium.common.exceptions.SessionNotCreatedException: Message: Unable to find a matching set of capabilities
【讨论】:
以上是关于尽管驱动程序位于 /usr/local/bin 中,但 Selenium “无法找到一组匹配的功能”的主要内容,如果未能解决你的问题,请参考以下文章
Linux 文件系统 /bin/sbin/usr/bin/usr/sbin/usr/local/bin/usr/local/sbin 的作用
linux里根目录下的/bin,usr里的/usr/bin还有local里的/usr/local/bin有什么区别?