树莓派Zero 2运行Selenium JAR脚本遇NoSuchDriverException错误求助
树莓派Zero 2运行Java Selenium JAR脚本报错排查与解决
问题场景
在树莓派Zero 2上运行打包为JAR的Selenium Java脚本时出现错误,脚本在Windows环境修改路径后可正常运行,树莓派已安装匹配版本的chromium-chromedriver和OpenJDK,直接执行chromedriver无异常。
错误日志
Exception in thread "main" org.openqa.selenium.remote.NoSuchDriverException: Unable to obtain: Capabilities {browserName: chrome, goog:chromeOptions: {args: [--headless=new], binary: /usr/bin/chromedriver, extensions: []}}, error Command failed with code: 2, executed: [--browser, chrome, --language-binding, java, --output, json, --browser-path, /usr/bin/chromedriver] /tmp/selenium-manager12749831998940039089/manager/0.4.18/selenium-manager: 1: Syntax error: "(" unexpected at org.openqa.selenium.remote.service.DriverFinder.getPath(DriverFinder.java:48) at org.openqa.selenium.remote.service.DriverFinder.getPath(DriverFinder.java:33) at org.openqa.selenium.chrome.ChromeDriver.generateExecutor(ChromeDriver.java:99) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:89) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:84) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:73) at chess.Main.main(Main.java:13) Caused by: org.openqa.selenium.WebDriverException: Command failed with code: 2, executed: [--browser, chrome, --language-binding, java, --output, json, --browser-path, /usr/bin/chromedriver] /tmp/selenium-manager12749831998940039089/manager/0.4.18/selenium-manager: 1: Syntax error: "(" unexpected at org.openqa.selenium.manager.SeleniumManager.runCommand(SeleniumManager.java:159) at org.openqa.selenium.manager.SeleniumManager.getDriverPath(SeleniumManager.java:303) at org.openqa.selenium.remote.service.DriverFinder.getPath(DriverFinder.java:45) ... 6 more Caused by: org.openqa.selenium.json.JsonException: Unable to parse: /tmp/selenium-manager12749831998940039089/manager/0.4.18/selenium-manager: 1: Syntax error: "(" unexpected at org.openqa.selenium.json.Json.toType(Json.java:169) at org.openqa.selenium.json.Json.toType(Json.java:152) at org.openqa.selenium.manager.SeleniumManager.runCommand(SeleniumManager.java:144) ... 8 more Caused by: org.openqa.selenium.json.JsonException: Unable to determine type from: /. Last 1 characters read: /, next 106 characters to read: tmp/selenium-manager12749831998940039089/manager/0.4.18/selenium-manager: 1: Syntax error: "(" unexpected Build info: version: '4.18.1', revision: 'b1d3319b48' System info: os.name: 'Linux', os.arch: 'arm', os.version: '6.1.21-v7+', java.version: '11.0.22' Driver info: driver.version: ChromeDriver at org.openqa.selenium.json.JsonInput.peek(JsonInput.java:166) at org.openqa.selenium.json.JsonTypeCoercer.lambda$buildCoercer$6(JsonTypeCoercer.java:167) at org.openqa.selenium.json.JsonTypeCoercer.coerce(JsonTypeCoercer.java:146) at org.openqa.selenium.json.Json.toType(Json.java:206) at org.openqa.selenium.json.Json.toType(Json.java:167)
运行脚本
package chess; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; public class Main { public static void main(String args[]) { ChromeOptions c = new ChromeOptions(); c.setBinary("/usr/bin/chromedriver"); c.addArguments("--headless=new"); WebDriver chess = new ChromeDriver(c); chess.get("https://chess.com"); System.out.print(chess.getTitle()); } }
环境说明
- 树莓派Zero 2,系统版本
Linux 6.1.21-v7+ - 已通过
sudo apt install chromium-chromedriver安装驱动,驱动路径/usr/bin/chromedriver,直接运行驱动无异常 - 已安装最新OpenJDK 11
- 脚本在Windows Eclipse中用Maven打包为包含所有依赖的胖JAR,运行命令
java -cp ch9.jar chess.Main
解决步骤
1. 修正ChromeOptions的setBinary参数
当前错误地将setBinary指向了chromedriver的路径,这个方法应该设置浏览器程序的路径,而非驱动程序。树莓派上Chromium浏览器的默认路径通常是/usr/bin/chromium-browser,修改代码:
ChromeOptions c = new ChromeOptions(); // 替换为浏览器路径,而非驱动路径 c.setBinary("/usr/bin/chromium-browser"); c.addArguments("--headless=new");
2. 禁用Selenium自动管理驱动
错误日志显示Selenium Manager下载的二进制文件在ARM架构的树莓派上无法运行,出现语法错误。由于已手动安装匹配版本的chromedriver,可通过以下方式禁用自动管理:
方法一:设置驱动路径系统属性
在初始化ChromeDriver前添加:
System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
方法二:禁用Selenium Manager
运行命令时添加参数:
java -Dwebdriver.chrome.driver=/usr/bin/chromedriver -Dselenium-manager.disable=true -cp ch9.jar chess.Main
或在代码中设置:
System.setProperty("selenium-manager.disable", "true"); System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
3. 验证依赖适配ARM架构
在Windows(x86架构)打包的胖JAR可能包含x86架构的二进制依赖,导致在ARM架构的树莓派上无法运行。建议:
- 在树莓派本地编译打包项目,确保所有依赖适配ARM架构
- 或在Maven打包时指定ARM架构的依赖,排除x86版本
4. 补充headless稳定性参数(可选)
针对树莓派的headless模式,可添加额外参数提升稳定性:
c.addArguments("--disable-gpu"); c.addArguments("--no-sandbox"); c.addArguments("--disable-dev-shm-usage");
内容的提问来源于stack exchange,提问作者Wesley Droll
相关产品推荐
相关产品推荐

