42

I'm using Firefox 47.0 with Selenium 2.53. Recently they have been a bug between Selenium and Firefox which make code not working. One of the solution is to use the Marionnette driver.

I followed the instruction of this site to use this new driver with a RemotWebDriver but I keep having the error :

WARN - Exception: Exception in thread "main" org.openqa.selenium.WebDriverException: The path to the driver executable must be set by the webdriver.gecko.driver system property; for more information, see https://github.com/jgraham/wires. The latest version can be downloaded from ....

The code i've tried so far is very simple :

public class Test {
    static WebDriver driver;
    static Wait<WebDriver> wait;
    public static void main(String[] args) throws MalformedURLException {
        System.setProperty("webdriver.gecko.driver", "C:\\Selenium\\geckodriver.exe");
        DesiredCapabilities cap = DesiredCapabilities.firefox();
        cap.setCapability("marionette", true);
        cap.setBrowserName("firefox");
        driver = new RemoteWebDriver(new URL("http://192.168.117.135:5555/wd/hub"), cap);//true to enable the JS
        wait = new WebDriverWait(driver, 3000);
        final String url = "https://www.google.com/";

        JavascriptExecutor js = (JavascriptExecutor) driver;

        try {
            driver.navigate().to(url);
        } finally {
            driver.close();
        }
    }
}

I'm sure that the path to the geckodriver.exe is right and i don't see where i did the mistake.

EDIT 1: I tried the following code :

public class Test {
    static WebDriver driver;
    static Wait<WebDriver> wait;
    public static void main(String[] args) throws MalformedURLException {
        System.setProperty("webdriver.gecko.driver", "C:\\Selenium\\geckodriver.exe");

        driver = new MarionetteDriver();
        wait = new WebDriverWait(driver, 3000);
        final String url = "https://www.google.com/";

        JavascriptExecutor js = (JavascriptExecutor) driver;

        try {
            driver.navigate().to(url);
        } finally {
            driver.close();
        }
    }
}

and it's working it seems that the problem come from the RemoteWebDriver and the gecko driver, any of you have news on it ?

Ripon Al Wasim
  • 36,924
  • 42
  • 155
  • 176
Omegaspard
  • 1,828
  • 2
  • 24
  • 52

10 Answers10

34

Recently Selenium has launched Selenium 3 and if you are trying to use Firefox latest version then you have to use GeckoDriver:

System.setProperty("webdriver.gecko.driver","G:\\Selenium\\Firefox driver\\geckodriver.exe");
WebDriver driver = new FirefoxDriver();

You can check full documentation from here

Ripon Al Wasim
  • 36,924
  • 42
  • 155
  • 176
Mukesh otwani
  • 821
  • 8
  • 11
  • 5
    This solution is clearly tied to Windows (because of the path). Is there a platform independent way to do this, or does it need to be set for each machine that going to run Selenium 3 code? – Brick Aug 15 '16 at 18:17
  • 1
    What we tend to do is have a conf. file which is environment-specific (test machine IP, various ports, paths etc.) and use it as such, but no, I wasn't very happy with having to specify a path to an executable to be able to run a test. If anyone has a better idea, I would appreciate being enlightened. – Tomislav Nakic-Alfirevic Aug 30 '16 at 14:46
  • for mac you can download webdriver from here: https://github.com/mozilla/geckodriver/releases. Also set property like this System.setProperty("webdriver.gecko.driver", "/Users/gecko/geckodriver"); – clockworks Oct 19 '17 at 21:36
13

You can handle the Firefox driver automatically using WebDriverManager.

This library downloads the proper binary (geckodriver) for your platform (Mac, Windows, Linux) and then exports the proper value of the required Java environment variable (webdriver.gecko.driver).

Take a look at a complete example as a JUnit test case:

public class FirefoxTest {

  private WebDriver driver;

  @BeforeClass
  public static void setupClass() {
    WebDriverManager.firefoxdriver().setup();
  }

  @Before
  public void setupTest() {
    driver = new FirefoxDriver();
  }

  @After
  public void teardown() {
    if (driver != null) {
      driver.quit();
    }
  }

  @Test
  public void test() {
    // Your test code here
  }
}

If you are using Maven you have to put at your pom.xml:

<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>5.1.0</version>
</dependency>

WebDriverManager does magic for you:

  1. It checks for the latest version of the WebDriver binary
  2. It downloads the WebDriver binary if it's not present on your system
  3. It exports the required WebDriver Java environment variables needed by Selenium

So far, WebDriverManager supports Chrome, Opera, Internet Explorer, Microsoft Edge, PhantomJS, and Firefox.

Boni García
  • 4,618
  • 5
  • 28
  • 44
12

I am also facing the same issue and got the resolution after a day :

The exception is coming because System needs Geckodriver to run the Selenium test case. You can try this code under the main Method in Java

    System.setProperty("webdriver.gecko.driver","path of/geckodriver.exe");
    DesiredCapabilities capabilities=DesiredCapabilities.firefox();
    capabilities.setCapability("marionette", true);
    WebDriver driver = new FirefoxDriver(capabilities);

For more information You can go to this https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver link.

Please let me know if the issue doesn't get resolved.

Purendra Agrawal
  • 558
  • 1
  • 6
  • 17
  • Thanks... I'm getting `Caused by: java.net.ConnectException: Connection refused: connect` on your 4th line here... any idea what that might be about? – mike rodent Sep 03 '16 at 07:52
  • As per my understanding, ConnectException will come when the connection was refused remotely. Did you give the correct path for the geckodriver in the line1? – Purendra Agrawal Sep 03 '16 at 16:13
  • Hah! Thanks... got it working eventually. Thanks for spending a day of your precious life on this... I wonder what all this business of "gecko" and "marionette" and "capability" is all about? And why it's so vital that you have to jump through this hoop to use Selenium 3.0.0.? – mike rodent Sep 03 '16 at 19:04
