【问题标题】:org.openqa.selenium.SessionNotCreatedException: Unable to find a matching set of capabilities while initiating Firefox v37 through Selenium v3.11.0org.openqa.selenium.SessionNotCreatedException:通过 Selenium v​​3.11.0 启动 Firefox v37 时无法找到一组匹配的功能
【发布时间】:2018-09-22 05:13:39
【问题描述】:

我正在尝试在 Firefox 中运行测试网站,但出现错误“驱动程序可执行文件的路径必须由 webdriver.gecko.driver 系统属性设置;”我已经正确设置了路径,但仍然不知道问题出在哪里。这是我的代码:

if (browsers.equalsIgnoreCase("Firefox")) 
{
        String driverPath = System.getProperty("user.dir") + "\\src/test/java\\drivers\\geckodriver.exe";
        System.setProperty("webdriver.firefox.marionette", "false");
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    } else if (browsers.equalsIgnoreCase("Chrome")) {
        // String driverPath = System.getProperty("user.dir") +
        // "\\src\\Drivers\\chromedriver";
        // System.setProperty("webdriver.chrome.driver", driverPath);
        System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

    }

这是我的代码的失败跟踪:

FAILED CONFIGURATION: @BeforeClass launchBrowser
org.openqa.selenium.SessionNotCreatedException: Unable to find a matching set of capabilities
Build info: version: '3.8.0', revision: '924c4067df', time: '2017-11-30T11:36:59.109Z'
System info: host: 'DSCHD-PC-180', ip: '192.168.6.122', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_161'
Driver info: driver.version: FirefoxDriver
remote stacktrace: 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.W3CHandshakeResponse.lambda$new$0(W3CHandshakeResponse.java:57)
    at org.openqa.selenium.remote.W3CHandshakeResponse.lambda$getResponseFunction$2(W3CHandshakeResponse.java:104)
    at org.openqa.selenium.remote.ProtocolHandshake.lambda$createSession$0(ProtocolHandshake.java:123)
    org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:126)
    at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:73)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:142)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:601)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:219)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:142)
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:120)
    at Utility.UtilityMethods.openBrowser(UtilityMethods.java:26)
    at TestCases.LoginTestCase.launchBrowser(LoginTestCase.java:35)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
    at org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:59)
    at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:455)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:222)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:142)
    at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:168)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:105)
    at org.testng.TestRunner.privateRun(TestRunner.java:648)
    at org.testng.TestRunner.run(TestRunner.java:505)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
    at org.testng.SuiteRunner.run(SuiteRunner.java:364)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
    at org.testng.TestNG.runSuites(TestNG.java:1049)
    at org.testng.TestNG.run(TestNG.java:1017)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

SKIPPED CONFIGURATION: @AfterClass quitBrowser
SKIPPED: registration   

【问题讨论】:

标签: selenium firefox selenium-webdriver webdriver geckodriver


【解决方案1】:

我有这个错误2天,我的解决方案是在Set.Platform中,放入Platform.ANY或Platform.Windows,因为Platform.WIN10不起作用,木偶不是必需的。

public class Main { public static RemoteWebDriver driver;

public static void main(String[] args) throws MalformedURLException {
    System.setProperty("webdriver.gecko.driver", "D:/Lib/geckodriver.exe");
    DesiredCapabilities desiredCapabilities = new 
                                        DesiredCapabilities().firefox();
    desiredCapabilities.setPlatform(Platform.ANY);
    desiredCapabilities.setBrowserName("firefox");

    driver = new RemoteWebDriver(new URL("http://172.20.19.182:5557/wd/hub"), 
                                                desiredCapabilities);
    driver.navigate().to("http://www.google.com");
    driver.findElementByName("q").sendKeys("execute automation");
    driver.findElementByName("q").sendKeys(Keys.ENTER);
    driver.close();
    // write your code here
}

【讨论】:

    【解决方案2】:

    刚刚更新了您的代码。您必须在setProperty 和用户webdriver.gecko.driver 时设置驱动程序路径以获取最新的firefox 驱动程序。

        if (browsers.equalsIgnoreCase("Firefox")) {
                String driverPath = System.getProperty("user.dir") + "\\src\\test\\java\\drivers\\geckodriver.exe"; 
                System.setProperty("webdriver.firefox.driver", "driverPath"); 
                DesiredCapabilities capabilities = new DesiredCapabilities();
                capabilities.setCapability("marionette", false); 
                FirefoxOptions options = new FirefoxOptions(); 
                options.merge(capabilities);
                FirefoxDriver driver = new FirefoxDriver(options);
                driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            } 
            else if (browsers.equalsIgnoreCase("Chrome")) {
                // String driverPath = System.getProperty("user.dir") +
                // "\\src\\Drivers\\chromedriver";
                // System.setProperty("webdriver.chrome.driver", driverPath);
                System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
                driver = new ChromeDriver();
                driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            }
    

    告诉我。

