Java 如何从类路径加载ChromeDriver二进制文件?

Java 如何从类路径加载ChromeDriver二进制文件?,java,webdriver,classpath,selenium-chromedriver,Java,Webdriver,Classpath,Selenium Chromedriver,许多源代码都提到了从类路径加载ChromeDriver二进制文件,但我还没有弄清楚如果二进制文件不在类路径根中该怎么做 要指定二进制文件的路径,似乎必须设置系统属性“webdriver.chrome.driver”。首先,我尝试: System.setProperty("webdriver.chrome.driver", "drivers/Chrome/chromedriver.exe"); 但是我得到了一个错误,它似乎是在位置“C:\\drivers\Chrome\chromedriver.

许多源代码都提到了从类路径加载ChromeDriver二进制文件,但我还没有弄清楚如果二进制文件不在类路径根中该怎么做

要指定二进制文件的路径,似乎必须设置系统属性“webdriver.chrome.driver”。首先,我尝试:

System.setProperty("webdriver.chrome.driver", "drivers/Chrome/chromedriver.exe");
但是我得到了一个错误,它似乎是在位置
“C:\\drivers\Chrome\chromedriver.exe”
中寻找驱动程序。这里的工作目录实际上是存储源代码的目录

然后我试着:

System.setProperty("webdriver.chrome.driver", "/drivers/Chrome/chromedriver.exe");
然而,同样的事情发生了——这一次它在
“C:\drivers\Chrome\chromedriver.exe”
中查找


当使用“webdriver.chrome.driver”属性或任何其他配置方式时,如何让ChromeDriver在类路径上查找ChromeDriver二进制文件?

在我看来,它应该使用以下完整路径:

 System.SetProperty("webdriver.chrome.driver", @"D:/drivers/Chrome/chromedriver.exe");
 WebDriver driver = new ChromeDriver();              
 driver.get("http://www.google.com");

我希望这对你有帮助

最终,我发现
ChromeDriver
不支持对其二进制文件的类路径相对访问。但是,您可以将类路径相对字符串转换为系统路径,然后绕过系统属性直接加载它

URL url = this.getClass().getClassLoader().getResource(classpathRelativeLocation);
File file = new File(url.getFile()); // Strangely, URL.getFile does not return a File
ChromeDriverService.Builder bldr = (new ChromeDriverService.Builder())
                                   .usingDriverExecutable(file)
                                   .usingAnyFreePort();
ChromeDriver driver = new ChromeDriver(bldr.build());

如果你有司机
chromedriver.exe
在类路径上,您可以使用类加载器加载资源,然后获取资源的路径。该参数可以作为setProperty的第二个参数传入。例如,我将文件
chromedriver.exe
放在Java构建路径源文件夹
/src/main/resources

然后,我可以使用下面的代码从类路径中选择驱动程序

public class App 
{
private static final String CHROME_DRIVER_PATH=App.class.getClassLoader().getResource("chromedriver.exe").getPath(); 
    public static void main( String[] args ) throws InterruptedException
    {
        System.setProperty("webdriver.chrome.driver", CHROME_DRIVER_PATH);
        WebDriver driver=new ChromeDriver();
        Thread.sleep(2000);
        driver.close();        
    }
}

这是一个系统路径,不是类路径。不幸的是,
ChromeDriver(ChromeDriverService)
constructor在Selenium3中被弃用(到今天为止,它仍然有效,谁知道多长时间…)。考虑这个例子的“正确”用法: