尽管驱动程序位于 /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 一起工作? (它确实适用于 chromedriverwebdriver.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有什么区别?

linux usr/bin/和 usr/local/bin之间的关系,什么是软链接?

Linux开发引导

linux命令帮助

linux命令帮助