Rspec Javascript 无头测试 chrome Github 操作失败

Rspec failed for Javascript tests headless chrome on Github actions

我正在对 运行 Rspec 测试使用 Github 操作,这些测试有很多功能测试,但 javascript 很少。所有其他测试均通过,但 Javascript 一个测试失败。有没有办法 运行 rspec capaybara 测试 javascript 使用 github 动作。 以下是我的水豚助手配置

Capybara.server = :puma, { Silent: true }

Capybara.register_driver :chrome_headless do |app|
  options = ::Selenium::WebDriver::Chrome::Options.new

  options.add_argument('--headless')
  options.add_argument('--no-sandbox')
  options.add_argument('--window-size=1400,1400')

  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

Capybara.javascript_driver = :chrome_headless

# Setup rspec
RSpec.configure do |config|
  #config.before(:each, type: :system) do
  #  driven_by :rack_test
  #end

  config.before(:each, type: :system, js: true) do
    driven_by :chrome_headless
  end
end

我遇到 Javascript 测试错误

2) Visitor signs up with valid email and password
     Failure/Error: width = page.evaluate_script("$('#LeftNavPaneContent').width();")
     Capybara::NotSupportedByDriverError:
       Capybara::Driver::Base#evaluate_script
     # ./spec/features/javascript/navigation_toggle_spec.rb:12:in `block (2 levels) in <top (required)>'
  3) Login and out it should redirect to the dashboard and allow you to log out
     Failure/Error: page.driver.browser.navigate.refresh
     NoMethodError:
       undefined method `navigate' for #<Capybara::RackTest::Browser:0x00005589b2afd070>
     # ./spec/features/login_logout/login_spec.rb:15:in `block (2 levels) in <top (required)>'

以下是我的 chromedriver 操作文件

run:  |
  sudo apt-get -yqq install libpq-dev
  sudo apt-get install google-chrome-stable
.
.
.
  run: |
   export DISPLAY=:99
   chromedriver --url-base=/wd/hut &
   sudo Xvfb -ac :99 -screen 0 1280/1024/24 > /dev/null 2>&1 & # optional
   bundle exec rspec

这些测试在本地通过并且没有问题。我认为这是因为这些在测试中有 Javascripts 我正在使用 js: true 但它似乎无法正常工作。任何帮助

我在我的 rails_helper 中使用了以下配置并且有效。

Capybara.register_driver :headless_chrome do |app|
  capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
      chromeOptions: { args: %w[--headless --disable-gpu] },
      'goog:loggingPrefs': {
          browser: 'ALL'
      }
    )

  options = ::Selenium::WebDriver::Chrome::Options.new

  options.add_argument('--headless')
  options.add_argument('--no-sandbox')
  options.add_argument('--window-size=1400,1400')

  Capybara::Selenium::Driver.new(
      app,
      browser: :chrome,
      desired_capabilities: capabilities,
      options: options
    )
end

Capybara.default_driver = :headless_chrome