Expand Authors Top

If you have a few years of experience in the Java ecosystem and you’d like to share that with the community, have a look at our Contribution Guidelines.

Partner – Frontegg – expanded (cat = Security)
announcement - icon User management is very complex, when implemented properly. No surprise here.

Not having to roll all of that out manually, but instead integrating a mature, fully-fledged solution - yeah, that makes a lot of sense.
That's basically what Frontegg is - User Management for your application. It's focused on making your app scalable, secure and enjoyable for your users.
From signup to authentication, it supports simple scenarios all the way to complex and custom application logic.

Have a look:

>> Elegant User Management, Tailor-made for B2B SaaS

Partner – Frontegg – expanded (cat = Spring Security)
announcement - icon User management is very complex, when implemented properly. No surprise here.

Not having to roll all of that out manually, but instead integrating a mature, fully-fledged solution - yeah, that makes a lot of sense.
That's basically what Frontegg is - User Management for your application. It's focused on making your app scalable, secure and enjoyable for your users.
From signup to authentication, it supports simple scenarios all the way to complex and custom application logic.

Have a look:

>> Elegant User Management, Tailor-made for B2B SaaS

Generic Top

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

>> CHECK OUT THE COURSE

1. Overview

In this tutorial, we'll take a 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 over on GitHub.

Generic bottom

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

>> CHECK OUT THE COURSE
Junit footer banner
guest
0 Comments
Inline Feedbacks
View all comments