Mac环境下Selenium执行START命令不存在错误的解决咨询
我在Mac系统上用Eclipse运行Selenium WebDriver做自动化任务,需求是每次执行代码时先关掉之前打开的Chrome实例,再启动新的,保证同一时间只有一个Chrome实例运行。这段代码在Windows上没问题,但到Mac上就报错:
Cannot run program "START": error=2, No such file or directory
我的代码如下:
public class Demo { public static void main(String[] args){ System.setProperty("webdriver.chrome.driver", "/Users/Downloads/chromedriver/chromedriver"); WebDriver driver = new ChromeDriver(); driver.get("https://www.google.com/"); try{ Runtime.getRuntime().exec("START taskkill /F /IM chrome.exe"); System.exit(0); } catch(IOException io){ System.out.println(io.getMessage()); } } }
我试过用sudo open Eclipse.app/以管理员权限启动Eclipse,但还是报同样的错。请问在Mac/Unix环境下该怎么解决,或者要修改哪些代码?
解决方法
这问题很典型——你代码里用的START taskkill /F /IM chrome.exe是Windows专属的命令,Mac属于Unix-like系统,用的是完全不同的进程管理工具,自然找不到START和taskkill这些命令,所以才会报错。下面给你几个针对性的解决方案:
1. 替换Mac专属的进程终止命令
把Windows的taskkill换成Mac上的pkill或者killall命令,这两个是Unix系统终止进程的标准工具:
pkill chrome:终止所有名为chrome的进程killall Chrome:注意Mac上Chrome的进程名首字母是大写的C,这个命令也能清除所有Chrome相关进程
你只需要把代码里的Runtime.getRuntime().exec("START taskkill /F /IM chrome.exe");替换成下面二选一即可:
方案A:使用pkill
Runtime.getRuntime().exec("pkill chrome");
方案B:使用killall
Runtime.getRuntime().exec("killall Chrome");
2. 更优雅的跨平台关闭方式(强烈推荐)
其实完全不用调用系统命令来杀进程,Selenium本身就提供了专门的关闭方法,既跨平台又安全:
driver.quit():关闭所有关联的浏览器窗口,彻底销毁WebDriver实例,释放所有资源(比close()更彻底)driver.close():仅关闭当前焦点所在的浏览器窗口,若只有一个窗口则效果类似,但quit()更适合收尾
修改后的代码可以改成这样,不管在Windows还是Mac上都能正常运行:
public class Demo { public static void main(String[] args){ System.setProperty("webdriver.chrome.driver", "/Users/Downloads/chromedriver/chromedriver"); WebDriver driver = new ChromeDriver(); try { driver.get("https://www.google.com/"); // 这里添加你的自动化任务代码 } finally { // 不管任务成功失败,都确保关闭浏览器并释放资源 driver.quit(); System.exit(0); } } }
3. 实现"启动前关闭残留Chrome实例"的需求
如果你的场景是之前的代码执行异常导致Chrome进程残留,需要在启动新实例前先清理,那可以在初始化WebDriver之前先执行杀进程命令,比如:
public class Demo { public static void main(String[] args){ // 先清理残留的Chrome进程 try { Runtime.getRuntime().exec("pkill chrome"); // 给进程2秒时间完成关闭 Thread.sleep(2000); } catch (IOException | InterruptedException e) { e.printStackTrace(); } // 再启动新的Chrome实例 System.setProperty("webdriver.chrome.driver", "/Users/Downloads/chromedriver/chromedriver"); WebDriver driver = new ChromeDriver(); try { driver.get("https://www.google.com/"); // 你的自动化任务逻辑 } finally { driver.quit(); } } }
额外注意事项
- 用
pkill或killall时,如果你自己正在使用Chrome浏览器,这些命令会直接关闭你正在用的窗口,执行代码前记得关闭个人使用的Chrome - 如果你用的是Selenium 4.x及以上版本,其实可以不用手动设置
webdriver.chrome.driver系统属性,Selenium会自动匹配ChromeDriver,能省掉不少路径配置的麻烦
内容的提问来源于stack exchange,提问作者jumbo_siopao