    【讨论】:

    • 但是问题是我没有使用最新的firefox版本,我使用的是ff 37版。这就是为什么我设置marionette=false,为了兼容性。
    • @RohnKerry,最新的 Firefox 版本是 59,如果你使用的是 ff 版本 37,你不需要为此设置 marionette,那么你必须使用兼容的firefoxdriver.exe
    • 所以你的意思是说我必须为ff版本37下载一个兼容的Firefox Webdriver?
    • 无需下载。您可以使用最新的 FireFox geckodriver,也可以使用 DesiredCapabilities 类设置 marionette=false。
    • 是的,我已经这样做了,但问题是您可以将两个值传递给 .setProperty() 并且我还必须在其中提供 geckodriver 的路径。
    【解决方案3】:

    为简单起见,当您使用 Selenium Client v3.11.0Firefox v37 时,您需要从 @ 下载最新的 GeckoDriver 987654321@ 并将其保存在系统中的任何位置。接下来在 System.setProperty() 行中传递 Key webdriver.gecko.driver 以及 Value 作为绝对路径 GeckoDriver ,最后通过 DesiredCapabilities 类将能力 ma​​rionatte 设置为 false 并合并到 em>FirefoxOptions 实例来启动 Firefox 浏览器如下:

    System.setProperty("webdriver.gecko.driver", "C:/path/to/geckodriver.exe");
    DesiredCapabilities dc = new DesiredCapabilities();
    dc.setCapability("marionatte", false);
    FirefoxOptions opt = new FirefoxOptions();
    opt.merge(dc);
    FirefoxDriver driver =  new FirefoxDriver(opt);
    driver.get("https://stackoverflow.com");
    System.out.println("Application opened");
    System.out.println("Page Title is : "+driver.getTitle());
    driver.quit();
    

    更新

    根据您的评论更新,您正在使用 GeckoDriver v0.20.1

    但是,如果您回顾一下 GeckoDriver v0.18.0 的发行说明,它清楚地提到:

    geckodriver now recommends Firefox 53 and greater
    

    因此,使用 GeckoDriver v0.18.0 及更高版本您必须强制使用 Firefox 53 及更高版本。要摆脱这个限制,您可以降级到这些版本中的任何一个:

    • GeckoDriver v0.17.0
    • GeckoDriver v0.16.1

    【讨论】:

    • 此代码给我错误“无法找到匹配的功能集”,这意味着它没有将功能木偶设置为“假”
    • 只是为了更新您,我做了一些更改- dc.setCapability("marionatte", false); FirefoxDriver 驱动程序 = 新的 FirefoxDriver(dc); ....这已经启动了 Firefox 浏览器,但现在我收到错误“连接被拒绝”,为什么会发生这种情况?
    • @RohnKerry 请用完整的错误堆栈跟踪更新问题以供进一步分析
    • 我已经找到了解决方案。代码是:System.setProperty("webdriver.firefox.marionette","D:\\geckodriver.exe");
    • 我的geckodriver版本是-geckodriver-v0.20.1
    【解决方案4】:

    你正在使用 user.dir 这基本上意味着:当前工作目录

    这是让您使用 selenium 初始化 firefox 浏览器的代码。

    public static void main(String[] args) {
    
    
                System.setProperty("webdriver.gecko.driver", "C:\\your\\gecko\\driver\\path\\geckodriver.exe");
                driver = new firefoxDriver();
    

    就是这样!您可以使用 Firefox 驱动程序执行多个操作,例如:

    1.  driver.get(String args0);
    2.  driver.getCurrentUrl();
    3.  driver.getPageSource();
    4.  driver.getTitle();
    5.  driver.findElememt(By args0);
    6.  driver.findElements(By args0);
    7.  driver.naviagate();
    8.  driver.manage();
    9.  driver.close();
    10. driver.quit();
    11. driver.switchTo();
    12. driver.getWindowHandle();
    13. driver.getWindowHandles();
    

    如果您对此有任何疑虑,请告诉我。

    【讨论】:

    • 这是正确的,但问题是,我使用的是 firefox 版本 37,所以我必须将 marionette=false。现在我们只能在 .setProperty 中发送两个字符串值。那么我可以将 geckodriver 的路径放在哪里?
    • 您在 FF37 中使用的是哪个版本的 selenium?
    • 我们可以这样做吗- System.setProperty("webdriver.firefox.marionette=false", "driverPath"); ?
    • 我正在使用 selenium 3.11.0
    • @RohnKerry :我不确定。给我一些时间,如果我有什么发现,我会更新你!
    【解决方案5】:

    这是系统属性的设置方式:

    System.setProperty("webdriver.gecko.driver", "C:\\...\\geckodriver.exe");
    

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 2019-04-04
      • 1970-01-01
      • 2018-05-26
      • 2018-12-31
      • 2018-07-30
      • 2017-11-30
      • 2019-01-30
      相关资源
      最近更新 更多