Selenium“无法找到一组匹配的功能”,尽管驱动程序位于/ usr / local / bin中

时间:2017-05-01 02:19:01

标签: python selenium

我正在尝试关注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中的一个错误。)

12 个答案:

答案 0 :(得分:19)

更新Firefox和Selenium为我解决了这个问题。但是,我并没有假装对根本原因做出解释。

  • 更新了Firefox 48→53
  • 已更新至Selenium 3.4.1

我还使用Geckodriver重新安装/更新Homebrew并明确将其用作Selenium WebDriver的可执行文件,但事实证明,没有必要缓解<{1}} em>&#34;无法找到匹配的功能集&#34; 错误。

答案 1 :(得分:10)

作为旁注,请确保您的geckodriver具有正确的32 / 64bit版本。

答案 2 :(得分:9)

我遇到了同样的问题,该问题与使用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 :(得分:6)

对我而言,仅仅升级FF就足够了

答案 4 :(得分:2)

当我使用硒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\

并在环境设置

中设置这两个路径

然后开始工作

答案 5 :(得分:1)

在这里分享我的成功案例

注意:请记住这里的架构,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();

答案 6 :(得分:1)

我有同样的问题。我的geckodriver是32位,fireFox是64位。已通过将geckodriver更新为64位来解决。

答案 7 :(得分:1)

以下是为我解决的解决方案。不要忽略这一点:确保您使用的是正确的32/64位版本的二进制文件-应该统一-例如如果Firefox是64位的,则必须是geckodriver。

答案 8 :(得分:0)

Mac用户在这里。

我通过确保Firefox命名为&#34; Firefox&#34;来修复此问题。在&#34;应用程序&#34;夹。我打电话给它&#34; Firefox 58&#34;之前(我有多个版本)。

答案 9 :(得分:0)

在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":""}}')

答案 10 :(得分:0)

就我而言,我只有Firefox Developer Edition,但仍然会出现相同的错误。

安装标准Firefox版本后,即可解决。

答案 11 :(得分:0)

似乎不同的解决方法似乎使错误消失了。确保已经下载并安装了Firefox和geckodriver.exe的64位版本后,请使用geckodriver.exe的位置更新PATH。 之前,可能还需要帮助的是启动geckodriver.exe,它会打开一个类似于cmd的窗口。现在,如果您运行py脚本,则不应遇到以下错误:

selenium.common.exceptions.SessionNotCreatedException: Message: Unable to find a matching set of capabilities