使用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
相关产品推荐
相关产品推荐

