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

How do I load the ChromeDriver binary from the classpath?

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

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

System.setProperty("webdriver.chrome.driver", "drivers/Chrome/chromedriver.exe");

但是我得到了一个错误,它似乎在寻找 "C:\<working directory of my application process>\drivers\Chrome\chromedriver.exe" 位置的驱动程序。这里的工作目录其实就是我的源码所在的目录。

然后我尝试了:

System.setProperty("webdriver.chrome.driver", "/drivers/Chrome/chromedriver.exe");

然而同样的事情发生了 - 这次它正在寻找 "C:\drivers\Chrome\chromedriver.exe"

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

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

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

希望对您有所帮助!

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

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();        
    }
}