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

Docker+Rspec+Cuprite运行Rails系统测试时出现空白页问题

Docker化Rails应用系统测试失败排查(Rspec + Cuprite)

我有一个基于Rails 5.2、Ruby 2.5.8的Docker化应用,目前运行正常,但使用Rspec和Cuprite执行系统测试时全部失败。我按照《System of a Test: Setting Up End-to-End Rails Testing》指南完成配置,运行测试套件后所有系统测试均未通过。

尝试运行简单测试(例如访问页面并检查文本是否存在),但始终失败。查看测试生成的截图,仅显示空白页;使用page.driver.pause调试Cuprite时也是同样的空白状态。我在控制器动作中添加了binding.pry,但完全未触发。

错误信息如下:

Failure/Error: expect(page).to have_text('Foo')
       expected to find text "Foo" in ""

相关配置文件

docker-compose.yml

rspec_system:
    build: .
    tty: true
    stdin_open: true
    depends_on:
      - db
      - chrome
    volumes:
      - .:/usr/src/app:cached
      - bundler:/usr/local/bundle:delegated
      - bootsnap_cache:/usr/src/bootsnap:delegated
      - rails_cache:/usr/src/app/tmp/cache:delegated
    environment:
      - DATABASE_URL=postgres://postgres:postgres@db:5432/
      - CHROME_URL=http://chrome:3333
    ports:
      - '3000:3000'

  chrome:
    image: barrenechea/browserless:latest
    ports:
      - "3333:3333"
    volumes:
      - .:/usr/src/app:cached
    environment:
      PORT: 3333
      CONNECTION_TIMEOUT: 600000

spec/support/cuprite_setup.rb

REMOTE_CHROME_URL = ENV["CHROME_URL"]
REMOTE_CHROME_HOST, REMOTE_CHROME_PORT =
  if REMOTE_CHROME_URL
    URI.parse(REMOTE_CHROME_URL).yield_self do |uri|
      [uri.host, uri.port]
    end
  end

# 检查远程Chrome是否运行并配置Capybara驱动
remote_chrome =
  begin
    if REMOTE_CHROME_URL.nil?
      false
    else
      Socket.tcp(REMOTE_CHROME_HOST, REMOTE_CHROME_PORT, connect_timeout: 1).close
      true
    end
  rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, SocketError
    false
  end

remote_options = remote_chrome ? {url: REMOTE_CHROME_URL} : {}

require "capybara/cuprite"

Capybara.register_driver(:better_cuprite) do |app|
  Capybara::Cuprite::Driver.new(
    app,
    **{
      window_size: [2560, 1440],
      browser_options: remote_chrome ? {"no-sandbox" => nil} : {},
      inspector: true
    }.merge(remote_options)
  )
end

Capybara.default_driver = Capybara.javascript_driver = :better_cuprite

RSpec系统测试相关配置

config.prepend_before(:each, type: :system) do
    driven_by Capybara.javascript_driver
  end
Capybara.server_host = "0.0.0.0"
Capybara.app_host = "http://#{ENV.fetch("APP_HOST", `hostname`.strip&.downcase || "0.0.0.0")}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:42:39