Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

In this tutorial, we’ll look at the common Selenium error: “The path to the driver executable must be set by the webdriver.chrome.driver system property“. This error prevents Selenium from launching the browser. It’s caused by an incomplete configuration. We’ll learn how to fix this problem by doing a correct setup, either manually or automatically.

2. Reason for the Error

Selenium requires some setup steps before we can use it, like setting the path to the WebDriver. If we don’t configure the path to the WebDriver, we can’t run it to control the browser, and we’ll get a java.lang.IllegalStateException.

Let’s have a look at an incomplete setup that results in this error:

WebDriver driver = new ChromeDriver();

With that statement, we want to create a new ChromeDriver instance, but as we didn’t provide the path to the WebDriver, Selenium can’t run it, and it fails with the error “java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.chrome.driver system property“.

To fix this issue, we need to perform a correct setup. We can do this either manually or automatically using a dedicated library.

3. Manual Setup

First, we need to download the correct WebDriver for our browser. It’s essential to download the right version according to our browser because, otherwise, there can be unforeseen issues when running it.

The correct WebDriver can be downloaded from these sites:

Selenium then needs the path to the downloaded driver so that it can run it to control the browser. We can set the path to the driver with a system property. The key of the property is different for each browser:

  • Chrome: webdriver.chrome.driver
  • Firefox: webdriver.gecko.driver
  • Edge: webdriver.edge.driver

Let’s look at the manual setup for Chrome. We set the path to the previously downloaded WebDriver, and then create a ChromeDriver instance:

WebDriver driver;

void setupChromeDriver() {
    System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
    driver = new ChromeDriver();
    options();
}

void options() {
    driver.manage().window().maximize();
}

The path can be relative or absolute. Additionally, we can set various settings, like maximizing the browser window in the example above.

The setup works very similarly for the other browsers. As we can see below, we only need to replace the driver setup methods and set the path for the respective driver:

void setupGeckoDriver() {
    System.setProperty("webdriver.gecko.driver", "src/test/resources/geckodriver.exe");
    driver = new FirefoxDriver();
    options();
}

void setupEdgeDriver() {
    System.setProperty("webdriver.edge.driver", "src/test/resources/msedgedriver.exe");
    driver = new EdgeDriver();
    options();
}

To verify the setup, we can perform a small check on https://www.baeldung.com:

String TITLE_XPATH = "//a[@href='/']";
String URL = "https://www.baeldung.com";

@Test
void givenChromeDriver_whenNavigateToBaeldung_thenFindTitleIsSuccessful() {
    setupChromeDriver();
    driver.get(URL);
    final WebElement title = driver.findElement(By.xpath(TITLE_XPATH));

    assertEquals("Baeldung", title.getAttribute("title"));
}

If the setup still doesn’t work, we need to make sure the path to the WebDriver is correct.

4. Automated Setup

The manual setup can be cumbersome since we need to download the specific WebDriver manually. We also need to make sure we’re using the correct version. If the installed browser has auto updates enabled, this can require us to replace the WebDriver with an updated version regularly.

To overcome this, we can make use of the WebDriverManager library, which handles these tasks for us every time we run it.

First, we need to add the dependency to our pom.xml:

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

The setup using the library is straightforward and requires just one line of code:

WebDriver driver;

void setupChromeDriver() {
    WebDriverManager.chromedriver().setup();
    driver = new ChromeDriver();
    options();
}

void options() {
    driver.manage().window().maximize();
}

During the setup, WebDriverManager checks the installed browser version and automatically downloads the correct WebDriver version. It sets the system property and then runs the browser.

Adapting the setup for other browsers is also straightforward:

void setupGeckoDriver() {
    WebDriverManager.firefoxdriver().setup();
    driver = new FirefoxDriver();
    options();
}

void setupEdgeDriver() {
    WebDriverManager.edgedriver().setup();
    driver = new EdgeDriver();
    options();
}

Again, we can verify this setup with a small test on https://www.baeldung.com:

String TITLE_XPATH = "//a[@href='/']";
String URL = "https://www.baeldung.com";

@Test
void givenChromeDriver_whenNavigateToBaeldung_thenFindTitleIsSuccessful() {
    setupChromeDriver();
    driver.get(URL);
    final WebElement title = driver.findElement(By.xpath(TITLE_XPATH));

    assertEquals("Baeldung", title.getAttribute("title"));
}

5. Conclusion

In this article, we saw what causes the Selenium error “The path to the driver executable must be set by the webdriver.chrome.driver system property” and how we can fix it.

We can do a manual setup, but it results in some maintenance work. The automated setup using the WebDriverManager library reduces maintenance when working with Selenium.

As always, the implementation of all these examples can be found on GitHub.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.