Linux下Selenium+Geckodriver运行Java自动化测试报错求助
Linux下Java-Selenium无法加载Geckodriver连接Firefox的问题
环境配置
- 操作系统:Fedora Linux 36(Workstation Edition)x86_64
- Firefox版本:106.0.1(64位),路径验证命令:
文件存在验证:[bans@bans-note ~]$ which firefox /usr/bin/firefox
浏览器可正常启动:[bans@bans-note ~]$ ls /usr/bin |grep firefox firefox[bans@bans-note bin]$ ./firefox
Driver初始化代码片段
case "linux_firefox":{ System.setProperty("webdriver.gecko.driver", PATH_LINUX_FIREFOX_DRIVER); System.setProperty("webdriver.firefox.bin", PATH_LINUX_FIREFOX); FirefoxOptions firefoxOptions = new FirefoxOptions(); firefoxOptions.addArguments("--headless"); firefoxOptions.addArguments("--no-sandbox"); driver = new FirefoxDriver(); break; }
注:PATH_LINUX_FIREFOX_DRIVER和PATH_LINUX_FIREFOX均指向已确认存在的对应文件路径
报错信息
java.lang.IllegalStateException: Specified firefox binary location does not exist or is not a real file: /usr/bin/firefox at com.google.common.base.Preconditions.checkState(Preconditions.java:504) at org.openqa.selenium.firefox.Executable.<init>(Executable.java:43) at org.openqa.selenium.firefox.FirefoxBinary.<init>(FirefoxBinary.java:123) at common.CommonActions.createDriver(CommonActions.java:65) at tests.base.BaseTest.<init>(BaseTest.java:15) at tests.TestLogin.positive.LoginTest.<init>(LoginTest.java:12) at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483) at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217) at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) Process finished with exit code 255
已尝试无效的方案
- 修改Driver初始化代码,改用
FirefoxBinary和DesiredCapabilities配置 - 重新安装Firefox
- 安装Firefox snap版本
解决方案
1. 确认Firefox真实二进制路径
Fedora下/usr/bin/firefox通常是软链接,并非真实二进制文件。执行以下命令查看真实路径:
ls -l /usr/bin/firefox
示例输出:lrwxrwxrwx. 1 root root 29 Oct 12 09:45 /usr/bin/firefox -> /usr/lib64/firefox/firefox,此时真实路径为/usr/lib64/firefox/firefox。
2. 调整初始化代码,指定真实路径
统一使用FirefoxOptions配置,避免混用系统属性,同时添加Linux下常见的参数:
case "linux_firefox":{ System.setProperty("webdriver.gecko.driver", PATH_LINUX_FIREFOX_DRIVER); FirefoxOptions firefoxOptions = new FirefoxOptions(); // 替换为上一步获取的真实Firefox二进制路径 firefoxOptions.setBinary("/usr/lib64/firefox/firefox"); firefoxOptions.addArguments("--headless"); firefoxOptions.addArguments("--no-sandbox"); firefoxOptions.addArguments("--disable-dev-shm-usage"); // 解决共享内存不足问题 driver = new FirefoxDriver(firefoxOptions); break; }
3. 验证权限
确保运行测试的用户对Geckodriver和Firefox二进制文件有执行权限:
chmod +x PATH_LINUX_FIREFOX_DRIVER chmod +x /usr/lib64/firefox/firefox
4. 检查Geckodriver版本兼容性
Firefox 106需要搭配Geckodriver 0.31.0及以上版本,如果版本不匹配,下载对应版本替换即可。
内容的提问来源于stack exchange,提问作者bans
相关产品推荐
相关产品推荐

