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

使用Capybara测试href为javascript:void(0)的Facebook弹窗失败问题

Capybara window_opened_by 测试Facebook弹窗失败的解决方案

问题重现

你遇到的情况是:使用Capybara的window_opened_by方法测试分享功能时,普通场景测试正常,但点击链接触发Facebook模态弹窗(而非新标签页)时,测试抛出错误:

Capybara::WindowError: block passed to #window_opened_by opened 0 windows instead of 1

相关代码如下:
视图文件 (view.html.erb)

<div class="col-xs-4 action-facebook" id="js-fbShareBtn">
  <a href="javascript:void(0)" title="Share on Facebook" target="_blank" rel="noreferrer">
    Share on facebook
  </a>
</div>

RSpec测试文件 (test.rb)

it "on deal page button SHARE works effectively", js: true do
  visit deal_page_path(deal_path)
  facebook_window = window_opened_by do
    click_link 'Share on Facebook'
  end
  within_window facebook_window do
    expect(page).to have_css("html#facebook")
  end
end

激活弹窗的JavaScript

function activateFbShareBtn() {
  $fbShareBtn.on('click', function(e) {
    FB.ui({
      method: 'share',
      mobile_iframe: true,
      display: 'popup',
      href: gon.deal_actual_url,
    }, function(response){});
  });
}

排查过程

一开始你可能会误以为是href="javascript:void(0)"导致的问题——把它改成标准链接(比如https://www.example.com)后,WindowError确实消失了,但测试还是因为页面内容不符而失败。实际上这个方向是错的,真正的问题出在RSpec的配置上。

解决方案

问题的根源是RSpec没有将Facebook SDK的链接加入白名单,导致Capybara无法正确加载SDK,进而无法触发预期的弹窗行为。你只需要在RSpec的配置文件中添加以下代码,允许Facebook SDK的URL:

config.allow_url("https://connect.facebook.net/en_US/sdk.js")

添加这个配置后,测试就能正常识别Facebook模态弹窗,window_opened_by也能正确捕获到对应的窗口了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:49:06