基础Selenium WebDriver‘Hello World’程序运行失败求助
我之前在Ubuntu环境下也碰到过一模一样的问题,给你几个排查和解决的步骤:
首先,你遇到的DevToolsActivePort file doesn't exist错误,本质是Chrome浏览器启动失败,Selenium的ChromeDriver无法和它建立连接。结合你的VNC环境,主要有几个常见原因和对应解决方法:
1. 确认ChromeDriver与Chrome版本匹配
ChromeDriver和Chrome的版本必须严格对应,你的ChromeDriver是2.41,它只支持Chrome 67-69版本。如果你的Ubuntu上安装的是更新的Chrome稳定版,版本不匹配就会直接导致启动失败。
- 检查当前Chrome版本:
google-chrome --version - 检查ChromeDriver版本:
chromedriver --version
如果版本不匹配,要么下载对应Chrome版本的ChromeDriver,要么升级ChromeDriver到和当前Chrome匹配的版本(比如Chrome 110+对应ChromeDriver 110+)。
2. 添加Chrome启动参数解决环境限制
Ubuntu环境下,Chrome运行需要绕过一些系统限制,同时要关联到VNC的桌面显示。修改你的代码,添加必要的启动参数:
require "selenium-webdriver" options = Selenium::WebDriver::Chrome::Options.new # 解决Ubuntu下普通用户无法运行Chrome沙箱的问题 options.add_argument('--no-sandbox') # 避免/dev/shm共享内存不足导致Chrome崩溃 options.add_argument('--disable-dev-shm-usage') # 指定远程调试端口,解决DevToolsActivePort不存在的问题 options.add_argument('--remote-debugging-port=9222') # 关联VNC的DISPLAY环境变量,让Chrome在VNC桌面中启动 options.add_argument("--display=:#{ENV['DISPLAY']}") driver = Selenium::WebDriver.for :chrome, options: options driver.navigate.to "http://www.google.com" element = driver.find_element(:name, 'q') element.send_keys "Hello Selenium WebDriver!" element.submit puts driver.title driver.quit # 记得退出driver,避免残留进程
每个参数的作用:
--no-sandbox:Ubuntu默认的安全沙箱会阻止普通用户启动Chrome,必须关闭--disable-dev-shm-usage:Ubuntu的/dev/shm分区默认较小,Chrome运行时会占用大量内存,禁用这个选项让Chrome使用临时文件代替--remote-debugging-port:强制指定调试端口,确保ChromeDriver能找到DevTools的连接端口--display=:#{ENV['DISPLAY']}:让Chrome在VNC的桌面窗口中启动,这样你就能在VNC里看到Chrome窗口了
3. 确保VNC环境变量正确设置
在运行你的Ruby程序前,要确保当前终端的DISPLAY变量和VNC的显示端口一致:
- 在VNC打开的终端里执行:
echo $DISPLAY
通常输出是:1或者:0,如果程序不是在VNC终端里运行的,需要手动设置环境变量:
export DISPLAY=:1 ruby your_script.rb
4. 检查VNC桌面环境配置
如果VNC的桌面环境没有正确启动,Chrome也无法正常显示。检查~/.vnc/xstartup文件,确保里面有启动桌面环境的命令,比如:
#!/bin/sh xrdb $HOME/.Xresources startxfce4 & # 如果你用的是Xfce桌面,或者换成你安装的桌面环境
修改后重启VNC服务:
vncserver -kill :1 vncserver :1
关于你的疑问:Selenium是否应在VNC中启动可见Chrome?
当然可以!只要配置正确,Selenium完全可以在VNC的桌面环境中启动可见的Chrome窗口。你的问题就是因为Chrome启动时没有关联到VNC的显示,加上缺少必要的启动参数,导致Chrome异常退出,所以你在VNC里看不到窗口。
内容的提问来源于stack exchange,提问作者heebee313




