Skip to content

theodorton/capybara-rack_test-screenshot

Repository files navigation

Gem Version

Generate screenshots with RackTest

Makes save_screenshot behave as if you were using a regular browser when using rack as your Capybara driver.

Will by default render pages in a 1400x1400 viewport.

Generates screenshots using playwright-ruby-client.

Very useful for showing screenshots on failed examples like this:

RSpec.configure do |config|
  config.after(:each) do |example|
    if example.exception
      path = save_screenshot
      puts "Screenshot at #{path}"
    end
  end
end

Also makes failing Rails System tests behave the same between rack and JS drivers.

Installation

Install the gem and add to the application's Gemfile by executing:

$ bundle add capybara-rack_test-screenshot --group test

If bundler is not being used to manage dependencies, install the gem by executing:

$ gem install capybara-rack_test-screenshot

Configuration

You'll need to configure Capybara.asset_host in order for Playwright to render the page properly. This should point to a running development server of your application.

Capybara.asset_host = "http://localhost:3000"

Optional settings:

Capybara::RackTest::Screenshot.viewport = { width: 1920, height: 1080 }

Capybara::RackTest::Screenshot.default_viewport = { width: 1920, height: 1080 }
# See Viewports below for details

In some cases, it might make sense to preload the playwright browser used for screenshots:

Capybara::RackTest::Screenshot.preload!

You can override the path to the playwright binary by setting PLAYWRIGHT_CLI_EXE_PATH. By default the gem will call npx playwright.

Usage

Then use save_screenshot in your tests as if you were using any JS enabled driver.

example "my browser test" do
  page.visit "http://example.com"
  page.save_screenshot
end

Viewports

In some cases, you might have different viewports for different tests.

If you have some default viewport you'd prefer to use, configure that with default_viewport and set viewport close to where you declare the viewport for your driver. Before (or after) each test, call Capybara::RackTest::Screenshot.reset_viewport! to revert to the default.

Capybara::RackTest::Screenshot.default_viewport = { width: 1920, height: 1080 }

RSpec.configure do |config|
  config.before(:each, type: :system, mobile: true) do
    driven_by :rack, options: { viewport: { width: 375, height: 812 } }
    Capybara::RackTest::Screenshot.viewport = { width: 375, height: 812 }
  end

  config.after(:each) do
    Capybara::RackTest::Screenshot.reset_viewport!
  end
end

Development

After checking out the repo, run bin/setup to install dependencies. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/theodorton/capybara-rack_test-screenshot. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.

License

The gem is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the Capybara::RackTest::Screenshot project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.