Todas las respuestas anteriores son correctas, la siguiente es una pequeña inmersión profunda en el problema y la solución.
El constructor del controlador en selenio, por ejemplo
WebDriver driver = new ChromeDriver();
busca el ejecutable del controlador, en este caso, el controlador de Chrome busca el ejecutable del controlador de Chrome, en caso de que el servicio no pueda encontrar el ejecutable, se genera la excepción
De aquí viene la excepción (tenga en cuenta el método de verificación del estado)
/**
*
* @param exeName Name of the executable file to look for in PATH
* @param exeProperty Name of a system property that specifies the path to the executable file
* @param exeDocs The link to the driver documentation page
* @param exeDownload The link to the driver download page
*
* @return The driver executable as a {@link File} object
* @throws IllegalStateException If the executable not found or cannot be executed
*/
protected static File findExecutable(
String exeName,
String exeProperty,
String exeDocs,
String exeDownload) {
String defaultPath = new ExecutableFinder().find(exeName);
String exePath = System.getProperty(exeProperty, defaultPath);
checkState(exePath != null,
"The path to the driver executable must be set by the %s system property;"
+ " for more information, see %s. "
+ "The latest version can be downloaded from %s",
exeProperty, exeDocs, exeDownload);
File exe = new File(exePath);
checkExecutable(exe);
return exe;
}
El siguiente es el método de estado de verificación que arroja la excepción
/**
* Ensures the truth of an expression involving the state of the calling instance, but not
* involving any parameters to the calling method.
*
* <p>See {@link #checkState(boolean, String, Object...)} for details.
*/
public static void checkState(
boolean b,
@Nullable String errorMessageTemplate,
@Nullable Object p1,
@Nullable Object p2,
@Nullable Object p3) {
if (!b) {
throw new IllegalStateException(format(errorMessageTemplate, p1, p2, p3));
}
}
SOLUCIÓN : establezca la propiedad del sistema antes de crear el objeto del controlador de la siguiente manera
System.setProperty("webdriver.gecko.driver", "path/to/chromedriver.exe");
WebDriver driver = new ChromeDriver();
El siguiente es el fragmento de código (para Chrome y Firefox) donde el servicio del controlador busca el ejecutable del controlador:
Cromo:
@Override
protected File findDefaultExecutable() {
return findExecutable("chromedriver", CHROME_DRIVER_EXE_PROPERTY,
"https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver",
"http://chromedriver.storage.googleapis.com/index.html");
}
FireFox:
@Override
protected File findDefaultExecutable() {
return findExecutable(
"geckodriver", GECKO_DRIVER_EXE_PROPERTY,
"https://github.com/mozilla/geckodriver",
"https://github.com/mozilla/geckodriver/releases");
}
donde CHROME_DRIVER_EXE_PROPERTY = "webdriver.chrome.driver" y GECKO_DRIVER_EXE_PROPERTY = "webdriver.gecko.driver"
similar es el caso de otros navegadores, a continuación se muestra la instantánea de la lista de implementaciones de navegador disponibles