Tutte le risposte sopra sono corrette, di seguito è la piccola immersione profonda nel problema e nella soluzione.
Il costruttore del driver in selenio, ad esempio
WebDriver driver = new ChromeDriver();
cerca l'eseguibile del driver, in questo caso il driver Chrome cerca l'eseguibile del driver Chrome, nel caso in cui il servizio non sia in grado di trovare l'eseguibile, viene generata l'eccezione
da qui proviene l'eccezione (notare il metodo check state)
/**
*
* @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;
}
Di seguito è riportato il metodo dello stato di controllo che genera l'eccezione
/**
* 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));
}
}
SOLUZIONE : impostare la proprietà di sistema prima di creare l'oggetto driver come segue
System.setProperty("webdriver.gecko.driver", "path/to/chromedriver.exe");
WebDriver driver = new ChromeDriver();
di seguito è riportato lo snippet di codice (per Chrome e Firefox) in cui il servizio driver cerca l'eseguibile del driver:
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");
}
dove CHROME_DRIVER_EXE_PROPERTY = "webdriver.chrome.driver" e GECKO_DRIVER_EXE_PROPERTY = "webdriver.gecko.driver"
simile è il caso di altri browser, di seguito è riportato lo snapshot dell'elenco dell'implementazione del browser disponibile