You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基础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

火山引擎 最新活动