运行Watir自动化脚本遇Browsing context has been discarded错误如何解决
错误原因分析
- 这个
Browsing context has been discarded属于NoSuchWindowError的子类,核心是WebDriver进程未能绑定到有效的Firefox浏览上下文,目标窗口在初始化或页面跳转阶段就被销毁 - 你用到的
headlessRuby gem是依赖Xvfb模拟显示输出的旧方案,高版本Firefox(94+)和Geckodriver(0.30+)已经原生支持无头模式,和旧Xvfb方案存在兼容性问题,这是你两种语言脚本都报错的核心原因
可行解决方案
方案1:替换为Firefox原生无头模式(推荐)
直接移除headless gem的依赖,修改代码为原生无头启动,示例代码:
require 'watir' # 配置Firefox启动参数 options = Selenium::WebDriver::Firefox::Options.new options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--start-maximized') browser = Watir::Browser.new :firefox, options: options browser.goto 'https://www.google.com' search_text = "Watir" # 增加显式等待避免元素未加载导致的后续错误 browser.text_field(name: "q").wait_until(&:present?).set search_text browser.button(name: "btnK").wait_until(&:present?).click
方案2:保留Xvfb方案的修复步骤
如果你必须使用旧的headless gem,按以下步骤排查:
- 先手动启动Xvfb服务并配置环境变量:
sudo Xvfb :99 -ac -screen 0 1920x1080x16 & export DISPLAY=:99 - 给geckodriver添加执行权限,并确认其路径在系统PATH中:
sudo chmod +x /path/to/your/geckodriver - 启动浏览器后加1-2秒的等待再执行goto操作,预留足够的上下文初始化时间:
require 'watir' require 'headless' headless = Headless.new headless.start browser = Watir::Browser.new :firefox sleep 2 browser.goto 'https://www.google.com'
内容的提问来源于stack exchange,提问作者Pritalgo
相关产品推荐
相关产品推荐

