You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Cuprite切换标签页断言内容时遇_cuprite未定义错误怎么办?

解决Cuprite切换新窗口时_cuprite is not defined错误

问题背景

使用cuprite 0.13、Capybara 3.53.3、Rspec 3.11编写测试,点击带target="_blank"的链接后,通过within_window切换到新窗口断言内容时,抛出Ferrum::JavaScriptError (ReferenceError: _cuprite is not defined)错误,手动调用switch_to_window也会触发相同问题。

解决方案

1. 升级Cuprite版本(推荐)

该错误是cuprite 0.13版本的已知缺陷,后续版本(0.14及以上)已修复。更新Gemfile中的cuprite版本:

gem 'cuprite', '>= 0.14'

执行bundle update cuprite完成升级后,原有测试代码即可正常运行。

2. 临时注入_cuprite全局对象(无法升级时使用)

如果暂时无法升级版本,可在切换到新窗口后手动注入Cuprite所需的全局对象,让Capybara的断言操作正常执行:

new_window = page.window_opened_by do
  click_on "Link with target blank"
end

within_window(new_window) do
  # 手动注入_cuprite核心对象
  page.driver.browser.execute_script <<~JS
    window._cuprite = {
      send: () => {},
      receive: () => {},
      callbacks: new Map(),
      uuid: () => Math.random().toString(36).slice(2)
    };
  JS
  expect(page).to have_text("Some text")
end

3. 直接使用Ferrum原生API操作新窗口

绕过Capybara的窗口封装,直接调用Ferrum的窗口方法进行操作和断言:

original_window = page.driver.browser.current_window
click_on "Link with target blank"

# 获取新窗口(假设是最后打开的窗口)
new_window = page.driver.browser.windows.last
page.driver.browser.switch_to_window(new_window)

# 直接通过窗口对象获取内容断言
expect(new_window.body).to include("Some text")

# 切回原窗口
page.driver.browser.switch_to_window(original_window)

内容的提问来源于stack exchange,提问作者Max Paprikas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:06:26