9

The solutions above work fine for local testing and firing up browsers from the java code.If you fancy firing up your selenium grid later then this parameter is a must have in order to tell the remote node where to find the geckodriver:

-Dwebdriver.gecko.driver="C:\geckodriver\geckodriver.exe"

The node cannot find the gecko driver when specified in the Automation Java code.

So the complete command for the node whould be (assuming node and hub for test purposes live on same machine) :

java -Dwebdriver.gecko.driver="C:\geckodriver\geckodriver.exe" -jar selenium-server-standalone-2.53.0.jar -role node -hub http://localhost:4444/grid/register

And you should expect to see in the node log :

00:35:44.383 INFO - Launching a Selenium Grid node
Setting system property webdriver.gecko.driver to C:\geckodriver\geckodriver.exe
voji
  • 483
  • 4
  • 8
George Papatheodorou
  • 1,539
  • 19
  • 23
  • 1
    The given syntax throw an exception with newer selenium-server versions (like 3.2.0): Exception in thread "main" com.beust.jcommander.ParameterException: Unknown option: -Dwebdriver.gecko.driver=geckodriver.exe at com.beust.jcommander.JCommander.parseValues(JCommander.java:742) ... To avoid this, you need to change the arguments order (property declaration first, jar, and program args. after). Example: java -Dwebdriver.gecko.driver="./geckodriver.exe" -jar selenium-server-standalone-3.2.0.jar -role node -hub http://10.64.201.100:4444/grid/register/ – voji Mar 10 '17 at 11:41
3

I create a simple Java application by archetype maven-archetype-quickstar, then revise pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>bar</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>bar</name>
    <description>bar</description>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.0.0-beta3</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-server</artifactId>
            <version>3.0.0-beta3</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-api</artifactId>
            <version>3.0.0-beta3</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-firefox-driver</artifactId>
            <version>3.0.0-beta3</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>bar</finalName>
    </build>
</project>

and

package bar;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class AppTest {

    /**
     * Web driver.
     */
    private static WebDriver driver = null;

    /**
     * Entry point.
     * 
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        // Download "geckodriver.exe" from https://github.com/mozilla/geckodriver/releases
        System.setProperty("webdriver.gecko.driver","F:\\geckodriver.exe");
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("http://localhost:8080/foo/");
        String sTitle = driver.getTitle();
        System.out.println(sTitle);
    }

}

You also use on Mac OS X, Linux: https://github.com/mozilla/geckodriver/releases

and

// On Mac OS X.
System.setProperty("webdriver.gecko.driver", "/Users/donhuvy/Downloads/geckodriver");
Vy Do
  • 46,709
  • 59
  • 215
  • 313
  • I have tried with given set property line, but I am not able to launch the Firefox browser in mac machine. – ChayanC Jul 03 '17 at 13:22
3

I try to make it simple. You have two options while using Selenium 3+:

  • Either upgrade your Firefox to 47.0.1 or higher and use the default geckodriver of Selenium3.

  • Or disable using of geckodriver by specifying marionette to false and use the legacy Firefox driver. a simple command to run selenium is: java -Dwebdriver.firefox.marionette=false -jar selenium-server-standalone-3.0.1.jar. You can also disable using geckodriver from other commands that are mentioned in other answers.

Moradnejad
  • 3,466
  • 2
  • 30
  • 52
  • 1
    Thanks, this worked for me trying to set up codeception on Debian, with iceweasel installed. – dmgig Jan 11 '17 at 16:04
2

You need to specify the system property with the path the .exe when starting the Selenium server node. See also the accepted anwser to Selenium grid with Chrome driver (WebDriverException: The path to the driver executable must be set by the webdriver.chrome.driver system property)

Community
  • 1
  • 1
Gecki
  • 49
  • 3
2

This can be due to system cannot find firefox installed location on path.

Try following code, which should work.

System.setProperty("webdriver.firefox.bin","C:\\Program Files\\Mozilla Firefox\\firefox.exe"); 
System.setProperty("webdriver.gecko.driver","<location of geckodriver>\\geckodriver.exe");
ShiyamTJ
  • 776
  • 8
  • 10
1

It is important to remember that the driver(file) must have execution permission (linux chmod +x geckodriver).

To sum up:

  1. Download gecko driver
  2. Add execution permission
  3. Add system property:

    System.setProperty("webdriver.gecko.driver", "FILE PATH");

  4. Instantiate and use the class

    WebDriver driver = new FirefoxDriver();

  5. Do whatever you want

  6. Close the driver

    driver.close;

Carlos Caldas
  • 806
  • 11
  • 12
-1

I'm using FirefoxOptions class to set the binary location with Firefox 52.0, GeckoDriver v0.15.0 and Selenium 3.3.1 as mentioned in this article - http://www.automationtestinghub.com/selenium-3-0-launch-firefox-with-geckodriver/

The java code that I used -

FirefoxOptions options = new FirefoxOptions();
options.setBinary("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"); //location of FF exe

FirefoxDriver driver = new FirefoxDriver(options);
driver.get("http://www.google.com");
Anish Pillai
  • 1,023
  • 7
  • 8
  • not a single word about the `geckodriver.exe`, which should be used the same way Mukesh otwani's answer suggests. – Valya Sep 09 '17 at 11:05
  • I don't recommend to use `3.3.1` Selenium driver because of [specific issues](https://stackoverflow.com/questions/40172788/unable-to-create-new-remote-session/57309891#57309891). To avoid it better to use `3.4.0`. – invzbl3 Aug 01 '19 at 13:34